{
  "version": 3,
  "sources": ["../src/helpers.ts", "../src/config.ts", "../src/sysinfo.ts", "../tfjs/tf-browser.ts", "../src/tfjs/backend.ts", "../src/blazeface/box.ts", "../src/blazeface/util.ts", "../src/blazeface/blazeface.ts", "../src/blazeface/coords.ts", "../src/blazeface/facepipeline.ts", "../src/blazeface/facemesh.ts", "../src/faceres/faceres.ts", "../src/emotion/emotion.ts", "../src/posenet/keypoints.ts", "../src/posenet/utils.ts", "../src/posenet/poses.ts", "../src/posenet/posenet.ts", "../src/handpose/box.ts", "../src/handpose/anchors.ts", "../src/handpose/handdetector.ts", "../src/handpose/util.ts", "../src/handpose/handpipeline.ts", "../src/handpose/handpose.ts", "../src/blazepose/annotations.ts", "../src/blazepose/blazepose.ts", "../src/efficientpose/efficientpose.ts", "../src/movenet/movenet.ts", "../src/object/labels.ts", "../src/object/nanodet.ts", "../src/object/centernet.ts", "../src/image/imagefx.js", "../src/image/image.ts", "../src/segmentation/segmentation.ts", "../src/models.ts", "../src/face.ts", "../src/gesture/gesture.ts", "../src/draw/draw.ts", "../src/persons.ts", "../src/interpolate.ts", "../src/sample.ts", "../src/human.ts"],
  "sourcesContent": ["/**\n * Simple helper functions used accross codebase\n */\n\n// helper function: join two paths\nexport function join(folder: string, file: string): string {\n  const separator = folder.endsWith('/') ? '' : '/';\n  const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n  const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n  if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`);\n  return path;\n}\n\n// helper function: wrapper around console output\nexport function log(...msg): void {\n  const dt = new Date();\n  const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n  // eslint-disable-next-line no-console\n  if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n  if (typeof performance !== 'undefined') return performance.now();\n  return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides\nexport function mergeDeep(...objects) {\n  const isObject = (obj) => obj && typeof obj === 'object';\n  return objects.reduce((prev, obj) => {\n    Object.keys(obj || {}).forEach((key) => {\n      const pVal = prev[key];\n      const oVal = obj[key];\n      if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n      else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n      else prev[key] = oVal;\n    });\n    return prev;\n  }, {});\n}\n\n// helper function: return min and max from input array\nexport const minmax = (data) => data.reduce((acc, val) => {\n  acc[0] = (acc[0] === undefined || val < acc[0]) ? val : acc[0];\n  acc[1] = (acc[1] === undefined || val > acc[1]) ? val : acc[1];\n  return acc;\n}, []);\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n * @typedef Config\n */\nexport interface Config {\n  /** Backend used for TFJS operations */\n  backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow',\n\n  /** Path to *.wasm files if backend is set to `wasm` */\n  wasmPath: string,\n\n  /** Print debug statements to console */\n  debug: boolean,\n\n  /** Perform model loading and inference concurrently or sequentially */\n  async: boolean,\n\n  /** What to use for `human.warmup()`\n   * - warmup pre-initializes all models for faster inference but can take significant time on startup\n   * - only used for `webgl` and `humangl` backends\n  */\n  warmup: 'none' | 'face' | 'full' | 'body',\n\n  /** Base model path (typically starting with file://, http:// or https://) for all models\n   * - individual modelPath values are relative to this path\n  */\n  modelBasePath: string,\n\n  /** Cache sensitivity\n   * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n   * - set to 0 to disable caching\n  */\n  cacheSensitivity: number;\n\n  /** Cache sensitivity\n   * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n   * - set to 0 to disable caching\n  */\n  skipFrame: boolean;\n\n  /** Run input through image filters before inference\n   * - image filters run with near-zero latency as they are executed on the GPU\n  */\n  filter: {\n    enabled: boolean,\n    /** Resize input width\n    * - if both width and height are set to 0, there is no resizing\n    * - if just one is set, second one is scaled automatically\n    * - if both are set, values are used as-is\n    */\n    width: number,\n    /** Resize input height\n    * - if both width and height are set to 0, there is no resizing\n    * - if just one is set, second one is scaled automatically\n    * - if both are set, values are used as-is\n    */\n    height: number,\n    /** Return processed canvas imagedata in result */\n    return: boolean,\n    /** Flip input as mirror image */\n    flip: boolean,\n    /** Range: -1 (darken) to 1 (lighten) */\n    brightness: number,\n    /** Range: -1 (reduce contrast) to 1 (increase contrast) */\n    contrast: number,\n    /** Range: 0 (no sharpening) to 1 (maximum sharpening) */\n    sharpness: number,\n    /** Range: 0 (no blur) to N (blur radius in pixels) */\n    blur: number\n    /** Range: -1 (reduce saturation) to 1 (increase saturation) */\n    saturation: number,\n    /** Range: 0 (no change) to 360 (hue rotation in degrees) */\n    hue: number,\n    /** Image negative */\n    negative: boolean,\n    /** Image sepia colors */\n    sepia: boolean,\n    /** Image vintage colors */\n    vintage: boolean,\n    /** Image kodachrome colors */\n    kodachrome: boolean,\n    /** Image technicolor colors */\n    technicolor: boolean,\n    /** Image polaroid camera effect */\n    polaroid: boolean,\n    /** Range: 0 (no pixelate) to N (number of pixels to pixelate) */\n    pixelate: number,\n  },\n  // type definition end\n\n  /** Controlls gesture detection */\n  gesture: {\n    enabled: boolean,\n  },\n\n  /** Controlls and configures all face-specific options:\n   * - face detection, face mesh detection, age, gender, emotion detection and face description\n   * Parameters:\n   * - enabled: true/false\n   * - modelPath: path for each of face models\n   * - minConfidence: threshold for discarding a prediction\n   * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n   * - maxDetected: maximum number of faces detected in the input, should be set to the minimum number for performance\n   * - rotation: use calculated rotated face image or just box with rotation as-is, false means higher performance, but incorrect mesh mapping on higher face angles\n   * - return: return extracted face as tensor for futher user processing, in which case user is reponsible for manually disposing the tensor\n  */\n  face: {\n    enabled: boolean,\n    detector: {\n      modelPath: string,\n      rotation: boolean,\n      maxDetected: number,\n      skipFrames: number,\n      minConfidence: number,\n      iouThreshold: number,\n      return: boolean,\n    },\n    mesh: {\n      enabled: boolean,\n      modelPath: string,\n    },\n    iris: {\n      enabled: boolean,\n      modelPath: string,\n    },\n    description: {\n      enabled: boolean,\n      modelPath: string,\n      skipFrames: number,\n      minConfidence: number,\n    },\n    emotion: {\n      enabled: boolean,\n      minConfidence: number,\n      skipFrames: number,\n      modelPath: string,\n    },\n  },\n\n  /** Controlls and configures all body detection specific options\n   * - enabled: true/false\n   * - modelPath: body pose model, can be absolute path or relative to modelBasePath\n   * - minConfidence: threshold for discarding a prediction\n   * - maxDetected: maximum number of people detected in the input, should be set to the minimum number for performance\n  */\n  body: {\n    enabled: boolean,\n    modelPath: string,\n    maxDetected: number,\n    minConfidence: number,\n    skipFrames: number,\n  },\n\n  /** Controlls and configures all hand detection specific options\n   * - enabled: true/false\n   * - landmarks: detect hand landmarks or just hand boundary box\n   * - modelPath: paths for hand detector and hand skeleton models, can be absolute path or relative to modelBasePath\n   * - minConfidence: threshold for discarding a prediction\n   * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n   * - maxDetected: maximum number of hands detected in the input, should be set to the minimum number for performance\n   * - rotation: use best-guess rotated hand image or just box with rotation as-is, false means higher performance, but incorrect finger mapping if hand is inverted\n  */\n  hand: {\n    enabled: boolean,\n    rotation: boolean,\n    skipFrames: number,\n    minConfidence: number,\n    iouThreshold: number,\n    maxDetected: number,\n    landmarks: boolean,\n    detector: {\n      modelPath: string,\n    },\n    skeleton: {\n      modelPath: string,\n    },\n  },\n\n  /** Controlls and configures all object detection specific options\n   * - enabled: true/false\n   * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n   * - minConfidence: minimum score that detection must have to return as valid object\n   * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n   * - maxDetected: maximum number of detections to return\n  */\n  object: {\n    enabled: boolean,\n    modelPath: string,\n    minConfidence: number,\n    iouThreshold: number,\n    maxDetected: number,\n    skipFrames: number,\n  },\n\n  /** Controlls and configures all body segmentation module\n   * removes background from input containing person\n   * if segmentation is enabled it will run as preprocessing task before any other model\n   * alternatively leave it disabled and use it on-demand using human.segmentation method which can\n   * remove background or replace it with user-provided background\n   *\n   * - enabled: true/false\n   * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n  */\n  segmentation: {\n    enabled: boolean,\n    modelPath: string,\n  },\n}\n\nconst config: Config = {\n  backend: 'webgl',          // select tfjs backend to use, leave empty to use default backend\n                             // can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl\n  modelBasePath: '../models/', // base path for all models\n  wasmPath: '../node_modules/@tensorflow/tfjs-backend-wasm/dist/', // path for wasm binaries, only used for backend: wasm\n  debug: true,               // print additional status messages to console\n  async: true,               // execute enabled models in parallel\n  warmup: 'full',            // what to use for human.warmup(), can be 'none', 'face', 'full'\n                             // warmup pre-initializes all models for faster inference but can take\n                             // significant time on startup\n                             // only used for `webgl` and `humangl` backends\n  cacheSensitivity: 0.75,    // cache sensitivity\n                             // values 0..1 where 0.01 means reset cache if input changed more than 1%\n                             // set to 0 to disable caching\n  skipFrame: false,          // internal & dynamic\n  filter: {                  // run input through image filters before inference\n                             // image filters run with near-zero latency as they are executed on the GPU\n    enabled: true,           // enable image pre-processing filters\n    width: 0,                // resize input width\n    height: 0,               // resize input height\n                             // if both width and height are set to 0, there is no resizing\n                             // if just one is set, second one is scaled automatically\n                             // if both are set, values are used as-is\n    flip: false,             // flip input as mirror image\n    return: true,            // return processed canvas imagedata in result\n    brightness: 0,           // range: -1 (darken) to 1 (lighten)\n    contrast: 0,             // range: -1 (reduce contrast) to 1 (increase contrast)\n    sharpness: 0,            // range: 0 (no sharpening) to 1 (maximum sharpening)\n    blur: 0,                 // range: 0 (no blur) to N (blur radius in pixels)\n    saturation: 0,           // range: -1 (reduce saturation) to 1 (increase saturation)\n    hue: 0,                  // range: 0 (no change) to 360 (hue rotation in degrees)\n    negative: false,         // image negative\n    sepia: false,            // image sepia colors\n    vintage: false,          // image vintage colors\n    kodachrome: false,       // image kodachrome colors\n    technicolor: false,      // image technicolor colors\n    polaroid: false,         // image polaroid camera effect\n    pixelate: 0,             // range: 0 (no pixelate) to N (number of pixels to pixelate)\n  },\n\n  gesture: {\n    enabled: true,           // enable gesture recognition based on model results\n  },\n\n  face: {\n    enabled: true,           // controls if specified modul is enabled\n                             // face.enabled is required for all face models:\n                             // detector, mesh, iris, age, gender, emotion\n                             // (note: module is not loaded until it is required)\n    detector: {\n      modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n      rotation: true,        // use best-guess rotated face image or just box with rotation as-is\n                             // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n                             // this parameter is not valid in nodejs\n      maxDetected: 15,       // maximum number of faces detected in the input\n                             // should be set to the minimum number for performance\n      skipFrames: 15,        // how many max frames to go without re-running the face bounding box detector\n                             // only used when cacheSensitivity is not zero\n                             // e.g., if model is running st 25 FPS, we can re-use existing bounding\n                             // box for updated face analysis as the head probably hasn't moved much\n                             // in short time (10 * 1/25 = 0.25 sec)\n      minConfidence: 0.2,    // threshold for discarding a prediction\n      iouThreshold: 0.1,     // ammount of overlap between two detected objects before one object is removed\n      return: false,         // return extracted face as tensor\n                              // in which case user is reponsible for disposing the tensor\n    },\n\n    mesh: {\n      enabled: true,\n      modelPath: 'facemesh.json',  // facemesh model, can be absolute path or relative to modelBasePath\n    },\n\n    iris: {\n      enabled: true,\n      modelPath: 'iris.json',  // face iris model\n                             // can be either absolute path or relative to modelBasePath\n    },\n\n    description: {\n      enabled: true,         // to improve accuracy of face description extraction it is\n                             // recommended to enable detector.rotation and mesh.enabled\n      modelPath: 'faceres.json',  // face description model\n                             // can be either absolute path or relative to modelBasePath\n      skipFrames: 11,        // how many max frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n      minConfidence: 0.1,    // threshold for discarding a prediction\n    },\n\n    emotion: {\n      enabled: true,\n      minConfidence: 0.1,    // threshold for discarding a prediction\n      skipFrames: 17,        // how max many frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n      modelPath: 'emotion.json',  // face emotion model, can be absolute path or relative to modelBasePath\n    },\n  },\n\n  body: {\n    enabled: true,\n    modelPath: 'movenet-lightning.json',  // body model, can be absolute path or relative to modelBasePath\n                             // can be 'posenet', 'blazepose', 'efficientpose', 'movenet-lightning', 'movenet-thunder'\n    maxDetected: 1,          // maximum number of people detected in the input\n                             // should be set to the minimum number for performance\n                             // only valid for posenet as other models detects single pose\n    minConfidence: 0.2,      // threshold for discarding a prediction\n    skipFrames: 1,           // how many max frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n},\n\n  hand: {\n    enabled: true,\n    rotation: true,          // use best-guess rotated hand image or just box with rotation as-is\n                             // false means higher performance, but incorrect finger mapping if hand is inverted\n    skipFrames: 18,          // how many max frames to go without re-running the hand bounding box detector\n                             // only used when cacheSensitivity is not zero\n                             // e.g., if model is running st 25 FPS, we can re-use existing bounding\n                             // box for updated hand skeleton analysis as the hand probably\n                             // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n    minConfidence: 0.1,      // threshold for discarding a prediction\n    iouThreshold: 0.1,       // ammount of overlap between two detected objects before one object is removed\n    maxDetected: 2,          // maximum number of hands detected in the input\n                             // should be set to the minimum number for performance\n    landmarks: true,         // detect hand landmarks or just hand boundary box\n    detector: {\n      modelPath: 'handdetect.json',  // hand detector model, can be absolute path or relative to modelBasePath\n    },\n    skeleton: {\n      modelPath: 'handskeleton.json',  // hand skeleton model, can be absolute path or relative to modelBasePath\n    },\n  },\n\n  object: {\n    enabled: false,\n    modelPath: 'mb3-centernet.json',  // experimental: object detection model, can be absolute path or relative to modelBasePath\n                             // can be 'mb3-centernet' or 'nanodet'\n    minConfidence: 0.2,      // threshold for discarding a prediction\n    iouThreshold: 0.4,       // ammount of overlap between two detected objects before one object is removed\n    maxDetected: 10,         // maximum number of objects detected in the input\n    skipFrames: 19,          // how many max frames to go without re-running the detector\n                             // only used when cacheSensitivity is not zero\n  },\n\n  segmentation: {\n    enabled: false,          // controlls and configures all body segmentation module\n                             // removes background from input containing person\n                             // if segmentation is enabled it will run as preprocessing task before any other model\n                             // alternatively leave it disabled and use it on-demand using human.segmentation method which can\n                             // remove background or replace it with user-provided background\n    modelPath: 'selfie.json',  // experimental: object detection model, can be absolute path or relative to modelBasePath\n                             // can be 'selfie' or 'meet'\n  },\n};\nexport { config as defaults };\n", "/**\n * Helper function that returns basic system info\n */\nexport function info(): { platform: string, agent: string } {\n  let platform;\n  let agent;\n  if (typeof navigator !== 'undefined') {\n    const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n    if (raw && raw[0]) {\n      const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n      platform = platformMatch ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n      agent = navigator.userAgent.replace(raw[0], '');\n      if (platform[1]) agent = agent.replace(raw[1], '');\n      agent = agent.replace(/  /g, ' ');\n    }\n  } else if (typeof process !== 'undefined') {\n    platform = `${process.platform} ${process.arch}`;\n    agent = `NodeJS ${process.version}`;\n  }\n  return { platform, agent };\n}\n", "/**\n * Creates tfjs bundle used by Human browser build target\n * @external\n */\n\n// get versions of all packages\nimport { version as tfjsVersion } from '@tensorflow/tfjs/package.json';\nimport { version as tfjsCoreVersion } from '@tensorflow/tfjs-core/package.json';\nimport { version as tfjsDataVersion } from '@tensorflow/tfjs-data/package.json';\nimport { version as tfjsLayersVersion } from '@tensorflow/tfjs-layers/package.json';\nimport { version as tfjsConverterVersion } from '@tensorflow/tfjs-converter/package.json';\nimport { version as tfjsBackendCPUVersion } from '@tensorflow/tfjs-backend-cpu/package.json';\nimport { version as tfjsBackendWebGLVersion } from '@tensorflow/tfjs-backend-webgl/package.json';\nimport { version as tfjsBackendWASMVersion } from '@tensorflow/tfjs-backend-wasm/package.json';\n\n// export all from sources\n// requires treeShaking:ignore-annotations due to tfjs misconfiguration\n/*\nexport * from '@tensorflow/tfjs-core/src/index';\nexport * from '@tensorflow/tfjs-layers/src/index';\nexport * from '@tensorflow/tfjs-converter/src/index';\nexport * as data from '@tensorflow/tfjs-data/src/index';\nexport * from '@tensorflow/tfjs-backend-cpu/src/index';\nexport * from '@tensorflow/tfjs-backend-webgl/src/index';\nexport * from '@tensorflow/tfjs-backend-wasm/src/index';\n*/\n\n// export all from build\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-webgpu/dist/index.js'; // experimental\n\n// export versions\nexport const version = {\n  tfjs: tfjsVersion,\n  'tfjs-core': tfjsCoreVersion,\n  'tfjs-data': tfjsDataVersion,\n  'tfjs-layers': tfjsLayersVersion,\n  'tfjs-converter': tfjsConverterVersion,\n  'tfjs-backend-cpu': tfjsBackendCPUVersion,\n  'tfjs-backend-webgl': tfjsBackendWebGLVersion,\n  'tfjs-backend-wasm': tfjsBackendWASMVersion,\n};\n", "/**\n * Custom TFJS backend for Human based on WebGL\n * Not used by default\n */\n\nimport { log } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nexport const config = {\n  name: 'humangl',\n  priority: 99,\n  canvas: <null | OffscreenCanvas | HTMLCanvasElement>null,\n  gl: <null | WebGL2RenderingContext>null,\n  width: 1024,\n  height: 1024,\n  extensions: <string[]> [],\n  webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n    alpha: false,\n    antialias: false,\n    premultipliedAlpha: false,\n    preserveDrawingBuffer: false,\n    depth: false,\n    stencil: false,\n    failIfMajorPerformanceCaveat: false,\n    desynchronized: true,\n  },\n};\n\nfunction extensions(): void {\n  /*\n  https://www.khronos.org/registry/webgl/extensions/\n  https://webglreport.com/?v=2\n  */\n  const gl = config.gl;\n  if (!gl) return;\n  config.extensions = gl.getSupportedExtensions() as string[];\n  // gl.getExtension('KHR_parallel_shader_compile');\n}\n\n/**\n * Registers custom WebGL2 backend to be used by Human library\n *\n * @returns void\n */\nexport function register(): void {\n  if (!tf.findBackend(config.name)) {\n    // log('backend registration:', config.name);\n    try {\n      config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');\n    } catch (err) {\n      log('error: cannot create canvas:', err);\n      return;\n    }\n    try {\n      config.gl = config.canvas.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;\n    } catch (err) {\n      log('error: cannot get WebGL2 context:', err);\n      return;\n    }\n    try {\n      tf.setWebGLContext(2, config.gl);\n    } catch (err) {\n      log('error: cannot set WebGL2 context:', err);\n      return;\n    }\n    try {\n      const ctx = new tf.GPGPUContext(config.gl);\n      tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n    } catch (err) {\n      log('error: cannot register WebGL backend:', err);\n      return;\n    }\n    try {\n      const kernels = tf.getKernelsForBackend('webgl');\n      kernels.forEach((kernelConfig) => {\n        const newKernelConfig = { ...kernelConfig, backendName: config.name };\n        tf.registerKernel(newKernelConfig);\n      });\n    } catch (err) {\n      log('error: cannot update WebGL backend registration:', err);\n      return;\n    }\n    try {\n      tf.ENV.set('WEBGL_VERSION', 2);\n    } catch (err) {\n      log('error: cannot set WebGL backend flags:', err);\n      return;\n    }\n    extensions();\n    log('backend registered:', config.name);\n  }\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function scaleBoxCoordinates(box, factor) {\n  const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n  const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n  return { startPoint, endPoint };\n}\n\nexport function getBoxSize(box) {\n  return [\n    Math.abs(box.endPoint[0] - box.startPoint[0]),\n    Math.abs(box.endPoint[1] - box.startPoint[1]),\n  ];\n}\n\nexport function getBoxCenter(box) {\n  return [\n    box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n    box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n  ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n  const h = image.shape[1];\n  const w = image.shape[2];\n  const boxes = [[\n    box.startPoint[1] / h,\n    box.startPoint[0] / w,\n    box.endPoint[1] / h,\n    box.endPoint[0] / w,\n  ]];\n  return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n  const center = getBoxCenter(box);\n  const size = getBoxSize(box);\n  const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n  const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n  const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n  return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function squarifyBox(box) {\n  const centers = getBoxCenter(box);\n  const size = getBoxSize(box);\n  const maxEdge = Math.max(...size);\n  const halfSize = maxEdge / 2;\n  const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)];\n  const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)];\n  return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function calculateLandmarksBoundingBox(landmarks) {\n  const xs = landmarks.map((d) => d[0]);\n  const ys = landmarks.map((d) => d[1]);\n  const startPoint = [Math.min(...xs), Math.min(...ys)];\n  const endPoint = [Math.max(...xs), Math.max(...ys)];\n  return { startPoint, endPoint, landmarks };\n}\n\nexport const disposeBox = (t) => {\n  tf.dispose(t.startPoint);\n  tf.dispose(t.endPoint);\n};\n\nexport const createBox = (startEndTensor) => ({\n  startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]),\n  endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]),\n});\n", "export const IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n/**\n * Normalizes the provided angle to the range -pi to pi.\n * @param angle The angle in radians to be normalized.\n */\nexport function normalizeRadians(angle) {\n  return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\n/**\n * Computes the angle of rotation between two anchor points.\n * @param point1 First anchor point\n * @param point2 Second anchor point\n */\nexport function computeRotation(point1, point2) {\n  const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n  return normalizeRadians(radians);\n}\n\nexport function radToDegrees(rad) {\n  return rad * 180 / Math.PI;\n}\n\nexport function buildTranslationMatrix(x, y) {\n  return [[1, 0, x], [0, 1, y], [0, 0, 1]];\n}\n\nexport function dot(v1, v2) {\n  let product = 0;\n  for (let i = 0; i < v1.length; i++) {\n    product += v1[i] * v2[i];\n  }\n  return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n  const column: Array<number> = [];\n  for (let i = 0; i < arr.length; i++) {\n    column.push(arr[i][columnIndex]);\n  }\n  return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n  const product: Array<number[]> = [];\n  const size = mat1.length;\n  for (let row = 0; row < size; row++) {\n    product.push([]);\n    for (let col = 0; col < size; col++) {\n      product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n    }\n  }\n  return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n  const cosA = Math.cos(rotation);\n  const sinA = Math.sin(rotation);\n  const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n  const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n  const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n  const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n  return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n  const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n  const translationComponent = [matrix[0][2], matrix[1][2]];\n  const invertedTranslation = [\n    -dot(rotationComponent[0], translationComponent),\n    -dot(rotationComponent[1], translationComponent),\n  ];\n  return [\n    rotationComponent[0].concat(invertedTranslation[0]),\n    rotationComponent[1].concat(invertedTranslation[1]),\n    [0, 0, 1],\n  ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n  return [\n    dot(homogeneousCoordinate, rotationMatrix[0]),\n    dot(homogeneousCoordinate, rotationMatrix[1]),\n  ];\n}\n\nexport function xyDistanceBetweenPoints(a, b) {\n  return Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n}\n\nexport function generateAnchors(inputSize) {\n  const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] };\n  const anchors: Array<[number, number]> = [];\n  for (let i = 0; i < spec.strides.length; i++) {\n    const stride = spec.strides[i];\n    const gridRows = Math.floor((inputSize + stride - 1) / stride);\n    const gridCols = Math.floor((inputSize + stride - 1) / stride);\n    const anchorsNum = spec.anchors[i];\n    for (let gridY = 0; gridY < gridRows; gridY++) {\n      const anchorY = stride * (gridY + 0.5);\n      for (let gridX = 0; gridX < gridCols; gridX++) {\n        const anchorX = stride * (gridX + 0.5);\n        for (let n = 0; n < anchorsNum; n++) {\n          anchors.push([anchorX, anchorY]);\n        }\n      }\n    }\n  }\n  return anchors;\n}\n", "import { log, join, mergeDeep } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst keypointsCount = 6;\n\nfunction decodeBounds(boxOutputs, anchors, inputSize) {\n  const boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n  const centers = tf.add(boxStarts, anchors);\n  const boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n  const boxSizesNormalized = tf.div(boxSizes, inputSize);\n  const centersNormalized = tf.div(centers, inputSize);\n  const halfBoxSize = tf.div(boxSizesNormalized, 2);\n  const starts = tf.sub(centersNormalized, halfBoxSize);\n  const ends = tf.add(centersNormalized, halfBoxSize);\n  const startNormalized = tf.mul(starts, inputSize);\n  const endNormalized = tf.mul(ends, inputSize);\n  const concatAxis = 1;\n  return tf.concat2d([startNormalized, endNormalized], concatAxis);\n}\n\nexport class BlazeFaceModel {\n  model: GraphModel;\n  anchorsData: [number, number][];\n  anchors: Tensor;\n  inputSize: number;\n  config: Config;\n\n  constructor(model, config: Config) {\n    this.model = model;\n    this.anchorsData = util.generateAnchors(model.inputs[0].shape[1]);\n    this.anchors = tf.tensor2d(this.anchorsData);\n    this.inputSize = model.inputs[0].shape[2];\n    this.config = config;\n  }\n\n  async getBoundingBoxes(inputImage: Tensor, userConfig: Config) {\n    // sanity check on input\n    // @ts-ignore isDisposed is internal property\n    if ((!inputImage) || (inputImage.isDisposedInternal) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return null;\n    const [batch, boxes, scores] = tf.tidy(() => {\n      const resizedImage = tf.image.resizeBilinear(inputImage, [this.inputSize, this.inputSize]);\n      const normalizedImage = tf.sub(tf.div(resizedImage, 127.5), 0.5);\n      const res = this.model.execute(normalizedImage);\n      let batchOut;\n      if (Array.isArray(res)) { // are we using tfhub or pinto converted model?\n        const sorted = res.sort((a, b) => a.size - b.size);\n        const concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n        const concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n        const concat = tf.concat([concat512, concat384], 1);\n        batchOut = tf.squeeze(concat, 0);\n      } else {\n        batchOut = tf.squeeze(res); // when using tfhub model\n      }\n      const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]);\n      const logits = tf.slice(batchOut, [0, 0], [-1, 1]);\n      const scoresOut = tf.squeeze(tf.sigmoid(logits)).dataSync(); // inside tf.tidy\n      return [batchOut, boxesOut, scoresOut];\n    });\n\n    this.config = mergeDeep(this.config, userConfig) as Config;\n\n    const nmsTensor = await tf.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence);\n    const nms = await nmsTensor.array();\n    tf.dispose(nmsTensor);\n    const annotatedBoxes: Array<{ box: { startPoint: Tensor, endPoint: Tensor }, landmarks: Tensor, anchor: number[], confidence: number }> = [];\n    for (let i = 0; i < nms.length; i++) {\n      const confidence = scores[nms[i]];\n      if (confidence > this.config.face.detector.minConfidence) {\n        const boundingBox = tf.slice(boxes, [nms[i], 0], [1, -1]);\n        const localBox = box.createBox(boundingBox);\n        tf.dispose(boundingBox);\n        const anchor = this.anchorsData[nms[i]];\n        const landmarks = tf.tidy(() => tf.reshape(tf.squeeze(tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1])), [keypointsCount, -1]));\n        annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n      }\n    }\n    tf.dispose(batch);\n    tf.dispose(boxes);\n    return {\n      boxes: annotatedBoxes,\n      scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize],\n    };\n  }\n}\n\nexport async function load(config: Config) {\n  const model = await tf.loadGraphModel(join(config.modelBasePath, config.face.detector.modelPath), { fromTFHub: config.face.detector.modelPath.includes('tfhub.dev') });\n  const blazeFace = new BlazeFaceModel(model, config);\n  if (!model || !model.modelUrl) log('load model failed:', config.face.detector.modelPath);\n  else if (config.debug) log('load model:', model.modelUrl);\n  return blazeFace;\n}\n", "export const MESH_ANNOTATIONS = {\n  silhouette: [\n    10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n    397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n    172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n  ],\n  lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291],\n  lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n  lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308],\n  lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n  rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173],\n  rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133],\n  rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190],\n  rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243],\n  rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189],\n  rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244],\n  rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245],\n  rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193],\n  rightEyebrowLower: [35, 124, 46, 53, 52, 65],\n  rightEyeIris: [473, 474, 475, 476, 477],\n  leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n  leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n  leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n  leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n  leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n  leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n  leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n  leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n  leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n  leftEyeIris: [468, 469, 470, 471, 472],\n  midwayBetweenEyes: [168],\n  noseTip: [1],\n  noseBottom: [2],\n  noseRightCorner: [98],\n  noseLeftCorner: [327],\n  rightCheek: [205],\n  leftCheek: [425],\n};\n\nexport const MESH_TO_IRIS_INDICES_MAP = [ // A mapping from facemesh model keypoints to iris model keypoints.\n  { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },\n  { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },\n  { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },\n  { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },\n  { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },\n  { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },\n  { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },\n  // { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },\n  // { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },\n];\n\nexport const UV468 = [\n  [0.499976992607117, 0.652534008026123],\n  [0.500025987625122, 0.547487020492554],\n  [0.499974012374878, 0.602371990680695],\n  [0.482113003730774, 0.471979022026062],\n  [0.500150978565216, 0.527155995368958],\n  [0.499909996986389, 0.498252987861633],\n  [0.499523013830185, 0.40106201171875],\n  [0.289712011814117, 0.380764007568359],\n  [0.499954998493195, 0.312398016452789],\n  [0.499987006187439, 0.269918978214264],\n  [0.500023007392883, 0.107050001621246],\n  [0.500023007392883, 0.666234016418457],\n  [0.5000159740448, 0.679224014282227],\n  [0.500023007392883, 0.692348003387451],\n  [0.499976992607117, 0.695277988910675],\n  [0.499976992607117, 0.70593398809433],\n  [0.499976992607117, 0.719385027885437],\n  [0.499976992607117, 0.737019002437592],\n  [0.499967992305756, 0.781370997428894],\n  [0.499816000461578, 0.562981009483337],\n  [0.473773002624512, 0.573909997940063],\n  [0.104906998574734, 0.254140973091125],\n  [0.365929991006851, 0.409575998783112],\n  [0.338757991790771, 0.41302502155304],\n  [0.311120003461838, 0.409460008144379],\n  [0.274657994508743, 0.389131009578705],\n  [0.393361985683441, 0.403706014156342],\n  [0.345234006643295, 0.344011008739471],\n  [0.370094001293182, 0.346076011657715],\n  [0.319321990013123, 0.347265005111694],\n  [0.297903001308441, 0.353591024875641],\n  [0.24779200553894, 0.410809993743896],\n  [0.396889001131058, 0.842755019664764],\n  [0.280097991228104, 0.375599980354309],\n  [0.106310002505779, 0.399955987930298],\n  [0.2099249958992, 0.391353011131287],\n  [0.355807989835739, 0.534406006336212],\n  [0.471751004457474, 0.65040397644043],\n  [0.474155008792877, 0.680191993713379],\n  [0.439785003662109, 0.657229006290436],\n  [0.414617002010345, 0.66654098033905],\n  [0.450374007225037, 0.680860996246338],\n  [0.428770989179611, 0.682690978050232],\n  [0.374971002340317, 0.727805018424988],\n  [0.486716985702515, 0.547628998756409],\n  [0.485300987958908, 0.527395009994507],\n  [0.257764995098114, 0.314490020275116],\n  [0.401223003864288, 0.455172002315521],\n  [0.429818987846375, 0.548614978790283],\n  [0.421351999044418, 0.533740997314453],\n  [0.276895999908447, 0.532056987285614],\n  [0.483370006084442, 0.499586999416351],\n  [0.33721199631691, 0.282882988452911],\n  [0.296391993761063, 0.293242990970612],\n  [0.169294998049736, 0.193813979625702],\n  [0.447580009698868, 0.302609980106354],\n  [0.392390012741089, 0.353887975215912],\n  [0.354490011930466, 0.696784019470215],\n  [0.067304998636246, 0.730105042457581],\n  [0.442739009857178, 0.572826027870178],\n  [0.457098007202148, 0.584792017936707],\n  [0.381974011659622, 0.694710969924927],\n  [0.392388999462128, 0.694203019142151],\n  [0.277076005935669, 0.271932005882263],\n  [0.422551989555359, 0.563233017921448],\n  [0.385919004678726, 0.281364023685455],\n  [0.383103013038635, 0.255840003490448],\n  [0.331431001424789, 0.119714021682739],\n  [0.229923993349075, 0.232002973556519],\n  [0.364500999450684, 0.189113974571228],\n  [0.229622006416321, 0.299540996551514],\n  [0.173287004232407, 0.278747975826263],\n  [0.472878992557526, 0.666198015213013],\n  [0.446828007698059, 0.668527007102966],\n  [0.422762006521225, 0.673889994621277],\n  [0.445307999849319, 0.580065965652466],\n  [0.388103008270264, 0.693961024284363],\n  [0.403039008378983, 0.706539988517761],\n  [0.403629004955292, 0.693953037261963],\n  [0.460041999816895, 0.557139039039612],\n  [0.431158006191254, 0.692366003990173],\n  [0.452181994915009, 0.692366003990173],\n  [0.475387006998062, 0.692366003990173],\n  [0.465828001499176, 0.779190003871918],\n  [0.472328990697861, 0.736225962638855],\n  [0.473087012767792, 0.717857003211975],\n  [0.473122000694275, 0.704625964164734],\n  [0.473033010959625, 0.695277988910675],\n  [0.427942007780075, 0.695277988910675],\n  [0.426479011774063, 0.703539967536926],\n  [0.423162013292313, 0.711845993995667],\n  [0.4183090031147, 0.720062971115112],\n  [0.390094995498657, 0.639572978019714],\n  [0.013953999616206, 0.560034036636353],\n  [0.499913990497589, 0.58014702796936],\n  [0.413199990987778, 0.69539999961853],\n  [0.409626007080078, 0.701822996139526],\n  [0.468080013990402, 0.601534962654114],\n  [0.422728985548019, 0.585985004901886],\n  [0.463079988956451, 0.593783974647522],\n  [0.37211999297142, 0.47341400384903],\n  [0.334562003612518, 0.496073007583618],\n  [0.411671012639999, 0.546965003013611],\n  [0.242175996303558, 0.14767599105835],\n  [0.290776997804642, 0.201445996761322],\n  [0.327338010072708, 0.256527006626129],\n  [0.399509996175766, 0.748921036720276],\n  [0.441727995872498, 0.261676013469696],\n  [0.429764986038208, 0.187834024429321],\n  [0.412198007106781, 0.108901023864746],\n  [0.288955003023148, 0.398952007293701],\n  [0.218936994671822, 0.435410976409912],\n  [0.41278201341629, 0.398970007896423],\n  [0.257135003805161, 0.355440020561218],\n  [0.427684992551804, 0.437960982322693],\n  [0.448339998722076, 0.536936044692993],\n  [0.178560003638268, 0.45755398273468],\n  [0.247308000922203, 0.457193970680237],\n  [0.286267012357712, 0.467674970626831],\n  [0.332827985286713, 0.460712015628815],\n  [0.368755996227264, 0.447206974029541],\n  [0.398963987827301, 0.432654976844788],\n  [0.476410001516342, 0.405806005001068],\n  [0.189241006970406, 0.523923993110657],\n  [0.228962004184723, 0.348950982093811],\n  [0.490725994110107, 0.562400996685028],\n  [0.404670000076294, 0.485132992267609],\n  [0.019469000399113, 0.401564002037048],\n  [0.426243007183075, 0.420431017875671],\n  [0.396993011236191, 0.548797011375427],\n  [0.266469985246658, 0.376977026462555],\n  [0.439121007919312, 0.51895797252655],\n  [0.032313998788595, 0.644356966018677],\n  [0.419054001569748, 0.387154996395111],\n  [0.462783008813858, 0.505746960639954],\n  [0.238978996872902, 0.779744982719421],\n  [0.198220998048782, 0.831938028335571],\n  [0.107550002634525, 0.540755033493042],\n  [0.183610007166862, 0.740257024765015],\n  [0.134409993886948, 0.333683013916016],\n  [0.385764002799988, 0.883153975009918],\n  [0.490967005491257, 0.579378008842468],\n  [0.382384985685349, 0.508572995662689],\n  [0.174399003386497, 0.397670984268188],\n  [0.318785011768341, 0.39623498916626],\n  [0.343364000320435, 0.400596976280212],\n  [0.396100014448166, 0.710216999053955],\n  [0.187885001301765, 0.588537991046906],\n  [0.430987000465393, 0.944064974784851],\n  [0.318993002176285, 0.898285031318665],\n  [0.266247987747192, 0.869701027870178],\n  [0.500023007392883, 0.190576016902924],\n  [0.499976992607117, 0.954452991485596],\n  [0.366169989109039, 0.398822009563446],\n  [0.393207013607025, 0.39553701877594],\n  [0.410373002290726, 0.391080021858215],\n  [0.194993004202843, 0.342101991176605],\n  [0.388664990663528, 0.362284004688263],\n  [0.365961998701096, 0.355970978736877],\n  [0.343364000320435, 0.355356991291046],\n  [0.318785011768341, 0.35834002494812],\n  [0.301414996385574, 0.363156020641327],\n  [0.058132998645306, 0.319076001644135],\n  [0.301414996385574, 0.387449026107788],\n  [0.499987989664078, 0.618434011936188],\n  [0.415838003158569, 0.624195992946625],\n  [0.445681989192963, 0.566076993942261],\n  [0.465844005346298, 0.620640993118286],\n  [0.49992299079895, 0.351523995399475],\n  [0.288718998432159, 0.819945991039276],\n  [0.335278987884521, 0.852819979190826],\n  [0.440512001514435, 0.902418971061707],\n  [0.128294005990028, 0.791940987110138],\n  [0.408771991729736, 0.373893976211548],\n  [0.455606997013092, 0.451801002025604],\n  [0.499877005815506, 0.908990025520325],\n  [0.375436991453171, 0.924192011356354],\n  [0.11421000212431, 0.615022003650665],\n  [0.448662012815475, 0.695277988910675],\n  [0.4480200111866, 0.704632043838501],\n  [0.447111994028091, 0.715808033943176],\n  [0.444831997156143, 0.730794012546539],\n  [0.430011987686157, 0.766808986663818],\n  [0.406787008047104, 0.685672998428345],\n  [0.400738000869751, 0.681069016456604],\n  [0.392399996519089, 0.677703022956848],\n  [0.367855995893478, 0.663918972015381],\n  [0.247923001646996, 0.601333022117615],\n  [0.452769994735718, 0.420849978923798],\n  [0.43639200925827, 0.359887003898621],\n  [0.416164010763168, 0.368713974952698],\n  [0.413385987281799, 0.692366003990173],\n  [0.228018000721931, 0.683571994304657],\n  [0.468268007040024, 0.352671027183533],\n  [0.411361992359161, 0.804327011108398],\n  [0.499989002943039, 0.469825029373169],\n  [0.479153990745544, 0.442654013633728],\n  [0.499974012374878, 0.439637005329132],\n  [0.432112008333206, 0.493588984012604],\n  [0.499886006116867, 0.866917014122009],\n  [0.49991300702095, 0.821729004383087],\n  [0.456548988819122, 0.819200992584229],\n  [0.344549000263214, 0.745438992977142],\n  [0.37890899181366, 0.574010014533997],\n  [0.374292999505997, 0.780184984207153],\n  [0.319687992334366, 0.570737957954407],\n  [0.357154995203018, 0.604269981384277],\n  [0.295284003019333, 0.621580958366394],\n  [0.447750002145767, 0.862477004528046],\n  [0.410986006259918, 0.508723020553589],\n  [0.31395098567009, 0.775308012962341],\n  [0.354128003120422, 0.812552988529205],\n  [0.324548006057739, 0.703992962837219],\n  [0.189096003770828, 0.646299958229065],\n  [0.279776990413666, 0.71465802192688],\n  [0.1338230073452, 0.682700991630554],\n  [0.336768001317978, 0.644733011722565],\n  [0.429883986711502, 0.466521978378296],\n  [0.455527991056442, 0.548622965812683],\n  [0.437114000320435, 0.558896005153656],\n  [0.467287987470627, 0.529924988746643],\n  [0.414712011814117, 0.335219979286194],\n  [0.37704598903656, 0.322777986526489],\n  [0.344107985496521, 0.320150971412659],\n  [0.312875986099243, 0.32233202457428],\n  [0.283526003360748, 0.333190023899078],\n  [0.241245999932289, 0.382785975933075],\n  [0.102986000478268, 0.468762993812561],\n  [0.267612010240555, 0.424560010433197],\n  [0.297879010438919, 0.433175981044769],\n  [0.333433985710144, 0.433878004550934],\n  [0.366427004337311, 0.426115989685059],\n  [0.396012008190155, 0.416696012020111],\n  [0.420121014118195, 0.41022801399231],\n  [0.007561000064015, 0.480777025222778],\n  [0.432949006557465, 0.569517970085144],\n  [0.458638995885849, 0.479089021682739],\n  [0.473466008901596, 0.545744001865387],\n  [0.476087987422943, 0.563830018043518],\n  [0.468472003936768, 0.555056989192963],\n  [0.433990985155106, 0.582361996173859],\n  [0.483518004417419, 0.562983989715576],\n  [0.482482999563217, 0.57784903049469],\n  [0.42645001411438, 0.389798998832703],\n  [0.438998997211456, 0.39649498462677],\n  [0.450067013502121, 0.400434017181396],\n  [0.289712011814117, 0.368252992630005],\n  [0.276670008897781, 0.363372981548309],\n  [0.517862021923065, 0.471948027610779],\n  [0.710287988185883, 0.380764007568359],\n  [0.526226997375488, 0.573909997940063],\n  [0.895093023777008, 0.254140973091125],\n  [0.634069979190826, 0.409575998783112],\n  [0.661242008209229, 0.41302502155304],\n  [0.688880026340485, 0.409460008144379],\n  [0.725341975688934, 0.389131009578705],\n  [0.606630027294159, 0.40370500087738],\n  [0.654766023159027, 0.344011008739471],\n  [0.629905998706818, 0.346076011657715],\n  [0.680678009986877, 0.347265005111694],\n  [0.702096998691559, 0.353591024875641],\n  [0.75221198797226, 0.410804986953735],\n  [0.602918028831482, 0.842862963676453],\n  [0.719901978969574, 0.375599980354309],\n  [0.893692970275879, 0.399959981441498],\n  [0.790081977844238, 0.391354024410248],\n  [0.643998026847839, 0.534487962722778],\n  [0.528249025344849, 0.65040397644043],\n  [0.525849997997284, 0.680191040039062],\n  [0.560214996337891, 0.657229006290436],\n  [0.585384011268616, 0.66654098033905],\n  [0.549625992774963, 0.680860996246338],\n  [0.57122802734375, 0.682691991329193],\n  [0.624852001667023, 0.72809898853302],\n  [0.513050019741058, 0.547281980514526],\n  [0.51509702205658, 0.527251958847046],\n  [0.742246985435486, 0.314507007598877],\n  [0.598631024360657, 0.454979002475739],\n  [0.570338010787964, 0.548575043678284],\n  [0.578631997108459, 0.533622980117798],\n  [0.723087012767792, 0.532054007053375],\n  [0.516445994377136, 0.499638974666595],\n  [0.662801027297974, 0.282917976379395],\n  [0.70362401008606, 0.293271005153656],\n  [0.830704987049103, 0.193813979625702],\n  [0.552385985851288, 0.302568018436432],\n  [0.607609987258911, 0.353887975215912],\n  [0.645429015159607, 0.696707010269165],\n  [0.932694971561432, 0.730105042457581],\n  [0.557260990142822, 0.572826027870178],\n  [0.542901992797852, 0.584792017936707],\n  [0.6180260181427, 0.694710969924927],\n  [0.607590973377228, 0.694203019142151],\n  [0.722943007946014, 0.271963000297546],\n  [0.577413976192474, 0.563166975975037],\n  [0.614082992076874, 0.281386971473694],\n  [0.616907000541687, 0.255886018276215],\n  [0.668509006500244, 0.119913995265961],\n  [0.770092010498047, 0.232020974159241],\n  [0.635536015033722, 0.189248979091644],\n  [0.77039098739624, 0.299556016921997],\n  [0.826722025871277, 0.278755009174347],\n  [0.527121007442474, 0.666198015213013],\n  [0.553171992301941, 0.668527007102966],\n  [0.577238023281097, 0.673889994621277],\n  [0.554691970348358, 0.580065965652466],\n  [0.611896991729736, 0.693961024284363],\n  [0.59696102142334, 0.706539988517761],\n  [0.596370995044708, 0.693953037261963],\n  [0.539958000183105, 0.557139039039612],\n  [0.568841993808746, 0.692366003990173],\n  [0.547818005084991, 0.692366003990173],\n  [0.52461302280426, 0.692366003990173],\n  [0.534089982509613, 0.779141008853912],\n  [0.527670979499817, 0.736225962638855],\n  [0.526912987232208, 0.717857003211975],\n  [0.526877999305725, 0.704625964164734],\n  [0.526966989040375, 0.695277988910675],\n  [0.572058022022247, 0.695277988910675],\n  [0.573521018028259, 0.703539967536926],\n  [0.57683801651001, 0.711845993995667],\n  [0.581691026687622, 0.720062971115112],\n  [0.609944999217987, 0.639909982681274],\n  [0.986046016216278, 0.560034036636353],\n  [0.5867999792099, 0.69539999961853],\n  [0.590372025966644, 0.701822996139526],\n  [0.531915009021759, 0.601536989212036],\n  [0.577268004417419, 0.585934996604919],\n  [0.536915004253387, 0.593786001205444],\n  [0.627542972564697, 0.473352015018463],\n  [0.665585994720459, 0.495950996875763],\n  [0.588353991508484, 0.546862006187439],\n  [0.757824003696442, 0.14767599105835],\n  [0.709249973297119, 0.201507985591888],\n  [0.672684013843536, 0.256581008434296],\n  [0.600408971309662, 0.74900496006012],\n  [0.55826598405838, 0.261672019958496],\n  [0.570303976535797, 0.187870979309082],\n  [0.588165998458862, 0.109044015407562],\n  [0.711045026779175, 0.398952007293701],\n  [0.781069993972778, 0.435405015945435],\n  [0.587247014045715, 0.398931980133057],\n  [0.742869973182678, 0.355445981025696],\n  [0.572156012058258, 0.437651991844177],\n  [0.55186802148819, 0.536570012569427],\n  [0.821442008018494, 0.457556009292603],\n  [0.752701997756958, 0.457181990146637],\n  [0.71375697851181, 0.467626988887787],\n  [0.66711300611496, 0.460672974586487],\n  [0.631101012229919, 0.447153985500336],\n  [0.6008620262146, 0.432473003864288],\n  [0.523481011390686, 0.405627012252808],\n  [0.810747981071472, 0.523926019668579],\n  [0.771045982837677, 0.348959028720856],\n  [0.509127020835876, 0.562718033790588],\n  [0.595292985439301, 0.485023975372314],\n  [0.980530977249146, 0.401564002037048],\n  [0.573499977588654, 0.420000016689301],\n  [0.602994978427887, 0.548687994480133],\n  [0.733529984951019, 0.376977026462555],\n  [0.560611009597778, 0.519016981124878],\n  [0.967685997486115, 0.644356966018677],\n  [0.580985009670258, 0.387160003185272],\n  [0.537728011608124, 0.505385041236877],\n  [0.760966002941132, 0.779752969741821],\n  [0.801778972148895, 0.831938028335571],\n  [0.892440974712372, 0.54076099395752],\n  [0.816350996494293, 0.740260004997253],\n  [0.865594983100891, 0.333687007427216],\n  [0.614073991775513, 0.883246004581451],\n  [0.508952975273132, 0.579437971115112],\n  [0.617941975593567, 0.508316040039062],\n  [0.825608015060425, 0.397674977779388],\n  [0.681214988231659, 0.39623498916626],\n  [0.656635999679565, 0.400596976280212],\n  [0.603900015354156, 0.710216999053955],\n  [0.81208598613739, 0.588539004325867],\n  [0.56801301240921, 0.944564998149872],\n  [0.681007981300354, 0.898285031318665],\n  [0.733752012252808, 0.869701027870178],\n  [0.633830010890961, 0.398822009563446],\n  [0.606792986392975, 0.39553701877594],\n  [0.589659988880157, 0.391062021255493],\n  [0.805015981197357, 0.342108011245728],\n  [0.611334979534149, 0.362284004688263],\n  [0.634037971496582, 0.355970978736877],\n  [0.656635999679565, 0.355356991291046],\n  [0.681214988231659, 0.35834002494812],\n  [0.698584973812103, 0.363156020641327],\n  [0.941866993904114, 0.319076001644135],\n  [0.698584973812103, 0.387449026107788],\n  [0.584177017211914, 0.624107003211975],\n  [0.554318010807037, 0.566076993942261],\n  [0.534153997898102, 0.62064003944397],\n  [0.711217999458313, 0.819975018501282],\n  [0.664629995822906, 0.852871000766754],\n  [0.559099972248077, 0.902631998062134],\n  [0.871706008911133, 0.791940987110138],\n  [0.591234028339386, 0.373893976211548],\n  [0.544341027736664, 0.451583981513977],\n  [0.624562978744507, 0.924192011356354],\n  [0.88577002286911, 0.615028977394104],\n  [0.551338016986847, 0.695277988910675],\n  [0.551980018615723, 0.704632043838501],\n  [0.552887976169586, 0.715808033943176],\n  [0.555167973041534, 0.730794012546539],\n  [0.569944024085999, 0.767035007476807],\n  [0.593203008174896, 0.685675978660583],\n  [0.599261999130249, 0.681069016456604],\n  [0.607599973678589, 0.677703022956848],\n  [0.631937980651855, 0.663500010967255],\n  [0.752032995223999, 0.601315021514893],\n  [0.547226011753082, 0.420395016670227],\n  [0.563543975353241, 0.359827995300293],\n  [0.583841025829315, 0.368713974952698],\n  [0.586614012718201, 0.692366003990173],\n  [0.771915018558502, 0.683578014373779],\n  [0.531597018241882, 0.352482974529266],\n  [0.588370978832245, 0.804440975189209],\n  [0.52079701423645, 0.442565023899078],\n  [0.567984998226166, 0.493479013442993],\n  [0.543282985687256, 0.819254994392395],\n  [0.655317008495331, 0.745514988899231],\n  [0.621008992195129, 0.574018001556396],\n  [0.625559985637665, 0.78031200170517],\n  [0.680198013782501, 0.570719003677368],\n  [0.64276397228241, 0.604337990283966],\n  [0.704662978649139, 0.621529996395111],\n  [0.552012026309967, 0.862591981887817],\n  [0.589071989059448, 0.508637011051178],\n  [0.685944974422455, 0.775357007980347],\n  [0.645735025405884, 0.812640011310577],\n  [0.675342977046967, 0.703978002071381],\n  [0.810858011245728, 0.646304965019226],\n  [0.72012197971344, 0.714666962623596],\n  [0.866151988506317, 0.682704985141754],\n  [0.663187026977539, 0.644596993923187],\n  [0.570082008838654, 0.466325998306274],\n  [0.544561982154846, 0.548375964164734],\n  [0.562758982181549, 0.558784961700439],\n  [0.531987011432648, 0.530140042304993],\n  [0.585271000862122, 0.335177004337311],\n  [0.622952997684479, 0.32277899980545],\n  [0.655896008014679, 0.320163011550903],\n  [0.687132000923157, 0.322345972061157],\n  [0.716481983661652, 0.333200991153717],\n  [0.758756995201111, 0.382786989212036],\n  [0.897013008594513, 0.468769013881683],\n  [0.732392013072968, 0.424547016620636],\n  [0.70211398601532, 0.433162987232208],\n  [0.66652500629425, 0.433866024017334],\n  [0.633504986763, 0.426087975502014],\n  [0.603875994682312, 0.416586995124817],\n  [0.579657971858978, 0.409945011138916],\n  [0.992439985275269, 0.480777025222778],\n  [0.567192018032074, 0.569419980049133],\n  [0.54136598110199, 0.478899002075195],\n  [0.526564002037048, 0.546118021011353],\n  [0.523913025856018, 0.563830018043518],\n  [0.531529009342194, 0.555056989192963],\n  [0.566035985946655, 0.582329034805298],\n  [0.51631098985672, 0.563053965568542],\n  [0.5174720287323, 0.577877044677734],\n  [0.573594987392426, 0.389806985855103],\n  [0.560697972774506, 0.395331978797913],\n  [0.549755990505219, 0.399751007556915],\n  [0.710287988185883, 0.368252992630005],\n  [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468 = [\n  127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n  151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n  157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n  181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n  228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n  170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n  155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n  158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n  102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n  90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n  196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n  246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n  117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n  153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n  63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n  135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n  76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n  166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n  190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n  112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n  110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n  348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n  314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n  321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n  466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n  429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n  293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n  427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n  431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n  434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n  348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n  318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n  373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n  340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n  351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n  164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n  327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n  405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n  438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n  449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n  444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n  464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n  243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n  166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n  119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n  77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n  201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n  103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n  217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n  78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n  57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n  142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n  90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n  178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n  224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n  143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n  153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n  63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n  241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n  186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n  141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n  223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n  128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n  451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n  344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n  424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n  321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n  448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n  281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n  283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n  432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n  268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n  6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n  317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n  272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n  336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n  441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n  373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n  425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n  403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n  383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n  254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n  259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n  453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68 = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n  8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n  45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n  23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n  39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n  35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n  48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n  66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33 = [\n  /*  eyes  */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n  /*  brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n  /*  4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n  /*  nose  */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n  /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n  /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n  /*  chin  */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n  /*  cont  */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7 = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68 = [\n  /* cont  */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n  /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n  /* nose  */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n  /* eyes  */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n  /* lip   */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n  /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33 = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7 = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as bounding from './box';\nimport * as util from './util';\nimport * as coords from './coords';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { BlazeFaceModel } from './blazeface';\n\nconst leftOutline = coords.MESH_ANNOTATIONS['leftEyeLower0'];\nconst rightOutline = coords.MESH_ANNOTATIONS['rightEyeLower0'];\n\nconst eyeLandmarks = {\n  leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n  rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst meshLandmarks = {\n  count: 468,\n  mouth: 13,\n  symmetryLine: [13, coords.MESH_ANNOTATIONS['midwayBetweenEyes'][0]],\n};\n\nconst blazeFaceLandmarks = {\n  leftEye: 0,\n  rightEye: 1,\n  nose: 2,\n  mouth: 3,\n  leftEar: 4,\n  rightEar: 5,\n  symmetryLine: [3, 2],\n};\n\nconst irisLandmarks = {\n  upperCenter: 3,\n  lowerCenter: 4,\n  index: 71,\n  numCoordinates: 76,\n};\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates\n// Update the z coordinate to be an average of the original and the new.\nfunction replaceRawCoordinates(rawCoords, newCoords, prefix, keys) {\n  for (let i = 0; i < coords.MESH_TO_IRIS_INDICES_MAP.length; i++) {\n    const { key, indices } = coords.MESH_TO_IRIS_INDICES_MAP[i];\n    const originalIndices = coords.MESH_ANNOTATIONS[`${prefix}${key}`];\n    if (!keys || keys.includes(key)) {\n      for (let j = 0; j < indices.length; j++) {\n        const index = indices[j];\n        rawCoords[originalIndices[j]] = [\n          newCoords[index][0], newCoords[index][1],\n          (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n        ];\n      }\n    }\n  }\n}\n// The Pipeline coordinates between the bounding box and skeleton models.\nexport class Pipeline {\n  storedBoxes: Array<{ startPoint: number[], endPoint: number[], landmarks: Array<number>, confidence: number, faceConfidence?: number }>;\n  boundingBoxDetector: BlazeFaceModel; // tf.GraphModel\n  meshDetector: GraphModel; // tf.GraphModel\n  irisModel: GraphModel; // tf.GraphModel\n  boxSize: number;\n  meshSize: number;\n  irisSize: number;\n  irisEnlarge: number;\n  skipped: number;\n  detectedFaces: number;\n\n  constructor(boundingBoxDetector, meshDetector, irisModel) {\n    // An array of facial bounding boxes.\n    this.storedBoxes = [];\n    this.boundingBoxDetector = boundingBoxDetector;\n    this.meshDetector = meshDetector;\n    this.irisModel = irisModel;\n    this.boxSize = boundingBoxDetector?.model?.inputs[0].shape[2] || 0;\n    this.meshSize = meshDetector?.inputs[0].shape[2] || boundingBoxDetector?.model?.inputs[0].shape[2];\n    this.irisSize = irisModel?.inputs[0].shape[1] || 0;\n    this.irisEnlarge = 2.3;\n    this.skipped = 0;\n    this.detectedFaces = 0;\n  }\n\n  transformRawCoords(rawCoords, box, angle, rotationMatrix) {\n    const boxSize = bounding.getBoxSize({ startPoint: box.startPoint, endPoint: box.endPoint });\n    const coordsScaled = rawCoords.map((coord) => ([\n      boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2),\n      boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2),\n      coord[2],\n    ]));\n    const coordsRotationMatrix = (angle !== 0) ? util.buildRotationMatrix(angle, [0, 0]) : util.IDENTITY_MATRIX;\n    const coordsRotated = (angle !== 0) ? coordsScaled.map((coord) => ([...util.rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n    const inverseRotationMatrix = (angle !== 0) ? util.invertTransformMatrix(rotationMatrix) : util.IDENTITY_MATRIX;\n    const boxCenter = [...bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint }), 1];\n    return coordsRotated.map((coord) => ([\n      Math.round(coord[0] + util.dot(boxCenter, inverseRotationMatrix[0])),\n      Math.round(coord[1] + util.dot(boxCenter, inverseRotationMatrix[1])),\n      Math.round(coord[2]),\n    ]));\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  getLeftToRightEyeDepthDifference(rawCoords) {\n    const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n    const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n    return leftEyeZ - rightEyeZ;\n  }\n\n  // Returns a box describing a cropped region around the eye fit for passing to the iris model.\n  getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) {\n    const box = bounding.squarifyBox(bounding.enlargeBox(bounding.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge));\n    const boxSize = bounding.getBoxSize(box);\n    let crop = tf.image.cropAndResize(face, [[\n      box.startPoint[1] / this.meshSize,\n      box.startPoint[0] / this.meshSize, box.endPoint[1] / this.meshSize,\n      box.endPoint[0] / this.meshSize,\n    ]], [0], [this.irisSize, this.irisSize]);\n    if (flip && tf.ENV.flags.IS_BROWSER) {\n      crop = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n    }\n    return { box, boxSize, crop };\n  }\n\n  // Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\n  getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) {\n    const eyeRawCoords: Array<[number, number, number]> = [];\n    for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n      const x = eyeData[i * 3];\n      const y = eyeData[i * 3 + 1];\n      const z = eyeData[i * 3 + 2];\n      eyeRawCoords.push([\n        (flip ? (1 - (x / this.irisSize)) : (x / this.irisSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n        (y / this.irisSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n      ]);\n    }\n    return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n  }\n\n  // The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\n  // eslint-disable-next-line class-methods-use-this\n  getAdjustedIrisCoords(rawCoords, irisCoords, direction) {\n    const upperCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n    const lowerCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n    const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n    // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n    return irisCoords.map((coord, i) => {\n      let z = averageZ;\n      if (i === 2) {\n        z = upperCenterZ;\n      } else if (i === 4) {\n        z = lowerCenterZ;\n      }\n      return [coord[0], coord[1], z];\n    });\n  }\n\n  async predict(input, config) {\n    let useFreshBox = false;\n    // run new detector every skipFrames unless we only want box to start with\n    let detector;\n    if ((this.skipped === 0) || (this.skipped > config.face.detector.skipFrames) || !config.face.mesh.enabled || !config.skipFrame) {\n      detector = await this.boundingBoxDetector.getBoundingBoxes(input, config);\n      this.skipped = 0;\n    }\n    if (config.skipFrame) this.skipped++;\n\n    // if detector result count doesn't match current working set, use it to reset current working set\n    if (!config.skipFrame || (detector && detector.boxes && (!config.face.mesh.enabled || (detector.boxes.length !== this.detectedFaces) && (this.detectedFaces !== config.face.detector.maxDetected)))) {\n      this.storedBoxes = [];\n      this.detectedFaces = 0;\n      for (const possible of detector.boxes) {\n        const startPoint = await possible.box.startPoint.data();\n        const endPoint = await possible.box.endPoint.data();\n        const landmarks = await possible.landmarks.array();\n        this.storedBoxes.push({ startPoint, endPoint, landmarks, confidence: possible.confidence });\n      }\n      if (this.storedBoxes.length > 0) useFreshBox = true;\n    }\n\n    if (useFreshBox) {\n      if (!detector || !detector.boxes || (detector.boxes.length === 0)) {\n        this.storedBoxes = [];\n        this.detectedFaces = 0;\n        return null;\n      }\n      for (let i = 0; i < this.storedBoxes.length; i++) {\n        const scaledBox = bounding.scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor);\n        const enlargedBox = bounding.enlargeBox(scaledBox);\n        const squarifiedBox = bounding.squarifyBox(enlargedBox);\n        const landmarks = this.storedBoxes[i].landmarks;\n        const confidence = this.storedBoxes[i].confidence;\n        this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks };\n      }\n    }\n    if (detector && detector.boxes) {\n      detector.boxes.forEach((prediction) => {\n        tf.dispose(prediction.box.startPoint);\n        tf.dispose(prediction.box.endPoint);\n        tf.dispose(prediction.landmarks);\n      });\n    }\n    const results = tf.tidy(() => this.storedBoxes.map((box, i) => {\n      // The facial bounding box landmarks could come either from blazeface (if we are using a fresh box), or from the mesh model (if we are reusing an old box).\n      let face;\n      let angle = 0;\n      let rotationMatrix;\n\n      if (config.face.detector.rotation && config.face.mesh.enabled && tf.ENV.flags.IS_BROWSER) {\n        const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n        angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n        const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n        const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n        const rotatedImage = tf.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n        rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n        if (config.face.mesh.enabled) face = tf.div(bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]), 255);\n        else face = tf.div(bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]), 255);\n      } else {\n        rotationMatrix = util.IDENTITY_MATRIX;\n        const clonedImage = input.clone();\n        if (config.face.mesh.enabled) face = tf.div(bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize]), 255);\n        else face = tf.div(bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]), 255);\n      }\n\n      // if we're not going to produce mesh, don't spend time with further processing\n      if (!config.face.mesh.enabled) {\n        const prediction = {\n          mesh: [],\n          box,\n          faceConfidence: null,\n          boxConfidence: box.confidence,\n          confidence: box.confidence,\n          image: face,\n        };\n        return prediction;\n      }\n\n      const [, confidence, contourCoords] = this.meshDetector.execute(face) as Array<Tensor>; // The first returned tensor represents facial contours which are already included in the coordinates.\n      const faceConfidence = confidence.dataSync()[0] as number; // inside tf.tidy\n      if (faceConfidence < config.face.detector.minConfidence) {\n        this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n        return null; // if below confidence just exit\n      }\n      const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n      let rawCoords = coordsReshaped.arraySync();\n\n      if (config.face.iris.enabled) {\n        const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true);\n        const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]);\n        const eyePredictions = this.irisModel.predict(tf.concat([leftEyeCrop, rightEyeCrop])) as Tensor;\n        const eyePredictionsData = eyePredictions.dataSync(); // inside tf.tidy\n        const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n        const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n        const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n        const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n        const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords);\n        if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n          replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', null);\n          replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', null);\n          // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged\n          // So we only update a single contour line above and below the eye.\n        } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n          replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n        } else { // User is looking towards the left.\n          replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n        }\n        const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n        const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n        rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n      }\n\n      // override box from detection with one calculated from mesh\n      const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n      const storeConfidence = box.confidence;\n      // @ts-ignore enlargeBox does not include confidence so we append it manually\n      box = bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5); // redefine box with mesh calculated one\n      box.confidence = storeConfidence;\n\n      // do rotation one more time with mesh keypoints if we want to return perfect image\n      if (config.face.detector.rotation && config.face.mesh.enabled && config.face.description.enabled && tf.ENV.flags.IS_BROWSER) {\n        const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n        angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n        const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n        const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n        const rotatedImage = tf.image.rotateWithOffset(tf.cast(input, 'float32'), angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n        rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n        face = tf.div(bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]), 255);\n      }\n\n      const prediction = {\n        mesh,\n        box,\n        faceConfidence,\n        boxConfidence: box.confidence,\n        image: face,\n      };\n\n      // updated stored cache values\n      this.storedBoxes[i] = { ...bounding.squarifyBox(box), confidence: box.confidence, faceConfidence };\n\n      return prediction;\n    }));\n\n    // results = results.filter((a) => a !== null);\n    // remove cache entries for detected boxes on low confidence\n    if (config.face.mesh.enabled) this.storedBoxes = this.storedBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n    this.detectedFaces = results.length;\n\n    return results;\n  }\n}\n", "/**\n * FaceMesh & BlazeFace Module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as facepipeline from './facepipeline';\nimport * as coords from './coords';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Face } from '../result';\nimport { Config } from '../config';\n\nlet faceModels: [blazeface.BlazeFaceModel | null, GraphModel | null, GraphModel | null] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise<Face[]> {\n  const predictions = await facePipeline.predict(input, config);\n  const results: Array<Face> = [];\n  let id = 0;\n  for (const prediction of (predictions || [])) {\n    if (!prediction || prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing\n    const meshRaw = prediction.mesh.map((pt) => [\n      pt[0] / (input.shape[2] || 0),\n      pt[1] / (input.shape[1] || 0),\n      pt[2] / facePipeline.meshSize,\n    ]);\n    const annotations = {};\n    if (prediction.mesh && prediction.mesh.length > 0) {\n      for (const key of Object.keys(coords.MESH_ANNOTATIONS)) annotations[key] = coords.MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]);\n    }\n    const clampedBox: [number, number, number, number] = prediction.box ? [\n      Math.trunc(Math.max(0, prediction.box.startPoint[0])),\n      Math.trunc(Math.max(0, prediction.box.startPoint[1])),\n      Math.trunc(Math.min((input.shape[2] || 0), prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0])),\n      Math.trunc(Math.min((input.shape[1] || 0), prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1])),\n    ] : [0, 0, 0, 0];\n    const boxRaw: [number, number, number, number] = prediction.box ? [\n      prediction.box.startPoint[0] / (input.shape[2] || 0),\n      prediction.box.startPoint[1] / (input.shape[1] || 0),\n      (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / (input.shape[2] || 0),\n      (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / (input.shape[1] || 0),\n    ] : [0, 0, 0, 0];\n    results.push({\n      id: id++,\n      score: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n      boxScore: Math.round(100 * prediction.boxConfidence) / 100,\n      faceScore: Math.round(100 * prediction.faceConfidence) / 100,\n      box: clampedBox,\n      boxRaw,\n      mesh: prediction.mesh,\n      meshRaw,\n      annotations,\n      tensor: prediction.image,\n    });\n    if (prediction.coords) tf.dispose(prediction.coords);\n  }\n  return results;\n}\n\nexport async function load(config): Promise<[unknown, GraphModel | null, GraphModel | null]> {\n  if ((!faceModels[0] && config.face.enabled) || (!faceModels[1] && config.face.mesh.enabled) || (!faceModels[2] && config.face.iris.enabled)) {\n    // @ts-ignore type mismatch for GraphModel\n    faceModels = await Promise.all([\n      (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,\n      (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.mesh.modelPath), { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) : null,\n      (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.iris.modelPath), { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) : null,\n    ]);\n    if (config.face.mesh.enabled) {\n      if (!faceModels[1] || !faceModels[1]['modelUrl']) log('load model failed:', config.face.mesh.modelPath);\n      else if (config.debug) log('load model:', faceModels[1]['modelUrl']);\n    }\n    if (config.face.iris.enabled) {\n      if (!faceModels[2] || !faceModels[2]['modelUrl']) log('load model failed:', config.face.iris.modelPath);\n      else if (config.debug) log('load model:', faceModels[2]['modelUrl']);\n    }\n  } else if (config.debug) {\n    if (faceModels[0]) log('cached model:', faceModels[0].model['modelUrl']);\n    if (faceModels[1]) log('cached model:', faceModels[1]['modelUrl']);\n    if (faceModels[2]) log('cached model:', faceModels[2]['modelUrl']);\n  }\n  facePipeline = new facepipeline.Pipeline(faceModels[0], faceModels[1], faceModels[2]);\n  return faceModels;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "/**\n * HSE-FaceRes Module\n * Returns Age, Gender, Descriptor\n * Implements Face simmilarity function\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst last: Array<{\n  age: number,\n  gender: string,\n  genderScore: number,\n  descriptor: number[],\n}> = [];\n\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config: Config): Promise<GraphModel> {\n  const modelUrl = join(config.modelBasePath, config.face.description.modelPath);\n  if (!model) {\n    // @ts-ignore type mismatch for GraphModel\n    model = await tf.loadGraphModel(modelUrl);\n    if (!model) log('load model failed:', config.face.description.modelPath);\n    else if (config.debug) log('load model:', modelUrl);\n  } else if (config.debug) log('cached model:', modelUrl);\n  return model;\n}\n\nexport function similarity(embedding1: Array<number>, embedding2: Array<number>, order = 2): number {\n  if (!embedding1 || !embedding2) return 0;\n  if (embedding1?.length === 0 || embedding2?.length === 0) return 0;\n  if (embedding1?.length !== embedding2?.length) return 0;\n  // general minkowski distance, euclidean distance is limited case where order is 2\n  const distance = 5.0 * embedding1\n    .map((_val, i) => (Math.abs(embedding1[i] - embedding2[i]) ** order)) // distance squared\n    .reduce((sum, now) => (sum + now), 0) // sum all distances\n    ** (1 / order); // get root of\n  const res = Math.max(0, 100 - distance) / 100.0;\n  return res;\n}\n\nexport function match(embedding: Array<number>, db: DB, threshold = 0) {\n  let best = { similarity: 0, name: '', source: '', embedding: [] as number[] };\n  if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) return best;\n  for (const f of db) {\n    if (f.embedding && f.name) {\n      const perc = similarity(embedding, f.embedding);\n      if (perc > threshold && perc > best.similarity) best = { ...f, similarity: perc };\n    }\n  }\n  return best;\n}\n\nexport function enhance(input): Tensor {\n  const image = tf.tidy(() => {\n    // input received from detector is already normalized to 0..1\n    // input is also assumed to be straightened\n    const tensor = input.image || input.tensor || input;\n    if (!(tensor instanceof tf.Tensor)) return null;\n    // do a tight crop of image and resize it to fit the model\n    const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n    // const box = [[0.0, 0.0, 1.0, 1.0]]; // basically no crop for test\n    if (!model.inputs[0].shape) return null; // model has no shape so no point continuing\n    const crop = (tensor.shape.length === 3)\n      ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n      : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n\n    /*\n    // just resize to fit the embedding model instead of cropping\n    const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n    */\n\n    /*\n    // convert to black&white to avoid colorization impact\n    const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n    const [red, green, blue] = tf.split(crop, 3, 3);\n    const redNorm = tf.mul(red, rgb[0]);\n    const greenNorm = tf.mul(green, rgb[1]);\n    const blueNorm = tf.mul(blue, rgb[2]);\n    const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n    const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n    */\n\n    /*\n    // increase image pseudo-contrast 100%\n    // (or do it per-channel so mean is done on each channel)\n    // (or calculate histogram and do it based on histogram)\n    const mean = merge.mean();\n    const factor = 2;\n    const contrast = merge.sub(mean).mul(factor).add(mean);\n    */\n\n    /*\n    // normalize brightness from 0..1\n    // silly way of creating pseudo-hdr of image\n    const darken = crop.sub(crop.min());\n    const lighten = darken.div(darken.max());\n    */\n\n    const norm = tf.mul(crop, 255);\n\n    return norm;\n  });\n  return image;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n  if (!model) return null;\n  if ((skipped < config.face.description.skipFrames) && config.skipFrame && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n    skipped++;\n    return last[idx];\n  }\n  skipped = 0;\n  return new Promise(async (resolve) => {\n    const enhanced = enhance(image);\n\n    let resT;\n    const obj = {\n      age: <number>0,\n      gender: <string>'unknown',\n      genderScore: <number>0,\n      descriptor: <number[]>[],\n    };\n\n    if (config.face.description.enabled) resT = await model.predict(enhanced);\n    tf.dispose(enhanced);\n\n    if (resT) {\n      tf.tidy(() => {\n        const gender = resT.find((t) => t.shape[1] === 1).dataSync(); // inside tf.tidy\n        const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n        if (confidence > config.face.description.minConfidence) {\n          obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n          obj.genderScore = Math.min(0.99, confidence);\n        }\n        const age = tf.argMax(resT.find((t) => t.shape[1] === 100), 1).dataSync()[0]; // inside tf.tidy\n        const all = resT.find((t) => t.shape[1] === 100).dataSync(); // inside tf.tidy\n        obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n        const desc = resT.find((t) => t.shape[1] === 1024);\n        // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n        // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n\n        obj.descriptor = [...desc.dataSync()]; // inside tf.tidy\n      });\n      resT.forEach((t) => tf.dispose(t));\n    }\n\n    last[idx] = obj;\n    lastCount = count;\n    resolve(obj);\n  });\n}\n", "/**\n * Emotion Module\n */\n\nimport { log, join } from '../helpers';\nimport { Config } from '../config';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model;\n// let last: Array<{ score: number, emotion: string }> = [];\nconst last: Array<Array<{ score: number, emotion: string }>> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.face.emotion.modelPath));\n    if (!model || !model.modelUrl) log('load model failed:', config.face.emotion.modelPath);\n    else if (config.debug) log('load model:', model.modelUrl);\n  } else if (config.debug) log('cached model:', model.modelUrl);\n  return model;\n}\n\nexport async function predict(image: Tensor, config: Config, idx, count) {\n  if (!model) return null;\n  if ((skipped < config.face.emotion.skipFrames) && config.skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n    skipped++;\n    return last[idx];\n  }\n  skipped = 0;\n  return new Promise(async (resolve) => {\n    const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n    const [red, green, blue] = tf.split(resize, 3, 3);\n    tf.dispose(resize);\n    // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n    const redNorm = tf.mul(red, rgb[0]);\n    const greenNorm = tf.mul(green, rgb[1]);\n    const blueNorm = tf.mul(blue, rgb[2]);\n    tf.dispose(red);\n    tf.dispose(green);\n    tf.dispose(blue);\n    const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n    tf.dispose(redNorm);\n    tf.dispose(greenNorm);\n    tf.dispose(blueNorm);\n    const normalize = tf.tidy(() => tf.mul(tf.sub(grayscale, 0.5), 2));\n    tf.dispose(grayscale);\n    const obj: Array<{ score: number, emotion: string }> = [];\n    if (config.face.emotion.enabled) {\n      const emotionT = await model.predict(normalize); // result is already in range 0..1, no need for additional activation\n      const data = await emotionT.data();\n      tf.dispose(emotionT);\n      for (let i = 0; i < data.length; i++) {\n        if (data[i] > config.face.emotion.minConfidence) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] });\n      }\n      obj.sort((a, b) => b.score - a.score);\n    }\n    tf.dispose(normalize);\n    last[idx] = obj;\n    lastCount = count;\n    resolve(obj);\n  });\n}\n", "export const partNames = [\n  'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n  'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n  'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n  result[jointName] = i;\n  return result;\n}, {});\n\nconst connectedPartNames = [\n  ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n  ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n  ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n  ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n  ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n  ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n  ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n  ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n  ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n  ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n  ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n  ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n  ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n  ['rightKnee', 'rightAnkle'],\n];\n", "import * as kpt from './keypoints';\nimport { Body } from '../result';\n\nexport function eitherPointDoesntMeetConfidence(a, b, minConfidence) {\n  return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence) {\n  return kpt.connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n    if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n      return result;\n    }\n    result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n    return result;\n  }, []);\n}\n\nexport function getBoundingBox(keypoints): [number, number, number, number] {\n  const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n    maxX: Math.max(maxX, x),\n    maxY: Math.max(maxY, y),\n    minX: Math.min(minX, x),\n    minY: Math.min(minY, y),\n  }), {\n    maxX: Number.NEGATIVE_INFINITY,\n    maxY: Number.NEGATIVE_INFINITY,\n    minX: Number.POSITIVE_INFINITY,\n    minY: Number.POSITIVE_INFINITY,\n  });\n  return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]): Array<Body> {\n  const scaleY = height / inputResolutionHeight;\n  const scaleX = width / inputResolutionWidth;\n  const scalePose = (pose, i) => ({\n    id: i,\n    score: pose.score,\n    boxRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n    box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n    keypoints: pose.keypoints.map(({ score, part, position }) => ({\n      score,\n      part,\n      position: [Math.trunc(position.x * scaleX), Math.trunc(position.y * scaleY)],\n      positionRaw: [position.x / inputResolutionHeight, position.y / inputResolutionHeight],\n    })),\n  });\n  const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n  return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n  priorityQueue: Array<unknown>; // don't touch\n  numberOfElements: number;\n  getElementValue: unknown; // function call\n\n  constructor(maxSize, getElementValue) {\n    this.priorityQueue = new Array(maxSize);\n    this.numberOfElements = -1;\n    this.getElementValue = getElementValue;\n  }\n\n  enqueue(x) {\n    this.priorityQueue[++this.numberOfElements] = x;\n    this.swim(this.numberOfElements);\n  }\n\n  dequeue() {\n    const max = this.priorityQueue[0];\n    this.exchange(0, this.numberOfElements--);\n    this.sink(0);\n    this.priorityQueue[this.numberOfElements + 1] = null;\n    return max;\n  }\n\n  empty() { return this.numberOfElements === -1; }\n\n  size() { return this.numberOfElements + 1; }\n\n  all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n  max() { return this.priorityQueue[0]; }\n\n  swim(k) {\n    while (k > 0 && this.less(Math.floor(k / 2), k)) {\n      this.exchange(k, Math.floor(k / 2));\n      k = Math.floor(k / 2);\n    }\n  }\n\n  sink(k) {\n    while (2 * k <= this.numberOfElements) {\n      let j = 2 * k;\n      if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n      if (!this.less(k, j)) break;\n      this.exchange(k, j);\n      k = j;\n    }\n  }\n\n  getValueAt(i) {\n    // @ts-ignore getter is of unknown type\n    return this.getElementValue(this.priorityQueue[i]);\n  }\n\n  less(i, j) {\n    return this.getValueAt(i) < this.getValueAt(j);\n  }\n\n  exchange(i, j) {\n    const t = this.priorityQueue[i];\n    this.priorityQueue[i] = this.priorityQueue[j];\n    this.priorityQueue[j] = t;\n  }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n  return {\n    y: offsets.get(y, x, keypoint),\n    x: offsets.get(y, x, keypoint + kpt.count),\n  };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n  const { heatmapY, heatmapX, id: keypoint } = part;\n  const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n  return {\n    x: part.heatmapX * outputStride + x,\n    y: part.heatmapY * outputStride + y,\n  };\n}\n\nexport function fillArray(element, size) {\n  const result = new Array(size);\n  for (let i = 0; i < size; i++) {\n    result[i] = element;\n  }\n  return result;\n}\n\nexport function clamp(a, min, max) {\n  if (a < min) return min;\n  if (a > max) return max;\n  return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n  const dy = y2 - y1;\n  const dx = x2 - x1;\n  return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n  return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n  return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "import * as utils from './utils';\nimport * as kpt from './keypoints';\n\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n  const getDisplacement = (point) => ({\n    y: displacements.get(point.y, point.x, edgeId),\n    x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n  });\n  const getStridedIndexNearPoint = (point, height, width) => ({\n    y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n    x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n  });\n\n  const [height, width] = scores.shape;\n  // Nearest neighbor interpolation for the source->target displacements.\n  const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n  const displacement = getDisplacement(sourceKeypointIndices);\n  const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n  let targetKeypoint = displacedPoint;\n  for (let i = 0; i < offsetRefineStep; i++) {\n    const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n    const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n    targetKeypoint = utils.addVectors(\n      { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n      { x: offsetPoint.x, y: offsetPoint.y },\n    );\n  }\n  const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n  const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n  return { position: targetKeypoint, part: kpt.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n  const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.partIds[childJoinName]]));\n  const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n  const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n  const numParts = scores.shape[2]; // [21,21,17]\n  const numEdges = edgesFwd.length;\n  const keypoints = new Array(numParts);\n  // Start a new detection instance at the position of the root.\n  const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n  keypoints[root.part.id] = {\n    score: root.score,\n    part: kpt.partNames[root.part.id],\n    position: rootPoint,\n  };\n  // Decode the part positions upwards in the tree, following the backward displacements.\n  for (let edge = numEdges - 1; edge >= 0; --edge) {\n    const sourceId = edgesFwd[edge];\n    const targetId = edgesBwd[edge];\n    if (keypoints[sourceId] && !keypoints[targetId]) {\n      keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n    }\n  }\n  // Decode the part positions downwards in the tree, following the forward displacements.\n  for (let edge = 0; edge < numEdges; ++edge) {\n    const sourceId = edgesBwd[edge];\n    const targetId = edgesFwd[edge];\n    if (keypoints[sourceId] && !keypoints[targetId]) {\n      keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n    }\n  }\n  return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n  const [height, width] = scores.shape;\n  let localMaximum = true;\n  const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n  const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n  for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n    const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n    const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n    for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n      if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n        localMaximum = false;\n        break;\n      }\n    }\n    if (!localMaximum) break;\n  }\n  return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n  const [height, width, numKeypoints] = scores.shape;\n  const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n  for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n    for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n      for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n        const score = scores.get(heatmapY, heatmapX, keypointId);\n        // Only consider parts with score greater or equal to threshold as root candidates.\n        if (score < minConfidence) continue;\n        // Only consider keypoints whose score is maximum in a local window.\n        if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n      }\n    }\n  }\n  return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n  return poses.some(({ keypoints }) => {\n    const correspondingKeypoint = keypoints[keypointId]?.position;\n    if (!correspondingKeypoint) return false;\n    return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n  });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n  const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n    if (!withinRadius(existingPoses, position, keypointId)) result += score;\n    return result;\n  }, 0.0);\n  return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n  const poses: Array<{ keypoints, box: [number, number, number, number], score: number }> = [];\n  const queue = buildPartWithScoreQueue(minConfidence, scores);\n  // Generate at most maxDetected object instances per image in decreasing root part score order.\n  while (poses.length < maxDetected && !queue.empty()) {\n    // The top element in the queue is the next root candidate.\n    const root = queue.dequeue();\n    // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n    // @ts-ignore this one is tree walk\n    const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n    // @ts-ignore this one is tree walk\n    if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n    // Else start a new detection instance at the position of the root.\n    let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n    keypoints = keypoints.filter((a) => a.score > minConfidence);\n    const score = getInstanceScore(poses, keypoints);\n    const box = utils.getBoundingBox(keypoints);\n    if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n  }\n  return poses;\n}\n", "/**\n * PoseNet module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\nimport { Body } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\n\nexport async function predict(input: Tensor, config: Config): Promise<Body[]> {\n  const res = tf.tidy(() => {\n    if (!model.inputs[0].shape) return [];\n    const resized = tf.image.resizeBilinear(input, [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n    const normalized = tf.sub(tf.div(tf.cast(resized, 'float32'), 127.5), 1.0);\n    const results: Array<Tensor> = model.execute(normalized, poseNetOutputs) as Array<Tensor>;\n    const results3d = results.map((y) => tf.squeeze(y, [0]));\n    results3d[1] = results3d[1].sigmoid(); // apply sigmoid on scores\n    return results3d;\n  });\n\n  const buffers = await Promise.all(res.map((tensor) => tensor.buffer()));\n  for (const t of res) tf.dispose(t);\n\n  const decoded = await poses.decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n  if (!model.inputs[0].shape) return [];\n  const scaled = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as Body[];\n  return scaled;\n}\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    // @ts-ignore type mismatch for GraphModel\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n    if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n    else if (config.debug) log('load model:', model['modelUrl']);\n  } else if (config.debug) log('cached model:', model['modelUrl']);\n  return model;\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function getBoxSize(box) {\n  return [\n    Math.abs(box.endPoint[0] - box.startPoint[0]),\n    Math.abs(box.endPoint[1] - box.startPoint[1]),\n  ];\n}\n\nexport function getBoxCenter(box) {\n  return [\n    box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n    box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n  ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n  const h = image.shape[1];\n  const w = image.shape[2];\n  const boxes = [[\n    box.startPoint[1] / h,\n    box.startPoint[0] / w,\n    box.endPoint[1] / h,\n    box.endPoint[0] / w,\n  ]];\n  return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n  const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n  const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n  const palmLandmarks = box.palmLandmarks.map((coord) => {\n    const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n    return scaledCoord;\n  });\n  return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n  const center = getBoxCenter(box);\n  const size = getBoxSize(box);\n  const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n  const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n  const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n  return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n  const centers = getBoxCenter(box);\n  const size = getBoxSize(box);\n  const maxEdge = Math.max(...size);\n  const halfSize = maxEdge / 2;\n  const startPoint = [centers[0] - halfSize, centers[1] - halfSize];\n  const endPoint = [centers[0] + halfSize, centers[1] + halfSize];\n  return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n  const boxSize = [\n    box.endPoint[0] - box.startPoint[0],\n    box.endPoint[1] - box.startPoint[1],\n  ];\n  const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n  const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]];\n  const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]];\n  return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n", "export const anchors = [\n  { x: 0.015625, y: 0.015625 },\n  { x: 0.015625, y: 0.015625 },\n  { x: 0.046875, y: 0.015625 },\n  { x: 0.046875, y: 0.015625 },\n  { x: 0.078125, y: 0.015625 },\n  { x: 0.078125, y: 0.015625 },\n  { x: 0.109375, y: 0.015625 },\n  { x: 0.109375, y: 0.015625 },\n  { x: 0.140625, y: 0.015625 },\n  { x: 0.140625, y: 0.015625 },\n  { x: 0.171875, y: 0.015625 },\n  { x: 0.171875, y: 0.015625 },\n  { x: 0.203125, y: 0.015625 },\n  { x: 0.203125, y: 0.015625 },\n  { x: 0.234375, y: 0.015625 },\n  { x: 0.234375, y: 0.015625 },\n  { x: 0.265625, y: 0.015625 },\n  { x: 0.265625, y: 0.015625 },\n  { x: 0.296875, y: 0.015625 },\n  { x: 0.296875, y: 0.015625 },\n  { x: 0.328125, y: 0.015625 },\n  { x: 0.328125, y: 0.015625 },\n  { x: 0.359375, y: 0.015625 },\n  { x: 0.359375, y: 0.015625 },\n  { x: 0.390625, y: 0.015625 },\n  { x: 0.390625, y: 0.015625 },\n  { x: 0.421875, y: 0.015625 },\n  { x: 0.421875, y: 0.015625 },\n  { x: 0.453125, y: 0.015625 },\n  { x: 0.453125, y: 0.015625 },\n  { x: 0.484375, y: 0.015625 },\n  { x: 0.484375, y: 0.015625 },\n  { x: 0.515625, y: 0.015625 },\n  { x: 0.515625, y: 0.015625 },\n  { x: 0.546875, y: 0.015625 },\n  { x: 0.546875, y: 0.015625 },\n  { x: 0.578125, y: 0.015625 },\n  { x: 0.578125, y: 0.015625 },\n  { x: 0.609375, y: 0.015625 },\n  { x: 0.609375, y: 0.015625 },\n  { x: 0.640625, y: 0.015625 },\n  { x: 0.640625, y: 0.015625 },\n  { x: 0.671875, y: 0.015625 },\n  { x: 0.671875, y: 0.015625 },\n  { x: 0.703125, y: 0.015625 },\n  { x: 0.703125, y: 0.015625 },\n  { x: 0.734375, y: 0.015625 },\n  { x: 0.734375, y: 0.015625 },\n  { x: 0.765625, y: 0.015625 },\n  { x: 0.765625, y: 0.015625 },\n  { x: 0.796875, y: 0.015625 },\n  { x: 0.796875, y: 0.015625 },\n  { x: 0.828125, y: 0.015625 },\n  { x: 0.828125, y: 0.015625 },\n  { x: 0.859375, y: 0.015625 },\n  { x: 0.859375, y: 0.015625 },\n  { x: 0.890625, y: 0.015625 },\n  { x: 0.890625, y: 0.015625 },\n  { x: 0.921875, y: 0.015625 },\n  { x: 0.921875, y: 0.015625 },\n  { x: 0.953125, y: 0.015625 },\n  { x: 0.953125, y: 0.015625 },\n  { x: 0.984375, y: 0.015625 },\n  { x: 0.984375, y: 0.015625 },\n  { x: 0.015625, y: 0.046875 },\n  { x: 0.015625, y: 0.046875 },\n  { x: 0.046875, y: 0.046875 },\n  { x: 0.046875, y: 0.046875 },\n  { x: 0.078125, y: 0.046875 },\n  { x: 0.078125, y: 0.046875 },\n  { x: 0.109375, y: 0.046875 },\n  { x: 0.109375, y: 0.046875 },\n  { x: 0.140625, y: 0.046875 },\n  { x: 0.140625, y: 0.046875 },\n  { x: 0.171875, y: 0.046875 },\n  { x: 0.171875, y: 0.046875 },\n  { x: 0.203125, y: 0.046875 },\n  { x: 0.203125, y: 0.046875 },\n  { x: 0.234375, y: 0.046875 },\n  { x: 0.234375, y: 0.046875 },\n  { x: 0.265625, y: 0.046875 },\n  { x: 0.265625, y: 0.046875 },\n  { x: 0.296875, y: 0.046875 },\n  { x: 0.296875, y: 0.046875 },\n  { x: 0.328125, y: 0.046875 },\n  { x: 0.328125, y: 0.046875 },\n  { x: 0.359375, y: 0.046875 },\n  { x: 0.359375, y: 0.046875 },\n  { x: 0.390625, y: 0.046875 },\n  { x: 0.390625, y: 0.046875 },\n  { x: 0.421875, y: 0.046875 },\n  { x: 0.421875, y: 0.046875 },\n  { x: 0.453125, y: 0.046875 },\n  { x: 0.453125, y: 0.046875 },\n  { x: 0.484375, y: 0.046875 },\n  { x: 0.484375, y: 0.046875 },\n  { x: 0.515625, y: 0.046875 },\n  { x: 0.515625, y: 0.046875 },\n  { x: 0.546875, y: 0.046875 },\n  { x: 0.546875, y: 0.046875 },\n  { x: 0.578125, y: 0.046875 },\n  { x: 0.578125, y: 0.046875 },\n  { x: 0.609375, y: 0.046875 },\n  { x: 0.609375, y: 0.046875 },\n  { x: 0.640625, y: 0.046875 },\n  { x: 0.640625, y: 0.046875 },\n  { x: 0.671875, y: 0.046875 },\n  { x: 0.671875, y: 0.046875 },\n  { x: 0.703125, y: 0.046875 },\n  { x: 0.703125, y: 0.046875 },\n  { x: 0.734375, y: 0.046875 },\n  { x: 0.734375, y: 0.046875 },\n  { x: 0.765625, y: 0.046875 },\n  { x: 0.765625, y: 0.046875 },\n  { x: 0.796875, y: 0.046875 },\n  { x: 0.796875, y: 0.046875 },\n  { x: 0.828125, y: 0.046875 },\n  { x: 0.828125, y: 0.046875 },\n  { x: 0.859375, y: 0.046875 },\n  { x: 0.859375, y: 0.046875 },\n  { x: 0.890625, y: 0.046875 },\n  { x: 0.890625, y: 0.046875 },\n  { x: 0.921875, y: 0.046875 },\n  { x: 0.921875, y: 0.046875 },\n  { x: 0.953125, y: 0.046875 },\n  { x: 0.953125, y: 0.046875 },\n  { x: 0.984375, y: 0.046875 },\n  { x: 0.984375, y: 0.046875 },\n  { x: 0.015625, y: 0.078125 },\n  { x: 0.015625, y: 0.078125 },\n  { x: 0.046875, y: 0.078125 },\n  { x: 0.046875, y: 0.078125 },\n  { x: 0.078125, y: 0.078125 },\n  { x: 0.078125, y: 0.078125 },\n  { x: 0.109375, y: 0.078125 },\n  { x: 0.109375, y: 0.078125 },\n  { x: 0.140625, y: 0.078125 },\n  { x: 0.140625, y: 0.078125 },\n  { x: 0.171875, y: 0.078125 },\n  { x: 0.171875, y: 0.078125 },\n  { x: 0.203125, y: 0.078125 },\n  { x: 0.203125, y: 0.078125 },\n  { x: 0.234375, y: 0.078125 },\n  { x: 0.234375, y: 0.078125 },\n  { x: 0.265625, y: 0.078125 },\n  { x: 0.265625, y: 0.078125 },\n  { x: 0.296875, y: 0.078125 },\n  { x: 0.296875, y: 0.078125 },\n  { x: 0.328125, y: 0.078125 },\n  { x: 0.328125, y: 0.078125 },\n  { x: 0.359375, y: 0.078125 },\n  { x: 0.359375, y: 0.078125 },\n  { x: 0.390625, y: 0.078125 },\n  { x: 0.390625, y: 0.078125 },\n  { x: 0.421875, y: 0.078125 },\n  { x: 0.421875, y: 0.078125 },\n  { x: 0.453125, y: 0.078125 },\n  { x: 0.453125, y: 0.078125 },\n  { x: 0.484375, y: 0.078125 },\n  { x: 0.484375, y: 0.078125 },\n  { x: 0.515625, y: 0.078125 },\n  { x: 0.515625, y: 0.078125 },\n  { x: 0.546875, y: 0.078125 },\n  { x: 0.546875, y: 0.078125 },\n  { x: 0.578125, y: 0.078125 },\n  { x: 0.578125, y: 0.078125 },\n  { x: 0.609375, y: 0.078125 },\n  { x: 0.609375, y: 0.078125 },\n  { x: 0.640625, y: 0.078125 },\n  { x: 0.640625, y: 0.078125 },\n  { x: 0.671875, y: 0.078125 },\n  { x: 0.671875, y: 0.078125 },\n  { x: 0.703125, y: 0.078125 },\n  { x: 0.703125, y: 0.078125 },\n  { x: 0.734375, y: 0.078125 },\n  { x: 0.734375, y: 0.078125 },\n  { x: 0.765625, y: 0.078125 },\n  { x: 0.765625, y: 0.078125 },\n  { x: 0.796875, y: 0.078125 },\n  { x: 0.796875, y: 0.078125 },\n  { x: 0.828125, y: 0.078125 },\n  { x: 0.828125, y: 0.078125 },\n  { x: 0.859375, y: 0.078125 },\n  { x: 0.859375, y: 0.078125 },\n  { x: 0.890625, y: 0.078125 },\n  { x: 0.890625, y: 0.078125 },\n  { x: 0.921875, y: 0.078125 },\n  { x: 0.921875, y: 0.078125 },\n  { x: 0.953125, y: 0.078125 },\n  { x: 0.953125, y: 0.078125 },\n  { x: 0.984375, y: 0.078125 },\n  { x: 0.984375, y: 0.078125 },\n  { x: 0.015625, y: 0.109375 },\n  { x: 0.015625, y: 0.109375 },\n  { x: 0.046875, y: 0.109375 },\n  { x: 0.046875, y: 0.109375 },\n  { x: 0.078125, y: 0.109375 },\n  { x: 0.078125, y: 0.109375 },\n  { x: 0.109375, y: 0.109375 },\n  { x: 0.109375, y: 0.109375 },\n  { x: 0.140625, y: 0.109375 },\n  { x: 0.140625, y: 0.109375 },\n  { x: 0.171875, y: 0.109375 },\n  { x: 0.171875, y: 0.109375 },\n  { x: 0.203125, y: 0.109375 },\n  { x: 0.203125, y: 0.109375 },\n  { x: 0.234375, y: 0.109375 },\n  { x: 0.234375, y: 0.109375 },\n  { x: 0.265625, y: 0.109375 },\n  { x: 0.265625, y: 0.109375 },\n  { x: 0.296875, y: 0.109375 },\n  { x: 0.296875, y: 0.109375 },\n  { x: 0.328125, y: 0.109375 },\n  { x: 0.328125, y: 0.109375 },\n  { x: 0.359375, y: 0.109375 },\n  { x: 0.359375, y: 0.109375 },\n  { x: 0.390625, y: 0.109375 },\n  { x: 0.390625, y: 0.109375 },\n  { x: 0.421875, y: 0.109375 },\n  { x: 0.421875, y: 0.109375 },\n  { x: 0.453125, y: 0.109375 },\n  { x: 0.453125, y: 0.109375 },\n  { x: 0.484375, y: 0.109375 },\n  { x: 0.484375, y: 0.109375 },\n  { x: 0.515625, y: 0.109375 },\n  { x: 0.515625, y: 0.109375 },\n  { x: 0.546875, y: 0.109375 },\n  { x: 0.546875, y: 0.109375 },\n  { x: 0.578125, y: 0.109375 },\n  { x: 0.578125, y: 0.109375 },\n  { x: 0.609375, y: 0.109375 },\n  { x: 0.609375, y: 0.109375 },\n  { x: 0.640625, y: 0.109375 },\n  { x: 0.640625, y: 0.109375 },\n  { x: 0.671875, y: 0.109375 },\n  { x: 0.671875, y: 0.109375 },\n  { x: 0.703125, y: 0.109375 },\n  { x: 0.703125, y: 0.109375 },\n  { x: 0.734375, y: 0.109375 },\n  { x: 0.734375, y: 0.109375 },\n  { x: 0.765625, y: 0.109375 },\n  { x: 0.765625, y: 0.109375 },\n  { x: 0.796875, y: 0.109375 },\n  { x: 0.796875, y: 0.109375 },\n  { x: 0.828125, y: 0.109375 },\n  { x: 0.828125, y: 0.109375 },\n  { x: 0.859375, y: 0.109375 },\n  { x: 0.859375, y: 0.109375 },\n  { x: 0.890625, y: 0.109375 },\n  { x: 0.890625, y: 0.109375 },\n  { x: 0.921875, y: 0.109375 },\n  { x: 0.921875, y: 0.109375 },\n  { x: 0.953125, y: 0.109375 },\n  { x: 0.953125, y: 0.109375 },\n  { x: 0.984375, y: 0.109375 },\n  { x: 0.984375, y: 0.109375 },\n  { x: 0.015625, y: 0.140625 },\n  { x: 0.015625, y: 0.140625 },\n  { x: 0.046875, y: 0.140625 },\n  { x: 0.046875, y: 0.140625 },\n  { x: 0.078125, y: 0.140625 },\n  { x: 0.078125, y: 0.140625 },\n  { x: 0.109375, y: 0.140625 },\n  { x: 0.109375, y: 0.140625 },\n  { x: 0.140625, y: 0.140625 },\n  { x: 0.140625, y: 0.140625 },\n  { x: 0.171875, y: 0.140625 },\n  { x: 0.171875, y: 0.140625 },\n  { x: 0.203125, y: 0.140625 },\n  { x: 0.203125, y: 0.140625 },\n  { x: 0.234375, y: 0.140625 },\n  { x: 0.234375, y: 0.140625 },\n  { x: 0.265625, y: 0.140625 },\n  { x: 0.265625, y: 0.140625 },\n  { x: 0.296875, y: 0.140625 },\n  { x: 0.296875, y: 0.140625 },\n  { x: 0.328125, y: 0.140625 },\n  { x: 0.328125, y: 0.140625 },\n  { x: 0.359375, y: 0.140625 },\n  { x: 0.359375, y: 0.140625 },\n  { x: 0.390625, y: 0.140625 },\n  { x: 0.390625, y: 0.140625 },\n  { x: 0.421875, y: 0.140625 },\n  { x: 0.421875, y: 0.140625 },\n  { x: 0.453125, y: 0.140625 },\n  { x: 0.453125, y: 0.140625 },\n  { x: 0.484375, y: 0.140625 },\n  { x: 0.484375, y: 0.140625 },\n  { x: 0.515625, y: 0.140625 },\n  { x: 0.515625, y: 0.140625 },\n  { x: 0.546875, y: 0.140625 },\n  { x: 0.546875, y: 0.140625 },\n  { x: 0.578125, y: 0.140625 },\n  { x: 0.578125, y: 0.140625 },\n  { x: 0.609375, y: 0.140625 },\n  { x: 0.609375, y: 0.140625 },\n  { x: 0.640625, y: 0.140625 },\n  { x: 0.640625, y: 0.140625 },\n  { x: 0.671875, y: 0.140625 },\n  { x: 0.671875, y: 0.140625 },\n  { x: 0.703125, y: 0.140625 },\n  { x: 0.703125, y: 0.140625 },\n  { x: 0.734375, y: 0.140625 },\n  { x: 0.734375, y: 0.140625 },\n  { x: 0.765625, y: 0.140625 },\n  { x: 0.765625, y: 0.140625 },\n  { x: 0.796875, y: 0.140625 },\n  { x: 0.796875, y: 0.140625 },\n  { x: 0.828125, y: 0.140625 },\n  { x: 0.828125, y: 0.140625 },\n  { x: 0.859375, y: 0.140625 },\n  { x: 0.859375, y: 0.140625 },\n  { x: 0.890625, y: 0.140625 },\n  { x: 0.890625, y: 0.140625 },\n  { x: 0.921875, y: 0.140625 },\n  { x: 0.921875, y: 0.140625 },\n  { x: 0.953125, y: 0.140625 },\n  { x: 0.953125, y: 0.140625 },\n  { x: 0.984375, y: 0.140625 },\n  { x: 0.984375, y: 0.140625 },\n  { x: 0.015625, y: 0.171875 },\n  { x: 0.015625, y: 0.171875 },\n  { x: 0.046875, y: 0.171875 },\n  { x: 0.046875, y: 0.171875 },\n  { x: 0.078125, y: 0.171875 },\n  { x: 0.078125, y: 0.171875 },\n  { x: 0.109375, y: 0.171875 },\n  { x: 0.109375, y: 0.171875 },\n  { x: 0.140625, y: 0.171875 },\n  { x: 0.140625, y: 0.171875 },\n  { x: 0.171875, y: 0.171875 },\n  { x: 0.171875, y: 0.171875 },\n  { x: 0.203125, y: 0.171875 },\n  { x: 0.203125, y: 0.171875 },\n  { x: 0.234375, y: 0.171875 },\n  { x: 0.234375, y: 0.171875 },\n  { x: 0.265625, y: 0.171875 },\n  { x: 0.265625, y: 0.171875 },\n  { x: 0.296875, y: 0.171875 },\n  { x: 0.296875, y: 0.171875 },\n  { x: 0.328125, y: 0.171875 },\n  { x: 0.328125, y: 0.171875 },\n  { x: 0.359375, y: 0.171875 },\n  { x: 0.359375, y: 0.171875 },\n  { x: 0.390625, y: 0.171875 },\n  { x: 0.390625, y: 0.171875 },\n  { x: 0.421875, y: 0.171875 },\n  { x: 0.421875, y: 0.171875 },\n  { x: 0.453125, y: 0.171875 },\n  { x: 0.453125, y: 0.171875 },\n  { x: 0.484375, y: 0.171875 },\n  { x: 0.484375, y: 0.171875 },\n  { x: 0.515625, y: 0.171875 },\n  { x: 0.515625, y: 0.171875 },\n  { x: 0.546875, y: 0.171875 },\n  { x: 0.546875, y: 0.171875 },\n  { x: 0.578125, y: 0.171875 },\n  { x: 0.578125, y: 0.171875 },\n  { x: 0.609375, y: 0.171875 },\n  { x: 0.609375, y: 0.171875 },\n  { x: 0.640625, y: 0.171875 },\n  { x: 0.640625, y: 0.171875 },\n  { x: 0.671875, y: 0.171875 },\n  { x: 0.671875, y: 0.171875 },\n  { x: 0.703125, y: 0.171875 },\n  { x: 0.703125, y: 0.171875 },\n  { x: 0.734375, y: 0.171875 },\n  { x: 0.734375, y: 0.171875 },\n  { x: 0.765625, y: 0.171875 },\n  { x: 0.765625, y: 0.171875 },\n  { x: 0.796875, y: 0.171875 },\n  { x: 0.796875, y: 0.171875 },\n  { x: 0.828125, y: 0.171875 },\n  { x: 0.828125, y: 0.171875 },\n  { x: 0.859375, y: 0.171875 },\n  { x: 0.859375, y: 0.171875 },\n  { x: 0.890625, y: 0.171875 },\n  { x: 0.890625, y: 0.171875 },\n  { x: 0.921875, y: 0.171875 },\n  { x: 0.921875, y: 0.171875 },\n  { x: 0.953125, y: 0.171875 },\n  { x: 0.953125, y: 0.171875 },\n  { x: 0.984375, y: 0.171875 },\n  { x: 0.984375, y: 0.171875 },\n  { x: 0.015625, y: 0.203125 },\n  { x: 0.015625, y: 0.203125 },\n  { x: 0.046875, y: 0.203125 },\n  { x: 0.046875, y: 0.203125 },\n  { x: 0.078125, y: 0.203125 },\n  { x: 0.078125, y: 0.203125 },\n  { x: 0.109375, y: 0.203125 },\n  { x: 0.109375, y: 0.203125 },\n  { x: 0.140625, y: 0.203125 },\n  { x: 0.140625, y: 0.203125 },\n  { x: 0.171875, y: 0.203125 },\n  { x: 0.171875, y: 0.203125 },\n  { x: 0.203125, y: 0.203125 },\n  { x: 0.203125, y: 0.203125 },\n  { x: 0.234375, y: 0.203125 },\n  { x: 0.234375, y: 0.203125 },\n  { x: 0.265625, y: 0.203125 },\n  { x: 0.265625, y: 0.203125 },\n  { x: 0.296875, y: 0.203125 },\n  { x: 0.296875, y: 0.203125 },\n  { x: 0.328125, y: 0.203125 },\n  { x: 0.328125, y: 0.203125 },\n  { x: 0.359375, y: 0.203125 },\n  { x: 0.359375, y: 0.203125 },\n  { x: 0.390625, y: 0.203125 },\n  { x: 0.390625, y: 0.203125 },\n  { x: 0.421875, y: 0.203125 },\n  { x: 0.421875, y: 0.203125 },\n  { x: 0.453125, y: 0.203125 },\n  { x: 0.453125, y: 0.203125 },\n  { x: 0.484375, y: 0.203125 },\n  { x: 0.484375, y: 0.203125 },\n  { x: 0.515625, y: 0.203125 },\n  { x: 0.515625, y: 0.203125 },\n  { x: 0.546875, y: 0.203125 },\n  { x: 0.546875, y: 0.203125 },\n  { x: 0.578125, y: 0.203125 },\n  { x: 0.578125, y: 0.203125 },\n  { x: 0.609375, y: 0.203125 },\n  { x: 0.609375, y: 0.203125 },\n  { x: 0.640625, y: 0.203125 },\n  { x: 0.640625, y: 0.203125 },\n  { x: 0.671875, y: 0.203125 },\n  { x: 0.671875, y: 0.203125 },\n  { x: 0.703125, y: 0.203125 },\n  { x: 0.703125, y: 0.203125 },\n  { x: 0.734375, y: 0.203125 },\n  { x: 0.734375, y: 0.203125 },\n  { x: 0.765625, y: 0.203125 },\n  { x: 0.765625, y: 0.203125 },\n  { x: 0.796875, y: 0.203125 },\n  { x: 0.796875, y: 0.203125 },\n  { x: 0.828125, y: 0.203125 },\n  { x: 0.828125, y: 0.203125 },\n  { x: 0.859375, y: 0.203125 },\n  { x: 0.859375, y: 0.203125 },\n  { x: 0.890625, y: 0.203125 },\n  { x: 0.890625, y: 0.203125 },\n  { x: 0.921875, y: 0.203125 },\n  { x: 0.921875, y: 0.203125 },\n  { x: 0.953125, y: 0.203125 },\n  { x: 0.953125, y: 0.203125 },\n  { x: 0.984375, y: 0.203125 },\n  { x: 0.984375, y: 0.203125 },\n  { x: 0.015625, y: 0.234375 },\n  { x: 0.015625, y: 0.234375 },\n  { x: 0.046875, y: 0.234375 },\n  { x: 0.046875, y: 0.234375 },\n  { x: 0.078125, y: 0.234375 },\n  { x: 0.078125, y: 0.234375 },\n  { x: 0.109375, y: 0.234375 },\n  { x: 0.109375, y: 0.234375 },\n  { x: 0.140625, y: 0.234375 },\n  { x: 0.140625, y: 0.234375 },\n  { x: 0.171875, y: 0.234375 },\n  { x: 0.171875, y: 0.234375 },\n  { x: 0.203125, y: 0.234375 },\n  { x: 0.203125, y: 0.234375 },\n  { x: 0.234375, y: 0.234375 },\n  { x: 0.234375, y: 0.234375 },\n  { x: 0.265625, y: 0.234375 },\n  { x: 0.265625, y: 0.234375 },\n  { x: 0.296875, y: 0.234375 },\n  { x: 0.296875, y: 0.234375 },\n  { x: 0.328125, y: 0.234375 },\n  { x: 0.328125, y: 0.234375 },\n  { x: 0.359375, y: 0.234375 },\n  { x: 0.359375, y: 0.234375 },\n  { x: 0.390625, y: 0.234375 },\n  { x: 0.390625, y: 0.234375 },\n  { x: 0.421875, y: 0.234375 },\n  { x: 0.421875, y: 0.234375 },\n  { x: 0.453125, y: 0.234375 },\n  { x: 0.453125, y: 0.234375 },\n  { x: 0.484375, y: 0.234375 },\n  { x: 0.484375, y: 0.234375 },\n  { x: 0.515625, y: 0.234375 },\n  { x: 0.515625, y: 0.234375 },\n  { x: 0.546875, y: 0.234375 },\n  { x: 0.546875, y: 0.234375 },\n  { x: 0.578125, y: 0.234375 },\n  { x: 0.578125, y: 0.234375 },\n  { x: 0.609375, y: 0.234375 },\n  { x: 0.609375, y: 0.234375 },\n  { x: 0.640625, y: 0.234375 },\n  { x: 0.640625, y: 0.234375 },\n  { x: 0.671875, y: 0.234375 },\n  { x: 0.671875, y: 0.234375 },\n  { x: 0.703125, y: 0.234375 },\n  { x: 0.703125, y: 0.234375 },\n  { x: 0.734375, y: 0.234375 },\n  { x: 0.734375, y: 0.234375 },\n  { x: 0.765625, y: 0.234375 },\n  { x: 0.765625, y: 0.234375 },\n  { x: 0.796875, y: 0.234375 },\n  { x: 0.796875, y: 0.234375 },\n  { x: 0.828125, y: 0.234375 },\n  { x: 0.828125, y: 0.234375 },\n  { x: 0.859375, y: 0.234375 },\n  { x: 0.859375, y: 0.234375 },\n  { x: 0.890625, y: 0.234375 },\n  { x: 0.890625, y: 0.234375 },\n  { x: 0.921875, y: 0.234375 },\n  { x: 0.921875, y: 0.234375 },\n  { x: 0.953125, y: 0.234375 },\n  { x: 0.953125, y: 0.234375 },\n  { x: 0.984375, y: 0.234375 },\n  { x: 0.984375, y: 0.234375 },\n  { x: 0.015625, y: 0.265625 },\n  { x: 0.015625, y: 0.265625 },\n  { x: 0.046875, y: 0.265625 },\n  { x: 0.046875, y: 0.265625 },\n  { x: 0.078125, y: 0.265625 },\n  { x: 0.078125, y: 0.265625 },\n  { x: 0.109375, y: 0.265625 },\n  { x: 0.109375, y: 0.265625 },\n  { x: 0.140625, y: 0.265625 },\n  { x: 0.140625, y: 0.265625 },\n  { x: 0.171875, y: 0.265625 },\n  { x: 0.171875, y: 0.265625 },\n  { x: 0.203125, y: 0.265625 },\n  { x: 0.203125, y: 0.265625 },\n  { x: 0.234375, y: 0.265625 },\n  { x: 0.234375, y: 0.265625 },\n  { x: 0.265625, y: 0.265625 },\n  { x: 0.265625, y: 0.265625 },\n  { x: 0.296875, y: 0.265625 },\n  { x: 0.296875, y: 0.265625 },\n  { x: 0.328125, y: 0.265625 },\n  { x: 0.328125, y: 0.265625 },\n  { x: 0.359375, y: 0.265625 },\n  { x: 0.359375, y: 0.265625 },\n  { x: 0.390625, y: 0.265625 },\n  { x: 0.390625, y: 0.265625 },\n  { x: 0.421875, y: 0.265625 },\n  { x: 0.421875, y: 0.265625 },\n  { x: 0.453125, y: 0.265625 },\n  { x: 0.453125, y: 0.265625 },\n  { x: 0.484375, y: 0.265625 },\n  { x: 0.484375, y: 0.265625 },\n  { x: 0.515625, y: 0.265625 },\n  { x: 0.515625, y: 0.265625 },\n  { x: 0.546875, y: 0.265625 },\n  { x: 0.546875, y: 0.265625 },\n  { x: 0.578125, y: 0.265625 },\n  { x: 0.578125, y: 0.265625 },\n  { x: 0.609375, y: 0.265625 },\n  { x: 0.609375, y: 0.265625 },\n  { x: 0.640625, y: 0.265625 },\n  { x: 0.640625, y: 0.265625 },\n  { x: 0.671875, y: 0.265625 },\n  { x: 0.671875, y: 0.265625 },\n  { x: 0.703125, y: 0.265625 },\n  { x: 0.703125, y: 0.265625 },\n  { x: 0.734375, y: 0.265625 },\n  { x: 0.734375, y: 0.265625 },\n  { x: 0.765625, y: 0.265625 },\n  { x: 0.765625, y: 0.265625 },\n  { x: 0.796875, y: 0.265625 },\n  { x: 0.796875, y: 0.265625 },\n  { x: 0.828125, y: 0.265625 },\n  { x: 0.828125, y: 0.265625 },\n  { x: 0.859375, y: 0.265625 },\n  { x: 0.859375, y: 0.265625 },\n  { x: 0.890625, y: 0.265625 },\n  { x: 0.890625, y: 0.265625 },\n  { x: 0.921875, y: 0.265625 },\n  { x: 0.921875, y: 0.265625 },\n  { x: 0.953125, y: 0.265625 },\n  { x: 0.953125, y: 0.265625 },\n  { x: 0.984375, y: 0.265625 },\n  { x: 0.984375, y: 0.265625 },\n  { x: 0.015625, y: 0.296875 },\n  { x: 0.015625, y: 0.296875 },\n  { x: 0.046875, y: 0.296875 },\n  { x: 0.046875, y: 0.296875 },\n  { x: 0.078125, y: 0.296875 },\n  { x: 0.078125, y: 0.296875 },\n  { x: 0.109375, y: 0.296875 },\n  { x: 0.109375, y: 0.296875 },\n  { x: 0.140625, y: 0.296875 },\n  { x: 0.140625, y: 0.296875 },\n  { x: 0.171875, y: 0.296875 },\n  { x: 0.171875, y: 0.296875 },\n  { x: 0.203125, y: 0.296875 },\n  { x: 0.203125, y: 0.296875 },\n  { x: 0.234375, y: 0.296875 },\n  { x: 0.234375, y: 0.296875 },\n  { x: 0.265625, y: 0.296875 },\n  { x: 0.265625, y: 0.296875 },\n  { x: 0.296875, y: 0.296875 },\n  { x: 0.296875, y: 0.296875 },\n  { x: 0.328125, y: 0.296875 },\n  { x: 0.328125, y: 0.296875 },\n  { x: 0.359375, y: 0.296875 },\n  { x: 0.359375, y: 0.296875 },\n  { x: 0.390625, y: 0.296875 },\n  { x: 0.390625, y: 0.296875 },\n  { x: 0.421875, y: 0.296875 },\n  { x: 0.421875, y: 0.296875 },\n  { x: 0.453125, y: 0.296875 },\n  { x: 0.453125, y: 0.296875 },\n  { x: 0.484375, y: 0.296875 },\n  { x: 0.484375, y: 0.296875 },\n  { x: 0.515625, y: 0.296875 },\n  { x: 0.515625, y: 0.296875 },\n  { x: 0.546875, y: 0.296875 },\n  { x: 0.546875, y: 0.296875 },\n  { x: 0.578125, y: 0.296875 },\n  { x: 0.578125, y: 0.296875 },\n  { x: 0.609375, y: 0.296875 },\n  { x: 0.609375, y: 0.296875 },\n  { x: 0.640625, y: 0.296875 },\n  { x: 0.640625, y: 0.296875 },\n  { x: 0.671875, y: 0.296875 },\n  { x: 0.671875, y: 0.296875 },\n  { x: 0.703125, y: 0.296875 },\n  { x: 0.703125, y: 0.296875 },\n  { x: 0.734375, y: 0.296875 },\n  { x: 0.734375, y: 0.296875 },\n  { x: 0.765625, y: 0.296875 },\n  { x: 0.765625, y: 0.296875 },\n  { x: 0.796875, y: 0.296875 },\n  { x: 0.796875, y: 0.296875 },\n  { x: 0.828125, y: 0.296875 },\n  { x: 0.828125, y: 0.296875 },\n  { x: 0.859375, y: 0.296875 },\n  { x: 0.859375, y: 0.296875 },\n  { x: 0.890625, y: 0.296875 },\n  { x: 0.890625, y: 0.296875 },\n  { x: 0.921875, y: 0.296875 },\n  { x: 0.921875, y: 0.296875 },\n  { x: 0.953125, y: 0.296875 },\n  { x: 0.953125, y: 0.296875 },\n  { x: 0.984375, y: 0.296875 },\n  { x: 0.984375, y: 0.296875 },\n  { x: 0.015625, y: 0.328125 },\n  { x: 0.015625, y: 0.328125 },\n  { x: 0.046875, y: 0.328125 },\n  { x: 0.046875, y: 0.328125 },\n  { x: 0.078125, y: 0.328125 },\n  { x: 0.078125, y: 0.328125 },\n  { x: 0.109375, y: 0.328125 },\n  { x: 0.109375, y: 0.328125 },\n  { x: 0.140625, y: 0.328125 },\n  { x: 0.140625, y: 0.328125 },\n  { x: 0.171875, y: 0.328125 },\n  { x: 0.171875, y: 0.328125 },\n  { x: 0.203125, y: 0.328125 },\n  { x: 0.203125, y: 0.328125 },\n  { x: 0.234375, y: 0.328125 },\n  { x: 0.234375, y: 0.328125 },\n  { x: 0.265625, y: 0.328125 },\n  { x: 0.265625, y: 0.328125 },\n  { x: 0.296875, y: 0.328125 },\n  { x: 0.296875, y: 0.328125 },\n  { x: 0.328125, y: 0.328125 },\n  { x: 0.328125, y: 0.328125 },\n  { x: 0.359375, y: 0.328125 },\n  { x: 0.359375, y: 0.328125 },\n  { x: 0.390625, y: 0.328125 },\n  { x: 0.390625, y: 0.328125 },\n  { x: 0.421875, y: 0.328125 },\n  { x: 0.421875, y: 0.328125 },\n  { x: 0.453125, y: 0.328125 },\n  { x: 0.453125, y: 0.328125 },\n  { x: 0.484375, y: 0.328125 },\n  { x: 0.484375, y: 0.328125 },\n  { x: 0.515625, y: 0.328125 },\n  { x: 0.515625, y: 0.328125 },\n  { x: 0.546875, y: 0.328125 },\n  { x: 0.546875, y: 0.328125 },\n  { x: 0.578125, y: 0.328125 },\n  { x: 0.578125, y: 0.328125 },\n  { x: 0.609375, y: 0.328125 },\n  { x: 0.609375, y: 0.328125 },\n  { x: 0.640625, y: 0.328125 },\n  { x: 0.640625, y: 0.328125 },\n  { x: 0.671875, y: 0.328125 },\n  { x: 0.671875, y: 0.328125 },\n  { x: 0.703125, y: 0.328125 },\n  { x: 0.703125, y: 0.328125 },\n  { x: 0.734375, y: 0.328125 },\n  { x: 0.734375, y: 0.328125 },\n  { x: 0.765625, y: 0.328125 },\n  { x: 0.765625, y: 0.328125 },\n  { x: 0.796875, y: 0.328125 },\n  { x: 0.796875, y: 0.328125 },\n  { x: 0.828125, y: 0.328125 },\n  { x: 0.828125, y: 0.328125 },\n  { x: 0.859375, y: 0.328125 },\n  { x: 0.859375, y: 0.328125 },\n  { x: 0.890625, y: 0.328125 },\n  { x: 0.890625, y: 0.328125 },\n  { x: 0.921875, y: 0.328125 },\n  { x: 0.921875, y: 0.328125 },\n  { x: 0.953125, y: 0.328125 },\n  { x: 0.953125, y: 0.328125 },\n  { x: 0.984375, y: 0.328125 },\n  { x: 0.984375, y: 0.328125 },\n  { x: 0.015625, y: 0.359375 },\n  { x: 0.015625, y: 0.359375 },\n  { x: 0.046875, y: 0.359375 },\n  { x: 0.046875, y: 0.359375 },\n  { x: 0.078125, y: 0.359375 },\n  { x: 0.078125, y: 0.359375 },\n  { x: 0.109375, y: 0.359375 },\n  { x: 0.109375, y: 0.359375 },\n  { x: 0.140625, y: 0.359375 },\n  { x: 0.140625, y: 0.359375 },\n  { x: 0.171875, y: 0.359375 },\n  { x: 0.171875, y: 0.359375 },\n  { x: 0.203125, y: 0.359375 },\n  { x: 0.203125, y: 0.359375 },\n  { x: 0.234375, y: 0.359375 },\n  { x: 0.234375, y: 0.359375 },\n  { x: 0.265625, y: 0.359375 },\n  { x: 0.265625, y: 0.359375 },\n  { x: 0.296875, y: 0.359375 },\n  { x: 0.296875, y: 0.359375 },\n  { x: 0.328125, y: 0.359375 },\n  { x: 0.328125, y: 0.359375 },\n  { x: 0.359375, y: 0.359375 },\n  { x: 0.359375, y: 0.359375 },\n  { x: 0.390625, y: 0.359375 },\n  { x: 0.390625, y: 0.359375 },\n  { x: 0.421875, y: 0.359375 },\n  { x: 0.421875, y: 0.359375 },\n  { x: 0.453125, y: 0.359375 },\n  { x: 0.453125, y: 0.359375 },\n  { x: 0.484375, y: 0.359375 },\n  { x: 0.484375, y: 0.359375 },\n  { x: 0.515625, y: 0.359375 },\n  { x: 0.515625, y: 0.359375 },\n  { x: 0.546875, y: 0.359375 },\n  { x: 0.546875, y: 0.359375 },\n  { x: 0.578125, y: 0.359375 },\n  { x: 0.578125, y: 0.359375 },\n  { x: 0.609375, y: 0.359375 },\n  { x: 0.609375, y: 0.359375 },\n  { x: 0.640625, y: 0.359375 },\n  { x: 0.640625, y: 0.359375 },\n  { x: 0.671875, y: 0.359375 },\n  { x: 0.671875, y: 0.359375 },\n  { x: 0.703125, y: 0.359375 },\n  { x: 0.703125, y: 0.359375 },\n  { x: 0.734375, y: 0.359375 },\n  { x: 0.734375, y: 0.359375 },\n  { x: 0.765625, y: 0.359375 },\n  { x: 0.765625, y: 0.359375 },\n  { x: 0.796875, y: 0.359375 },\n  { x: 0.796875, y: 0.359375 },\n  { x: 0.828125, y: 0.359375 },\n  { x: 0.828125, y: 0.359375 },\n  { x: 0.859375, y: 0.359375 },\n  { x: 0.859375, y: 0.359375 },\n  { x: 0.890625, y: 0.359375 },\n  { x: 0.890625, y: 0.359375 },\n  { x: 0.921875, y: 0.359375 },\n  { x: 0.921875, y: 0.359375 },\n  { x: 0.953125, y: 0.359375 },\n  { x: 0.953125, y: 0.359375 },\n  { x: 0.984375, y: 0.359375 },\n  { x: 0.984375, y: 0.359375 },\n  { x: 0.015625, y: 0.390625 },\n  { x: 0.015625, y: 0.390625 },\n  { x: 0.046875, y: 0.390625 },\n  { x: 0.046875, y: 0.390625 },\n  { x: 0.078125, y: 0.390625 },\n  { x: 0.078125, y: 0.390625 },\n  { x: 0.109375, y: 0.390625 },\n  { x: 0.109375, y: 0.390625 },\n  { x: 0.140625, y: 0.390625 },\n  { x: 0.140625, y: 0.390625 },\n  { x: 0.171875, y: 0.390625 },\n  { x: 0.171875, y: 0.390625 },\n  { x: 0.203125, y: 0.390625 },\n  { x: 0.203125, y: 0.390625 },\n  { x: 0.234375, y: 0.390625 },\n  { x: 0.234375, y: 0.390625 },\n  { x: 0.265625, y: 0.390625 },\n  { x: 0.265625, y: 0.390625 },\n  { x: 0.296875, y: 0.390625 },\n  { x: 0.296875, y: 0.390625 },\n  { x: 0.328125, y: 0.390625 },\n  { x: 0.328125, y: 0.390625 },\n  { x: 0.359375, y: 0.390625 },\n  { x: 0.359375, y: 0.390625 },\n  { x: 0.390625, y: 0.390625 },\n  { x: 0.390625, y: 0.390625 },\n  { x: 0.421875, y: 0.390625 },\n  { x: 0.421875, y: 0.390625 },\n  { x: 0.453125, y: 0.390625 },\n  { x: 0.453125, y: 0.390625 },\n  { x: 0.484375, y: 0.390625 },\n  { x: 0.484375, y: 0.390625 },\n  { x: 0.515625, y: 0.390625 },\n  { x: 0.515625, y: 0.390625 },\n  { x: 0.546875, y: 0.390625 },\n  { x: 0.546875, y: 0.390625 },\n  { x: 0.578125, y: 0.390625 },\n  { x: 0.578125, y: 0.390625 },\n  { x: 0.609375, y: 0.390625 },\n  { x: 0.609375, y: 0.390625 },\n  { x: 0.640625, y: 0.390625 },\n  { x: 0.640625, y: 0.390625 },\n  { x: 0.671875, y: 0.390625 },\n  { x: 0.671875, y: 0.390625 },\n  { x: 0.703125, y: 0.390625 },\n  { x: 0.703125, y: 0.390625 },\n  { x: 0.734375, y: 0.390625 },\n  { x: 0.734375, y: 0.390625 },\n  { x: 0.765625, y: 0.390625 },\n  { x: 0.765625, y: 0.390625 },\n  { x: 0.796875, y: 0.390625 },\n  { x: 0.796875, y: 0.390625 },\n  { x: 0.828125, y: 0.390625 },\n  { x: 0.828125, y: 0.390625 },\n  { x: 0.859375, y: 0.390625 },\n  { x: 0.859375, y: 0.390625 },\n  { x: 0.890625, y: 0.390625 },\n  { x: 0.890625, y: 0.390625 },\n  { x: 0.921875, y: 0.390625 },\n  { x: 0.921875, y: 0.390625 },\n  { x: 0.953125, y: 0.390625 },\n  { x: 0.953125, y: 0.390625 },\n  { x: 0.984375, y: 0.390625 },\n  { x: 0.984375, y: 0.390625 },\n  { x: 0.015625, y: 0.421875 },\n  { x: 0.015625, y: 0.421875 },\n  { x: 0.046875, y: 0.421875 },\n  { x: 0.046875, y: 0.421875 },\n  { x: 0.078125, y: 0.421875 },\n  { x: 0.078125, y: 0.421875 },\n  { x: 0.109375, y: 0.421875 },\n  { x: 0.109375, y: 0.421875 },\n  { x: 0.140625, y: 0.421875 },\n  { x: 0.140625, y: 0.421875 },\n  { x: 0.171875, y: 0.421875 },\n  { x: 0.171875, y: 0.421875 },\n  { x: 0.203125, y: 0.421875 },\n  { x: 0.203125, y: 0.421875 },\n  { x: 0.234375, y: 0.421875 },\n  { x: 0.234375, y: 0.421875 },\n  { x: 0.265625, y: 0.421875 },\n  { x: 0.265625, y: 0.421875 },\n  { x: 0.296875, y: 0.421875 },\n  { x: 0.296875, y: 0.421875 },\n  { x: 0.328125, y: 0.421875 },\n  { x: 0.328125, y: 0.421875 },\n  { x: 0.359375, y: 0.421875 },\n  { x: 0.359375, y: 0.421875 },\n  { x: 0.390625, y: 0.421875 },\n  { x: 0.390625, y: 0.421875 },\n  { x: 0.421875, y: 0.421875 },\n  { x: 0.421875, y: 0.421875 },\n  { x: 0.453125, y: 0.421875 },\n  { x: 0.453125, y: 0.421875 },\n  { x: 0.484375, y: 0.421875 },\n  { x: 0.484375, y: 0.421875 },\n  { x: 0.515625, y: 0.421875 },\n  { x: 0.515625, y: 0.421875 },\n  { x: 0.546875, y: 0.421875 },\n  { x: 0.546875, y: 0.421875 },\n  { x: 0.578125, y: 0.421875 },\n  { x: 0.578125, y: 0.421875 },\n  { x: 0.609375, y: 0.421875 },\n  { x: 0.609375, y: 0.421875 },\n  { x: 0.640625, y: 0.421875 },\n  { x: 0.640625, y: 0.421875 },\n  { x: 0.671875, y: 0.421875 },\n  { x: 0.671875, y: 0.421875 },\n  { x: 0.703125, y: 0.421875 },\n  { x: 0.703125, y: 0.421875 },\n  { x: 0.734375, y: 0.421875 },\n  { x: 0.734375, y: 0.421875 },\n  { x: 0.765625, y: 0.421875 },\n  { x: 0.765625, y: 0.421875 },\n  { x: 0.796875, y: 0.421875 },\n  { x: 0.796875, y: 0.421875 },\n  { x: 0.828125, y: 0.421875 },\n  { x: 0.828125, y: 0.421875 },\n  { x: 0.859375, y: 0.421875 },\n  { x: 0.859375, y: 0.421875 },\n  { x: 0.890625, y: 0.421875 },\n  { x: 0.890625, y: 0.421875 },\n  { x: 0.921875, y: 0.421875 },\n  { x: 0.921875, y: 0.421875 },\n  { x: 0.953125, y: 0.421875 },\n  { x: 0.953125, y: 0.421875 },\n  { x: 0.984375, y: 0.421875 },\n  { x: 0.984375, y: 0.421875 },\n  { x: 0.015625, y: 0.453125 },\n  { x: 0.015625, y: 0.453125 },\n  { x: 0.046875, y: 0.453125 },\n  { x: 0.046875, y: 0.453125 },\n  { x: 0.078125, y: 0.453125 },\n  { x: 0.078125, y: 0.453125 },\n  { x: 0.109375, y: 0.453125 },\n  { x: 0.109375, y: 0.453125 },\n  { x: 0.140625, y: 0.453125 },\n  { x: 0.140625, y: 0.453125 },\n  { x: 0.171875, y: 0.453125 },\n  { x: 0.171875, y: 0.453125 },\n  { x: 0.203125, y: 0.453125 },\n  { x: 0.203125, y: 0.453125 },\n  { x: 0.234375, y: 0.453125 },\n  { x: 0.234375, y: 0.453125 },\n  { x: 0.265625, y: 0.453125 },\n  { x: 0.265625, y: 0.453125 },\n  { x: 0.296875, y: 0.453125 },\n  { x: 0.296875, y: 0.453125 },\n  { x: 0.328125, y: 0.453125 },\n  { x: 0.328125, y: 0.453125 },\n  { x: 0.359375, y: 0.453125 },\n  { x: 0.359375, y: 0.453125 },\n  { x: 0.390625, y: 0.453125 },\n  { x: 0.390625, y: 0.453125 },\n  { x: 0.421875, y: 0.453125 },\n  { x: 0.421875, y: 0.453125 },\n  { x: 0.453125, y: 0.453125 },\n  { x: 0.453125, y: 0.453125 },\n  { x: 0.484375, y: 0.453125 },\n  { x: 0.484375, y: 0.453125 },\n  { x: 0.515625, y: 0.453125 },\n  { x: 0.515625, y: 0.453125 },\n  { x: 0.546875, y: 0.453125 },\n  { x: 0.546875, y: 0.453125 },\n  { x: 0.578125, y: 0.453125 },\n  { x: 0.578125, y: 0.453125 },\n  { x: 0.609375, y: 0.453125 },\n  { x: 0.609375, y: 0.453125 },\n  { x: 0.640625, y: 0.453125 },\n  { x: 0.640625, y: 0.453125 },\n  { x: 0.671875, y: 0.453125 },\n  { x: 0.671875, y: 0.453125 },\n  { x: 0.703125, y: 0.453125 },\n  { x: 0.703125, y: 0.453125 },\n  { x: 0.734375, y: 0.453125 },\n  { x: 0.734375, y: 0.453125 },\n  { x: 0.765625, y: 0.453125 },\n  { x: 0.765625, y: 0.453125 },\n  { x: 0.796875, y: 0.453125 },\n  { x: 0.796875, y: 0.453125 },\n  { x: 0.828125, y: 0.453125 },\n  { x: 0.828125, y: 0.453125 },\n  { x: 0.859375, y: 0.453125 },\n  { x: 0.859375, y: 0.453125 },\n  { x: 0.890625, y: 0.453125 },\n  { x: 0.890625, y: 0.453125 },\n  { x: 0.921875, y: 0.453125 },\n  { x: 0.921875, y: 0.453125 },\n  { x: 0.953125, y: 0.453125 },\n  { x: 0.953125, y: 0.453125 },\n  { x: 0.984375, y: 0.453125 },\n  { x: 0.984375, y: 0.453125 },\n  { x: 0.015625, y: 0.484375 },\n  { x: 0.015625, y: 0.484375 },\n  { x: 0.046875, y: 0.484375 },\n  { x: 0.046875, y: 0.484375 },\n  { x: 0.078125, y: 0.484375 },\n  { x: 0.078125, y: 0.484375 },\n  { x: 0.109375, y: 0.484375 },\n  { x: 0.109375, y: 0.484375 },\n  { x: 0.140625, y: 0.484375 },\n  { x: 0.140625, y: 0.484375 },\n  { x: 0.171875, y: 0.484375 },\n  { x: 0.171875, y: 0.484375 },\n  { x: 0.203125, y: 0.484375 },\n  { x: 0.203125, y: 0.484375 },\n  { x: 0.234375, y: 0.484375 },\n  { x: 0.234375, y: 0.484375 },\n  { x: 0.265625, y: 0.484375 },\n  { x: 0.265625, y: 0.484375 },\n  { x: 0.296875, y: 0.484375 },\n  { x: 0.296875, y: 0.484375 },\n  { x: 0.328125, y: 0.484375 },\n  { x: 0.328125, y: 0.484375 },\n  { x: 0.359375, y: 0.484375 },\n  { x: 0.359375, y: 0.484375 },\n  { x: 0.390625, y: 0.484375 },\n  { x: 0.390625, y: 0.484375 },\n  { x: 0.421875, y: 0.484375 },\n  { x: 0.421875, y: 0.484375 },\n  { x: 0.453125, y: 0.484375 },\n  { x: 0.453125, y: 0.484375 },\n  { x: 0.484375, y: 0.484375 },\n  { x: 0.484375, y: 0.484375 },\n  { x: 0.515625, y: 0.484375 },\n  { x: 0.515625, y: 0.484375 },\n  { x: 0.546875, y: 0.484375 },\n  { x: 0.546875, y: 0.484375 },\n  { x: 0.578125, y: 0.484375 },\n  { x: 0.578125, y: 0.484375 },\n  { x: 0.609375, y: 0.484375 },\n  { x: 0.609375, y: 0.484375 },\n  { x: 0.640625, y: 0.484375 },\n  { x: 0.640625, y: 0.484375 },\n  { x: 0.671875, y: 0.484375 },\n  { x: 0.671875, y: 0.484375 },\n  { x: 0.703125, y: 0.484375 },\n  { x: 0.703125, y: 0.484375 },\n  { x: 0.734375, y: 0.484375 },\n  { x: 0.734375, y: 0.484375 },\n  { x: 0.765625, y: 0.484375 },\n  { x: 0.765625, y: 0.484375 },\n  { x: 0.796875, y: 0.484375 },\n  { x: 0.796875, y: 0.484375 },\n  { x: 0.828125, y: 0.484375 },\n  { x: 0.828125, y: 0.484375 },\n  { x: 0.859375, y: 0.484375 },\n  { x: 0.859375, y: 0.484375 },\n  { x: 0.890625, y: 0.484375 },\n  { x: 0.890625, y: 0.484375 },\n  { x: 0.921875, y: 0.484375 },\n  { x: 0.921875, y: 0.484375 },\n  { x: 0.953125, y: 0.484375 },\n  { x: 0.953125, y: 0.484375 },\n  { x: 0.984375, y: 0.484375 },\n  { x: 0.984375, y: 0.484375 },\n  { x: 0.015625, y: 0.515625 },\n  { x: 0.015625, y: 0.515625 },\n  { x: 0.046875, y: 0.515625 },\n  { x: 0.046875, y: 0.515625 },\n  { x: 0.078125, y: 0.515625 },\n  { x: 0.078125, y: 0.515625 },\n  { x: 0.109375, y: 0.515625 },\n  { x: 0.109375, y: 0.515625 },\n  { x: 0.140625, y: 0.515625 },\n  { x: 0.140625, y: 0.515625 },\n  { x: 0.171875, y: 0.515625 },\n  { x: 0.171875, y: 0.515625 },\n  { x: 0.203125, y: 0.515625 },\n  { x: 0.203125, y: 0.515625 },\n  { x: 0.234375, y: 0.515625 },\n  { x: 0.234375, y: 0.515625 },\n  { x: 0.265625, y: 0.515625 },\n  { x: 0.265625, y: 0.515625 },\n  { x: 0.296875, y: 0.515625 },\n  { x: 0.296875, y: 0.515625 },\n  { x: 0.328125, y: 0.515625 },\n  { x: 0.328125, y: 0.515625 },\n  { x: 0.359375, y: 0.515625 },\n  { x: 0.359375, y: 0.515625 },\n  { x: 0.390625, y: 0.515625 },\n  { x: 0.390625, y: 0.515625 },\n  { x: 0.421875, y: 0.515625 },\n  { x: 0.421875, y: 0.515625 },\n  { x: 0.453125, y: 0.515625 },\n  { x: 0.453125, y: 0.515625 },\n  { x: 0.484375, y: 0.515625 },\n  { x: 0.484375, y: 0.515625 },\n  { x: 0.515625, y: 0.515625 },\n  { x: 0.515625, y: 0.515625 },\n  { x: 0.546875, y: 0.515625 },\n  { x: 0.546875, y: 0.515625 },\n  { x: 0.578125, y: 0.515625 },\n  { x: 0.578125, y: 0.515625 },\n  { x: 0.609375, y: 0.515625 },\n  { x: 0.609375, y: 0.515625 },\n  { x: 0.640625, y: 0.515625 },\n  { x: 0.640625, y: 0.515625 },\n  { x: 0.671875, y: 0.515625 },\n  { x: 0.671875, y: 0.515625 },\n  { x: 0.703125, y: 0.515625 },\n  { x: 0.703125, y: 0.515625 },\n  { x: 0.734375, y: 0.515625 },\n  { x: 0.734375, y: 0.515625 },\n  { x: 0.765625, y: 0.515625 },\n  { x: 0.765625, y: 0.515625 },\n  { x: 0.796875, y: 0.515625 },\n  { x: 0.796875, y: 0.515625 },\n  { x: 0.828125, y: 0.515625 },\n  { x: 0.828125, y: 0.515625 },\n  { x: 0.859375, y: 0.515625 },\n  { x: 0.859375, y: 0.515625 },\n  { x: 0.890625, y: 0.515625 },\n  { x: 0.890625, y: 0.515625 },\n  { x: 0.921875, y: 0.515625 },\n  { x: 0.921875, y: 0.515625 },\n  { x: 0.953125, y: 0.515625 },\n  { x: 0.953125, y: 0.515625 },\n  { x: 0.984375, y: 0.515625 },\n  { x: 0.984375, y: 0.515625 },\n  { x: 0.015625, y: 0.546875 },\n  { x: 0.015625, y: 0.546875 },\n  { x: 0.046875, y: 0.546875 },\n  { x: 0.046875, y: 0.546875 },\n  { x: 0.078125, y: 0.546875 },\n  { x: 0.078125, y: 0.546875 },\n  { x: 0.109375, y: 0.546875 },\n  { x: 0.109375, y: 0.546875 },\n  { x: 0.140625, y: 0.546875 },\n  { x: 0.140625, y: 0.546875 },\n  { x: 0.171875, y: 0.546875 },\n  { x: 0.171875, y: 0.546875 },\n  { x: 0.203125, y: 0.546875 },\n  { x: 0.203125, y: 0.546875 },\n  { x: 0.234375, y: 0.546875 },\n  { x: 0.234375, y: 0.546875 },\n  { x: 0.265625, y: 0.546875 },\n  { x: 0.265625, y: 0.546875 },\n  { x: 0.296875, y: 0.546875 },\n  { x: 0.296875, y: 0.546875 },\n  { x: 0.328125, y: 0.546875 },\n  { x: 0.328125, y: 0.546875 },\n  { x: 0.359375, y: 0.546875 },\n  { x: 0.359375, y: 0.546875 },\n  { x: 0.390625, y: 0.546875 },\n  { x: 0.390625, y: 0.546875 },\n  { x: 0.421875, y: 0.546875 },\n  { x: 0.421875, y: 0.546875 },\n  { x: 0.453125, y: 0.546875 },\n  { x: 0.453125, y: 0.546875 },\n  { x: 0.484375, y: 0.546875 },\n  { x: 0.484375, y: 0.546875 },\n  { x: 0.515625, y: 0.546875 },\n  { x: 0.515625, y: 0.546875 },\n  { x: 0.546875, y: 0.546875 },\n  { x: 0.546875, y: 0.546875 },\n  { x: 0.578125, y: 0.546875 },\n  { x: 0.578125, y: 0.546875 },\n  { x: 0.609375, y: 0.546875 },\n  { x: 0.609375, y: 0.546875 },\n  { x: 0.640625, y: 0.546875 },\n  { x: 0.640625, y: 0.546875 },\n  { x: 0.671875, y: 0.546875 },\n  { x: 0.671875, y: 0.546875 },\n  { x: 0.703125, y: 0.546875 },\n  { x: 0.703125, y: 0.546875 },\n  { x: 0.734375, y: 0.546875 },\n  { x: 0.734375, y: 0.546875 },\n  { x: 0.765625, y: 0.546875 },\n  { x: 0.765625, y: 0.546875 },\n  { x: 0.796875, y: 0.546875 },\n  { x: 0.796875, y: 0.546875 },\n  { x: 0.828125, y: 0.546875 },\n  { x: 0.828125, y: 0.546875 },\n  { x: 0.859375, y: 0.546875 },\n  { x: 0.859375, y: 0.546875 },\n  { x: 0.890625, y: 0.546875 },\n  { x: 0.890625, y: 0.546875 },\n  { x: 0.921875, y: 0.546875 },\n  { x: 0.921875, y: 0.546875 },\n  { x: 0.953125, y: 0.546875 },\n  { x: 0.953125, y: 0.546875 },\n  { x: 0.984375, y: 0.546875 },\n  { x: 0.984375, y: 0.546875 },\n  { x: 0.015625, y: 0.578125 },\n  { x: 0.015625, y: 0.578125 },\n  { x: 0.046875, y: 0.578125 },\n  { x: 0.046875, y: 0.578125 },\n  { x: 0.078125, y: 0.578125 },\n  { x: 0.078125, y: 0.578125 },\n  { x: 0.109375, y: 0.578125 },\n  { x: 0.109375, y: 0.578125 },\n  { x: 0.140625, y: 0.578125 },\n  { x: 0.140625, y: 0.578125 },\n  { x: 0.171875, y: 0.578125 },\n  { x: 0.171875, y: 0.578125 },\n  { x: 0.203125, y: 0.578125 },\n  { x: 0.203125, y: 0.578125 },\n  { x: 0.234375, y: 0.578125 },\n  { x: 0.234375, y: 0.578125 },\n  { x: 0.265625, y: 0.578125 },\n  { x: 0.265625, y: 0.578125 },\n  { x: 0.296875, y: 0.578125 },\n  { x: 0.296875, y: 0.578125 },\n  { x: 0.328125, y: 0.578125 },\n  { x: 0.328125, y: 0.578125 },\n  { x: 0.359375, y: 0.578125 },\n  { x: 0.359375, y: 0.578125 },\n  { x: 0.390625, y: 0.578125 },\n  { x: 0.390625, y: 0.578125 },\n  { x: 0.421875, y: 0.578125 },\n  { x: 0.421875, y: 0.578125 },\n  { x: 0.453125, y: 0.578125 },\n  { x: 0.453125, y: 0.578125 },\n  { x: 0.484375, y: 0.578125 },\n  { x: 0.484375, y: 0.578125 },\n  { x: 0.515625, y: 0.578125 },\n  { x: 0.515625, y: 0.578125 },\n  { x: 0.546875, y: 0.578125 },\n  { x: 0.546875, y: 0.578125 },\n  { x: 0.578125, y: 0.578125 },\n  { x: 0.578125, y: 0.578125 },\n  { x: 0.609375, y: 0.578125 },\n  { x: 0.609375, y: 0.578125 },\n  { x: 0.640625, y: 0.578125 },\n  { x: 0.640625, y: 0.578125 },\n  { x: 0.671875, y: 0.578125 },\n  { x: 0.671875, y: 0.578125 },\n  { x: 0.703125, y: 0.578125 },\n  { x: 0.703125, y: 0.578125 },\n  { x: 0.734375, y: 0.578125 },\n  { x: 0.734375, y: 0.578125 },\n  { x: 0.765625, y: 0.578125 },\n  { x: 0.765625, y: 0.578125 },\n  { x: 0.796875, y: 0.578125 },\n  { x: 0.796875, y: 0.578125 },\n  { x: 0.828125, y: 0.578125 },\n  { x: 0.828125, y: 0.578125 },\n  { x: 0.859375, y: 0.578125 },\n  { x: 0.859375, y: 0.578125 },\n  { x: 0.890625, y: 0.578125 },\n  { x: 0.890625, y: 0.578125 },\n  { x: 0.921875, y: 0.578125 },\n  { x: 0.921875, y: 0.578125 },\n  { x: 0.953125, y: 0.578125 },\n  { x: 0.953125, y: 0.578125 },\n  { x: 0.984375, y: 0.578125 },\n  { x: 0.984375, y: 0.578125 },\n  { x: 0.015625, y: 0.609375 },\n  { x: 0.015625, y: 0.609375 },\n  { x: 0.046875, y: 0.609375 },\n  { x: 0.046875, y: 0.609375 },\n  { x: 0.078125, y: 0.609375 },\n  { x: 0.078125, y: 0.609375 },\n  { x: 0.109375, y: 0.609375 },\n  { x: 0.109375, y: 0.609375 },\n  { x: 0.140625, y: 0.609375 },\n  { x: 0.140625, y: 0.609375 },\n  { x: 0.171875, y: 0.609375 },\n  { x: 0.171875, y: 0.609375 },\n  { x: 0.203125, y: 0.609375 },\n  { x: 0.203125, y: 0.609375 },\n  { x: 0.234375, y: 0.609375 },\n  { x: 0.234375, y: 0.609375 },\n  { x: 0.265625, y: 0.609375 },\n  { x: 0.265625, y: 0.609375 },\n  { x: 0.296875, y: 0.609375 },\n  { x: 0.296875, y: 0.609375 },\n  { x: 0.328125, y: 0.609375 },\n  { x: 0.328125, y: 0.609375 },\n  { x: 0.359375, y: 0.609375 },\n  { x: 0.359375, y: 0.609375 },\n  { x: 0.390625, y: 0.609375 },\n  { x: 0.390625, y: 0.609375 },\n  { x: 0.421875, y: 0.609375 },\n  { x: 0.421875, y: 0.609375 },\n  { x: 0.453125, y: 0.609375 },\n  { x: 0.453125, y: 0.609375 },\n  { x: 0.484375, y: 0.609375 },\n  { x: 0.484375, y: 0.609375 },\n  { x: 0.515625, y: 0.609375 },\n  { x: 0.515625, y: 0.609375 },\n  { x: 0.546875, y: 0.609375 },\n  { x: 0.546875, y: 0.609375 },\n  { x: 0.578125, y: 0.609375 },\n  { x: 0.578125, y: 0.609375 },\n  { x: 0.609375, y: 0.609375 },\n  { x: 0.609375, y: 0.609375 },\n  { x: 0.640625, y: 0.609375 },\n  { x: 0.640625, y: 0.609375 },\n  { x: 0.671875, y: 0.609375 },\n  { x: 0.671875, y: 0.609375 },\n  { x: 0.703125, y: 0.609375 },\n  { x: 0.703125, y: 0.609375 },\n  { x: 0.734375, y: 0.609375 },\n  { x: 0.734375, y: 0.609375 },\n  { x: 0.765625, y: 0.609375 },\n  { x: 0.765625, y: 0.609375 },\n  { x: 0.796875, y: 0.609375 },\n  { x: 0.796875, y: 0.609375 },\n  { x: 0.828125, y: 0.609375 },\n  { x: 0.828125, y: 0.609375 },\n  { x: 0.859375, y: 0.609375 },\n  { x: 0.859375, y: 0.609375 },\n  { x: 0.890625, y: 0.609375 },\n  { x: 0.890625, y: 0.609375 },\n  { x: 0.921875, y: 0.609375 },\n  { x: 0.921875, y: 0.609375 },\n  { x: 0.953125, y: 0.609375 },\n  { x: 0.953125, y: 0.609375 },\n  { x: 0.984375, y: 0.609375 },\n  { x: 0.984375, y: 0.609375 },\n  { x: 0.015625, y: 0.640625 },\n  { x: 0.015625, y: 0.640625 },\n  { x: 0.046875, y: 0.640625 },\n  { x: 0.046875, y: 0.640625 },\n  { x: 0.078125, y: 0.640625 },\n  { x: 0.078125, y: 0.640625 },\n  { x: 0.109375, y: 0.640625 },\n  { x: 0.109375, y: 0.640625 },\n  { x: 0.140625, y: 0.640625 },\n  { x: 0.140625, y: 0.640625 },\n  { x: 0.171875, y: 0.640625 },\n  { x: 0.171875, y: 0.640625 },\n  { x: 0.203125, y: 0.640625 },\n  { x: 0.203125, y: 0.640625 },\n  { x: 0.234375, y: 0.640625 },\n  { x: 0.234375, y: 0.640625 },\n  { x: 0.265625, y: 0.640625 },\n  { x: 0.265625, y: 0.640625 },\n  { x: 0.296875, y: 0.640625 },\n  { x: 0.296875, y: 0.640625 },\n  { x: 0.328125, y: 0.640625 },\n  { x: 0.328125, y: 0.640625 },\n  { x: 0.359375, y: 0.640625 },\n  { x: 0.359375, y: 0.640625 },\n  { x: 0.390625, y: 0.640625 },\n  { x: 0.390625, y: 0.640625 },\n  { x: 0.421875, y: 0.640625 },\n  { x: 0.421875, y: 0.640625 },\n  { x: 0.453125, y: 0.640625 },\n  { x: 0.453125, y: 0.640625 },\n  { x: 0.484375, y: 0.640625 },\n  { x: 0.484375, y: 0.640625 },\n  { x: 0.515625, y: 0.640625 },\n  { x: 0.515625, y: 0.640625 },\n  { x: 0.546875, y: 0.640625 },\n  { x: 0.546875, y: 0.640625 },\n  { x: 0.578125, y: 0.640625 },\n  { x: 0.578125, y: 0.640625 },\n  { x: 0.609375, y: 0.640625 },\n  { x: 0.609375, y: 0.640625 },\n  { x: 0.640625, y: 0.640625 },\n  { x: 0.640625, y: 0.640625 },\n  { x: 0.671875, y: 0.640625 },\n  { x: 0.671875, y: 0.640625 },\n  { x: 0.703125, y: 0.640625 },\n  { x: 0.703125, y: 0.640625 },\n  { x: 0.734375, y: 0.640625 },\n  { x: 0.734375, y: 0.640625 },\n  { x: 0.765625, y: 0.640625 },\n  { x: 0.765625, y: 0.640625 },\n  { x: 0.796875, y: 0.640625 },\n  { x: 0.796875, y: 0.640625 },\n  { x: 0.828125, y: 0.640625 },\n  { x: 0.828125, y: 0.640625 },\n  { x: 0.859375, y: 0.640625 },\n  { x: 0.859375, y: 0.640625 },\n  { x: 0.890625, y: 0.640625 },\n  { x: 0.890625, y: 0.640625 },\n  { x: 0.921875, y: 0.640625 },\n  { x: 0.921875, y: 0.640625 },\n  { x: 0.953125, y: 0.640625 },\n  { x: 0.953125, y: 0.640625 },\n  { x: 0.984375, y: 0.640625 },\n  { x: 0.984375, y: 0.640625 },\n  { x: 0.015625, y: 0.671875 },\n  { x: 0.015625, y: 0.671875 },\n  { x: 0.046875, y: 0.671875 },\n  { x: 0.046875, y: 0.671875 },\n  { x: 0.078125, y: 0.671875 },\n  { x: 0.078125, y: 0.671875 },\n  { x: 0.109375, y: 0.671875 },\n  { x: 0.109375, y: 0.671875 },\n  { x: 0.140625, y: 0.671875 },\n  { x: 0.140625, y: 0.671875 },\n  { x: 0.171875, y: 0.671875 },\n  { x: 0.171875, y: 0.671875 },\n  { x: 0.203125, y: 0.671875 },\n  { x: 0.203125, y: 0.671875 },\n  { x: 0.234375, y: 0.671875 },\n  { x: 0.234375, y: 0.671875 },\n  { x: 0.265625, y: 0.671875 },\n  { x: 0.265625, y: 0.671875 },\n  { x: 0.296875, y: 0.671875 },\n  { x: 0.296875, y: 0.671875 },\n  { x: 0.328125, y: 0.671875 },\n  { x: 0.328125, y: 0.671875 },\n  { x: 0.359375, y: 0.671875 },\n  { x: 0.359375, y: 0.671875 },\n  { x: 0.390625, y: 0.671875 },\n  { x: 0.390625, y: 0.671875 },\n  { x: 0.421875, y: 0.671875 },\n  { x: 0.421875, y: 0.671875 },\n  { x: 0.453125, y: 0.671875 },\n  { x: 0.453125, y: 0.671875 },\n  { x: 0.484375, y: 0.671875 },\n  { x: 0.484375, y: 0.671875 },\n  { x: 0.515625, y: 0.671875 },\n  { x: 0.515625, y: 0.671875 },\n  { x: 0.546875, y: 0.671875 },\n  { x: 0.546875, y: 0.671875 },\n  { x: 0.578125, y: 0.671875 },\n  { x: 0.578125, y: 0.671875 },\n  { x: 0.609375, y: 0.671875 },\n  { x: 0.609375, y: 0.671875 },\n  { x: 0.640625, y: 0.671875 },\n  { x: 0.640625, y: 0.671875 },\n  { x: 0.671875, y: 0.671875 },\n  { x: 0.671875, y: 0.671875 },\n  { x: 0.703125, y: 0.671875 },\n  { x: 0.703125, y: 0.671875 },\n  { x: 0.734375, y: 0.671875 },\n  { x: 0.734375, y: 0.671875 },\n  { x: 0.765625, y: 0.671875 },\n  { x: 0.765625, y: 0.671875 },\n  { x: 0.796875, y: 0.671875 },\n  { x: 0.796875, y: 0.671875 },\n  { x: 0.828125, y: 0.671875 },\n  { x: 0.828125, y: 0.671875 },\n  { x: 0.859375, y: 0.671875 },\n  { x: 0.859375, y: 0.671875 },\n  { x: 0.890625, y: 0.671875 },\n  { x: 0.890625, y: 0.671875 },\n  { x: 0.921875, y: 0.671875 },\n  { x: 0.921875, y: 0.671875 },\n  { x: 0.953125, y: 0.671875 },\n  { x: 0.953125, y: 0.671875 },\n  { x: 0.984375, y: 0.671875 },\n  { x: 0.984375, y: 0.671875 },\n  { x: 0.015625, y: 0.703125 },\n  { x: 0.015625, y: 0.703125 },\n  { x: 0.046875, y: 0.703125 },\n  { x: 0.046875, y: 0.703125 },\n  { x: 0.078125, y: 0.703125 },\n  { x: 0.078125, y: 0.703125 },\n  { x: 0.109375, y: 0.703125 },\n  { x: 0.109375, y: 0.703125 },\n  { x: 0.140625, y: 0.703125 },\n  { x: 0.140625, y: 0.703125 },\n  { x: 0.171875, y: 0.703125 },\n  { x: 0.171875, y: 0.703125 },\n  { x: 0.203125, y: 0.703125 },\n  { x: 0.203125, y: 0.703125 },\n  { x: 0.234375, y: 0.703125 },\n  { x: 0.234375, y: 0.703125 },\n  { x: 0.265625, y: 0.703125 },\n  { x: 0.265625, y: 0.703125 },\n  { x: 0.296875, y: 0.703125 },\n  { x: 0.296875, y: 0.703125 },\n  { x: 0.328125, y: 0.703125 },\n  { x: 0.328125, y: 0.703125 },\n  { x: 0.359375, y: 0.703125 },\n  { x: 0.359375, y: 0.703125 },\n  { x: 0.390625, y: 0.703125 },\n  { x: 0.390625, y: 0.703125 },\n  { x: 0.421875, y: 0.703125 },\n  { x: 0.421875, y: 0.703125 },\n  { x: 0.453125, y: 0.703125 },\n  { x: 0.453125, y: 0.703125 },\n  { x: 0.484375, y: 0.703125 },\n  { x: 0.484375, y: 0.703125 },\n  { x: 0.515625, y: 0.703125 },\n  { x: 0.515625, y: 0.703125 },\n  { x: 0.546875, y: 0.703125 },\n  { x: 0.546875, y: 0.703125 },\n  { x: 0.578125, y: 0.703125 },\n  { x: 0.578125, y: 0.703125 },\n  { x: 0.609375, y: 0.703125 },\n  { x: 0.609375, y: 0.703125 },\n  { x: 0.640625, y: 0.703125 },\n  { x: 0.640625, y: 0.703125 },\n  { x: 0.671875, y: 0.703125 },\n  { x: 0.671875, y: 0.703125 },\n  { x: 0.703125, y: 0.703125 },\n  { x: 0.703125, y: 0.703125 },\n  { x: 0.734375, y: 0.703125 },\n  { x: 0.734375, y: 0.703125 },\n  { x: 0.765625, y: 0.703125 },\n  { x: 0.765625, y: 0.703125 },\n  { x: 0.796875, y: 0.703125 },\n  { x: 0.796875, y: 0.703125 },\n  { x: 0.828125, y: 0.703125 },\n  { x: 0.828125, y: 0.703125 },\n  { x: 0.859375, y: 0.703125 },\n  { x: 0.859375, y: 0.703125 },\n  { x: 0.890625, y: 0.703125 },\n  { x: 0.890625, y: 0.703125 },\n  { x: 0.921875, y: 0.703125 },\n  { x: 0.921875, y: 0.703125 },\n  { x: 0.953125, y: 0.703125 },\n  { x: 0.953125, y: 0.703125 },\n  { x: 0.984375, y: 0.703125 },\n  { x: 0.984375, y: 0.703125 },\n  { x: 0.015625, y: 0.734375 },\n  { x: 0.015625, y: 0.734375 },\n  { x: 0.046875, y: 0.734375 },\n  { x: 0.046875, y: 0.734375 },\n  { x: 0.078125, y: 0.734375 },\n  { x: 0.078125, y: 0.734375 },\n  { x: 0.109375, y: 0.734375 },\n  { x: 0.109375, y: 0.734375 },\n  { x: 0.140625, y: 0.734375 },\n  { x: 0.140625, y: 0.734375 },\n  { x: 0.171875, y: 0.734375 },\n  { x: 0.171875, y: 0.734375 },\n  { x: 0.203125, y: 0.734375 },\n  { x: 0.203125, y: 0.734375 },\n  { x: 0.234375, y: 0.734375 },\n  { x: 0.234375, y: 0.734375 },\n  { x: 0.265625, y: 0.734375 },\n  { x: 0.265625, y: 0.734375 },\n  { x: 0.296875, y: 0.734375 },\n  { x: 0.296875, y: 0.734375 },\n  { x: 0.328125, y: 0.734375 },\n  { x: 0.328125, y: 0.734375 },\n  { x: 0.359375, y: 0.734375 },\n  { x: 0.359375, y: 0.734375 },\n  { x: 0.390625, y: 0.734375 },\n  { x: 0.390625, y: 0.734375 },\n  { x: 0.421875, y: 0.734375 },\n  { x: 0.421875, y: 0.734375 },\n  { x: 0.453125, y: 0.734375 },\n  { x: 0.453125, y: 0.734375 },\n  { x: 0.484375, y: 0.734375 },\n  { x: 0.484375, y: 0.734375 },\n  { x: 0.515625, y: 0.734375 },\n  { x: 0.515625, y: 0.734375 },\n  { x: 0.546875, y: 0.734375 },\n  { x: 0.546875, y: 0.734375 },\n  { x: 0.578125, y: 0.734375 },\n  { x: 0.578125, y: 0.734375 },\n  { x: 0.609375, y: 0.734375 },\n  { x: 0.609375, y: 0.734375 },\n  { x: 0.640625, y: 0.734375 },\n  { x: 0.640625, y: 0.734375 },\n  { x: 0.671875, y: 0.734375 },\n  { x: 0.671875, y: 0.734375 },\n  { x: 0.703125, y: 0.734375 },\n  { x: 0.703125, y: 0.734375 },\n  { x: 0.734375, y: 0.734375 },\n  { x: 0.734375, y: 0.734375 },\n  { x: 0.765625, y: 0.734375 },\n  { x: 0.765625, y: 0.734375 },\n  { x: 0.796875, y: 0.734375 },\n  { x: 0.796875, y: 0.734375 },\n  { x: 0.828125, y: 0.734375 },\n  { x: 0.828125, y: 0.734375 },\n  { x: 0.859375, y: 0.734375 },\n  { x: 0.859375, y: 0.734375 },\n  { x: 0.890625, y: 0.734375 },\n  { x: 0.890625, y: 0.734375 },\n  { x: 0.921875, y: 0.734375 },\n  { x: 0.921875, y: 0.734375 },\n  { x: 0.953125, y: 0.734375 },\n  { x: 0.953125, y: 0.734375 },\n  { x: 0.984375, y: 0.734375 },\n  { x: 0.984375, y: 0.734375 },\n  { x: 0.015625, y: 0.765625 },\n  { x: 0.015625, y: 0.765625 },\n  { x: 0.046875, y: 0.765625 },\n  { x: 0.046875, y: 0.765625 },\n  { x: 0.078125, y: 0.765625 },\n  { x: 0.078125, y: 0.765625 },\n  { x: 0.109375, y: 0.765625 },\n  { x: 0.109375, y: 0.765625 },\n  { x: 0.140625, y: 0.765625 },\n  { x: 0.140625, y: 0.765625 },\n  { x: 0.171875, y: 0.765625 },\n  { x: 0.171875, y: 0.765625 },\n  { x: 0.203125, y: 0.765625 },\n  { x: 0.203125, y: 0.765625 },\n  { x: 0.234375, y: 0.765625 },\n  { x: 0.234375, y: 0.765625 },\n  { x: 0.265625, y: 0.765625 },\n  { x: 0.265625, y: 0.765625 },\n  { x: 0.296875, y: 0.765625 },\n  { x: 0.296875, y: 0.765625 },\n  { x: 0.328125, y: 0.765625 },\n  { x: 0.328125, y: 0.765625 },\n  { x: 0.359375, y: 0.765625 },\n  { x: 0.359375, y: 0.765625 },\n  { x: 0.390625, y: 0.765625 },\n  { x: 0.390625, y: 0.765625 },\n  { x: 0.421875, y: 0.765625 },\n  { x: 0.421875, y: 0.765625 },\n  { x: 0.453125, y: 0.765625 },\n  { x: 0.453125, y: 0.765625 },\n  { x: 0.484375, y: 0.765625 },\n  { x: 0.484375, y: 0.765625 },\n  { x: 0.515625, y: 0.765625 },\n  { x: 0.515625, y: 0.765625 },\n  { x: 0.546875, y: 0.765625 },\n  { x: 0.546875, y: 0.765625 },\n  { x: 0.578125, y: 0.765625 },\n  { x: 0.578125, y: 0.765625 },\n  { x: 0.609375, y: 0.765625 },\n  { x: 0.609375, y: 0.765625 },\n  { x: 0.640625, y: 0.765625 },\n  { x: 0.640625, y: 0.765625 },\n  { x: 0.671875, y: 0.765625 },\n  { x: 0.671875, y: 0.765625 },\n  { x: 0.703125, y: 0.765625 },\n  { x: 0.703125, y: 0.765625 },\n  { x: 0.734375, y: 0.765625 },\n  { x: 0.734375, y: 0.765625 },\n  { x: 0.765625, y: 0.765625 },\n  { x: 0.765625, y: 0.765625 },\n  { x: 0.796875, y: 0.765625 },\n  { x: 0.796875, y: 0.765625 },\n  { x: 0.828125, y: 0.765625 },\n  { x: 0.828125, y: 0.765625 },\n  { x: 0.859375, y: 0.765625 },\n  { x: 0.859375, y: 0.765625 },\n  { x: 0.890625, y: 0.765625 },\n  { x: 0.890625, y: 0.765625 },\n  { x: 0.921875, y: 0.765625 },\n  { x: 0.921875, y: 0.765625 },\n  { x: 0.953125, y: 0.765625 },\n  { x: 0.953125, y: 0.765625 },\n  { x: 0.984375, y: 0.765625 },\n  { x: 0.984375, y: 0.765625 },\n  { x: 0.015625, y: 0.796875 },\n  { x: 0.015625, y: 0.796875 },\n  { x: 0.046875, y: 0.796875 },\n  { x: 0.046875, y: 0.796875 },\n  { x: 0.078125, y: 0.796875 },\n  { x: 0.078125, y: 0.796875 },\n  { x: 0.109375, y: 0.796875 },\n  { x: 0.109375, y: 0.796875 },\n  { x: 0.140625, y: 0.796875 },\n  { x: 0.140625, y: 0.796875 },\n  { x: 0.171875, y: 0.796875 },\n  { x: 0.171875, y: 0.796875 },\n  { x: 0.203125, y: 0.796875 },\n  { x: 0.203125, y: 0.796875 },\n  { x: 0.234375, y: 0.796875 },\n  { x: 0.234375, y: 0.796875 },\n  { x: 0.265625, y: 0.796875 },\n  { x: 0.265625, y: 0.796875 },\n  { x: 0.296875, y: 0.796875 },\n  { x: 0.296875, y: 0.796875 },\n  { x: 0.328125, y: 0.796875 },\n  { x: 0.328125, y: 0.796875 },\n  { x: 0.359375, y: 0.796875 },\n  { x: 0.359375, y: 0.796875 },\n  { x: 0.390625, y: 0.796875 },\n  { x: 0.390625, y: 0.796875 },\n  { x: 0.421875, y: 0.796875 },\n  { x: 0.421875, y: 0.796875 },\n  { x: 0.453125, y: 0.796875 },\n  { x: 0.453125, y: 0.796875 },\n  { x: 0.484375, y: 0.796875 },\n  { x: 0.484375, y: 0.796875 },\n  { x: 0.515625, y: 0.796875 },\n  { x: 0.515625, y: 0.796875 },\n  { x: 0.546875, y: 0.796875 },\n  { x: 0.546875, y: 0.796875 },\n  { x: 0.578125, y: 0.796875 },\n  { x: 0.578125, y: 0.796875 },\n  { x: 0.609375, y: 0.796875 },\n  { x: 0.609375, y: 0.796875 },\n  { x: 0.640625, y: 0.796875 },\n  { x: 0.640625, y: 0.796875 },\n  { x: 0.671875, y: 0.796875 },\n  { x: 0.671875, y: 0.796875 },\n  { x: 0.703125, y: 0.796875 },\n  { x: 0.703125, y: 0.796875 },\n  { x: 0.734375, y: 0.796875 },\n  { x: 0.734375, y: 0.796875 },\n  { x: 0.765625, y: 0.796875 },\n  { x: 0.765625, y: 0.796875 },\n  { x: 0.796875, y: 0.796875 },\n  { x: 0.796875, y: 0.796875 },\n  { x: 0.828125, y: 0.796875 },\n  { x: 0.828125, y: 0.796875 },\n  { x: 0.859375, y: 0.796875 },\n  { x: 0.859375, y: 0.796875 },\n  { x: 0.890625, y: 0.796875 },\n  { x: 0.890625, y: 0.796875 },\n  { x: 0.921875, y: 0.796875 },\n  { x: 0.921875, y: 0.796875 },\n  { x: 0.953125, y: 0.796875 },\n  { x: 0.953125, y: 0.796875 },\n  { x: 0.984375, y: 0.796875 },\n  { x: 0.984375, y: 0.796875 },\n  { x: 0.015625, y: 0.828125 },\n  { x: 0.015625, y: 0.828125 },\n  { x: 0.046875, y: 0.828125 },\n  { x: 0.046875, y: 0.828125 },\n  { x: 0.078125, y: 0.828125 },\n  { x: 0.078125, y: 0.828125 },\n  { x: 0.109375, y: 0.828125 },\n  { x: 0.109375, y: 0.828125 },\n  { x: 0.140625, y: 0.828125 },\n  { x: 0.140625, y: 0.828125 },\n  { x: 0.171875, y: 0.828125 },\n  { x: 0.171875, y: 0.828125 },\n  { x: 0.203125, y: 0.828125 },\n  { x: 0.203125, y: 0.828125 },\n  { x: 0.234375, y: 0.828125 },\n  { x: 0.234375, y: 0.828125 },\n  { x: 0.265625, y: 0.828125 },\n  { x: 0.265625, y: 0.828125 },\n  { x: 0.296875, y: 0.828125 },\n  { x: 0.296875, y: 0.828125 },\n  { x: 0.328125, y: 0.828125 },\n  { x: 0.328125, y: 0.828125 },\n  { x: 0.359375, y: 0.828125 },\n  { x: 0.359375, y: 0.828125 },\n  { x: 0.390625, y: 0.828125 },\n  { x: 0.390625, y: 0.828125 },\n  { x: 0.421875, y: 0.828125 },\n  { x: 0.421875, y: 0.828125 },\n  { x: 0.453125, y: 0.828125 },\n  { x: 0.453125, y: 0.828125 },\n  { x: 0.484375, y: 0.828125 },\n  { x: 0.484375, y: 0.828125 },\n  { x: 0.515625, y: 0.828125 },\n  { x: 0.515625, y: 0.828125 },\n  { x: 0.546875, y: 0.828125 },\n  { x: 0.546875, y: 0.828125 },\n  { x: 0.578125, y: 0.828125 },\n  { x: 0.578125, y: 0.828125 },\n  { x: 0.609375, y: 0.828125 },\n  { x: 0.609375, y: 0.828125 },\n  { x: 0.640625, y: 0.828125 },\n  { x: 0.640625, y: 0.828125 },\n  { x: 0.671875, y: 0.828125 },\n  { x: 0.671875, y: 0.828125 },\n  { x: 0.703125, y: 0.828125 },\n  { x: 0.703125, y: 0.828125 },\n  { x: 0.734375, y: 0.828125 },\n  { x: 0.734375, y: 0.828125 },\n  { x: 0.765625, y: 0.828125 },\n  { x: 0.765625, y: 0.828125 },\n  { x: 0.796875, y: 0.828125 },\n  { x: 0.796875, y: 0.828125 },\n  { x: 0.828125, y: 0.828125 },\n  { x: 0.828125, y: 0.828125 },\n  { x: 0.859375, y: 0.828125 },\n  { x: 0.859375, y: 0.828125 },\n  { x: 0.890625, y: 0.828125 },\n  { x: 0.890625, y: 0.828125 },\n  { x: 0.921875, y: 0.828125 },\n  { x: 0.921875, y: 0.828125 },\n  { x: 0.953125, y: 0.828125 },\n  { x: 0.953125, y: 0.828125 },\n  { x: 0.984375, y: 0.828125 },\n  { x: 0.984375, y: 0.828125 },\n  { x: 0.015625, y: 0.859375 },\n  { x: 0.015625, y: 0.859375 },\n  { x: 0.046875, y: 0.859375 },\n  { x: 0.046875, y: 0.859375 },\n  { x: 0.078125, y: 0.859375 },\n  { x: 0.078125, y: 0.859375 },\n  { x: 0.109375, y: 0.859375 },\n  { x: 0.109375, y: 0.859375 },\n  { x: 0.140625, y: 0.859375 },\n  { x: 0.140625, y: 0.859375 },\n  { x: 0.171875, y: 0.859375 },\n  { x: 0.171875, y: 0.859375 },\n  { x: 0.203125, y: 0.859375 },\n  { x: 0.203125, y: 0.859375 },\n  { x: 0.234375, y: 0.859375 },\n  { x: 0.234375, y: 0.859375 },\n  { x: 0.265625, y: 0.859375 },\n  { x: 0.265625, y: 0.859375 },\n  { x: 0.296875, y: 0.859375 },\n  { x: 0.296875, y: 0.859375 },\n  { x: 0.328125, y: 0.859375 },\n  { x: 0.328125, y: 0.859375 },\n  { x: 0.359375, y: 0.859375 },\n  { x: 0.359375, y: 0.859375 },\n  { x: 0.390625, y: 0.859375 },\n  { x: 0.390625, y: 0.859375 },\n  { x: 0.421875, y: 0.859375 },\n  { x: 0.421875, y: 0.859375 },\n  { x: 0.453125, y: 0.859375 },\n  { x: 0.453125, y: 0.859375 },\n  { x: 0.484375, y: 0.859375 },\n  { x: 0.484375, y: 0.859375 },\n  { x: 0.515625, y: 0.859375 },\n  { x: 0.515625, y: 0.859375 },\n  { x: 0.546875, y: 0.859375 },\n  { x: 0.546875, y: 0.859375 },\n  { x: 0.578125, y: 0.859375 },\n  { x: 0.578125, y: 0.859375 },\n  { x: 0.609375, y: 0.859375 },\n  { x: 0.609375, y: 0.859375 },\n  { x: 0.640625, y: 0.859375 },\n  { x: 0.640625, y: 0.859375 },\n  { x: 0.671875, y: 0.859375 },\n  { x: 0.671875, y: 0.859375 },\n  { x: 0.703125, y: 0.859375 },\n  { x: 0.703125, y: 0.859375 },\n  { x: 0.734375, y: 0.859375 },\n  { x: 0.734375, y: 0.859375 },\n  { x: 0.765625, y: 0.859375 },\n  { x: 0.765625, y: 0.859375 },\n  { x: 0.796875, y: 0.859375 },\n  { x: 0.796875, y: 0.859375 },\n  { x: 0.828125, y: 0.859375 },\n  { x: 0.828125, y: 0.859375 },\n  { x: 0.859375, y: 0.859375 },\n  { x: 0.859375, y: 0.859375 },\n  { x: 0.890625, y: 0.859375 },\n  { x: 0.890625, y: 0.859375 },\n  { x: 0.921875, y: 0.859375 },\n  { x: 0.921875, y: 0.859375 },\n  { x: 0.953125, y: 0.859375 },\n  { x: 0.953125, y: 0.859375 },\n  { x: 0.984375, y: 0.859375 },\n  { x: 0.984375, y: 0.859375 },\n  { x: 0.015625, y: 0.890625 },\n  { x: 0.015625, y: 0.890625 },\n  { x: 0.046875, y: 0.890625 },\n  { x: 0.046875, y: 0.890625 },\n  { x: 0.078125, y: 0.890625 },\n  { x: 0.078125, y: 0.890625 },\n  { x: 0.109375, y: 0.890625 },\n  { x: 0.109375, y: 0.890625 },\n  { x: 0.140625, y: 0.890625 },\n  { x: 0.140625, y: 0.890625 },\n  { x: 0.171875, y: 0.890625 },\n  { x: 0.171875, y: 0.890625 },\n  { x: 0.203125, y: 0.890625 },\n  { x: 0.203125, y: 0.890625 },\n  { x: 0.234375, y: 0.890625 },\n  { x: 0.234375, y: 0.890625 },\n  { x: 0.265625, y: 0.890625 },\n  { x: 0.265625, y: 0.890625 },\n  { x: 0.296875, y: 0.890625 },\n  { x: 0.296875, y: 0.890625 },\n  { x: 0.328125, y: 0.890625 },\n  { x: 0.328125, y: 0.890625 },\n  { x: 0.359375, y: 0.890625 },\n  { x: 0.359375, y: 0.890625 },\n  { x: 0.390625, y: 0.890625 },\n  { x: 0.390625, y: 0.890625 },\n  { x: 0.421875, y: 0.890625 },\n  { x: 0.421875, y: 0.890625 },\n  { x: 0.453125, y: 0.890625 },\n  { x: 0.453125, y: 0.890625 },\n  { x: 0.484375, y: 0.890625 },\n  { x: 0.484375, y: 0.890625 },\n  { x: 0.515625, y: 0.890625 },\n  { x: 0.515625, y: 0.890625 },\n  { x: 0.546875, y: 0.890625 },\n  { x: 0.546875, y: 0.890625 },\n  { x: 0.578125, y: 0.890625 },\n  { x: 0.578125, y: 0.890625 },\n  { x: 0.609375, y: 0.890625 },\n  { x: 0.609375, y: 0.890625 },\n  { x: 0.640625, y: 0.890625 },\n  { x: 0.640625, y: 0.890625 },\n  { x: 0.671875, y: 0.890625 },\n  { x: 0.671875, y: 0.890625 },\n  { x: 0.703125, y: 0.890625 },\n  { x: 0.703125, y: 0.890625 },\n  { x: 0.734375, y: 0.890625 },\n  { x: 0.734375, y: 0.890625 },\n  { x: 0.765625, y: 0.890625 },\n  { x: 0.765625, y: 0.890625 },\n  { x: 0.796875, y: 0.890625 },\n  { x: 0.796875, y: 0.890625 },\n  { x: 0.828125, y: 0.890625 },\n  { x: 0.828125, y: 0.890625 },\n  { x: 0.859375, y: 0.890625 },\n  { x: 0.859375, y: 0.890625 },\n  { x: 0.890625, y: 0.890625 },\n  { x: 0.890625, y: 0.890625 },\n  { x: 0.921875, y: 0.890625 },\n  { x: 0.921875, y: 0.890625 },\n  { x: 0.953125, y: 0.890625 },\n  { x: 0.953125, y: 0.890625 },\n  { x: 0.984375, y: 0.890625 },\n  { x: 0.984375, y: 0.890625 },\n  { x: 0.015625, y: 0.921875 },\n  { x: 0.015625, y: 0.921875 },\n  { x: 0.046875, y: 0.921875 },\n  { x: 0.046875, y: 0.921875 },\n  { x: 0.078125, y: 0.921875 },\n  { x: 0.078125, y: 0.921875 },\n  { x: 0.109375, y: 0.921875 },\n  { x: 0.109375, y: 0.921875 },\n  { x: 0.140625, y: 0.921875 },\n  { x: 0.140625, y: 0.921875 },\n  { x: 0.171875, y: 0.921875 },\n  { x: 0.171875, y: 0.921875 },\n  { x: 0.203125, y: 0.921875 },\n  { x: 0.203125, y: 0.921875 },\n  { x: 0.234375, y: 0.921875 },\n  { x: 0.234375, y: 0.921875 },\n  { x: 0.265625, y: 0.921875 },\n  { x: 0.265625, y: 0.921875 },\n  { x: 0.296875, y: 0.921875 },\n  { x: 0.296875, y: 0.921875 },\n  { x: 0.328125, y: 0.921875 },\n  { x: 0.328125, y: 0.921875 },\n  { x: 0.359375, y: 0.921875 },\n  { x: 0.359375, y: 0.921875 },\n  { x: 0.390625, y: 0.921875 },\n  { x: 0.390625, y: 0.921875 },\n  { x: 0.421875, y: 0.921875 },\n  { x: 0.421875, y: 0.921875 },\n  { x: 0.453125, y: 0.921875 },\n  { x: 0.453125, y: 0.921875 },\n  { x: 0.484375, y: 0.921875 },\n  { x: 0.484375, y: 0.921875 },\n  { x: 0.515625, y: 0.921875 },\n  { x: 0.515625, y: 0.921875 },\n  { x: 0.546875, y: 0.921875 },\n  { x: 0.546875, y: 0.921875 },\n  { x: 0.578125, y: 0.921875 },\n  { x: 0.578125, y: 0.921875 },\n  { x: 0.609375, y: 0.921875 },\n  { x: 0.609375, y: 0.921875 },\n  { x: 0.640625, y: 0.921875 },\n  { x: 0.640625, y: 0.921875 },\n  { x: 0.671875, y: 0.921875 },\n  { x: 0.671875, y: 0.921875 },\n  { x: 0.703125, y: 0.921875 },\n  { x: 0.703125, y: 0.921875 },\n  { x: 0.734375, y: 0.921875 },\n  { x: 0.734375, y: 0.921875 },\n  { x: 0.765625, y: 0.921875 },\n  { x: 0.765625, y: 0.921875 },\n  { x: 0.796875, y: 0.921875 },\n  { x: 0.796875, y: 0.921875 },\n  { x: 0.828125, y: 0.921875 },\n  { x: 0.828125, y: 0.921875 },\n  { x: 0.859375, y: 0.921875 },\n  { x: 0.859375, y: 0.921875 },\n  { x: 0.890625, y: 0.921875 },\n  { x: 0.890625, y: 0.921875 },\n  { x: 0.921875, y: 0.921875 },\n  { x: 0.921875, y: 0.921875 },\n  { x: 0.953125, y: 0.921875 },\n  { x: 0.953125, y: 0.921875 },\n  { x: 0.984375, y: 0.921875 },\n  { x: 0.984375, y: 0.921875 },\n  { x: 0.015625, y: 0.953125 },\n  { x: 0.015625, y: 0.953125 },\n  { x: 0.046875, y: 0.953125 },\n  { x: 0.046875, y: 0.953125 },\n  { x: 0.078125, y: 0.953125 },\n  { x: 0.078125, y: 0.953125 },\n  { x: 0.109375, y: 0.953125 },\n  { x: 0.109375, y: 0.953125 },\n  { x: 0.140625, y: 0.953125 },\n  { x: 0.140625, y: 0.953125 },\n  { x: 0.171875, y: 0.953125 },\n  { x: 0.171875, y: 0.953125 },\n  { x: 0.203125, y: 0.953125 },\n  { x: 0.203125, y: 0.953125 },\n  { x: 0.234375, y: 0.953125 },\n  { x: 0.234375, y: 0.953125 },\n  { x: 0.265625, y: 0.953125 },\n  { x: 0.265625, y: 0.953125 },\n  { x: 0.296875, y: 0.953125 },\n  { x: 0.296875, y: 0.953125 },\n  { x: 0.328125, y: 0.953125 },\n  { x: 0.328125, y: 0.953125 },\n  { x: 0.359375, y: 0.953125 },\n  { x: 0.359375, y: 0.953125 },\n  { x: 0.390625, y: 0.953125 },\n  { x: 0.390625, y: 0.953125 },\n  { x: 0.421875, y: 0.953125 },\n  { x: 0.421875, y: 0.953125 },\n  { x: 0.453125, y: 0.953125 },\n  { x: 0.453125, y: 0.953125 },\n  { x: 0.484375, y: 0.953125 },\n  { x: 0.484375, y: 0.953125 },\n  { x: 0.515625, y: 0.953125 },\n  { x: 0.515625, y: 0.953125 },\n  { x: 0.546875, y: 0.953125 },\n  { x: 0.546875, y: 0.953125 },\n  { x: 0.578125, y: 0.953125 },\n  { x: 0.578125, y: 0.953125 },\n  { x: 0.609375, y: 0.953125 },\n  { x: 0.609375, y: 0.953125 },\n  { x: 0.640625, y: 0.953125 },\n  { x: 0.640625, y: 0.953125 },\n  { x: 0.671875, y: 0.953125 },\n  { x: 0.671875, y: 0.953125 },\n  { x: 0.703125, y: 0.953125 },\n  { x: 0.703125, y: 0.953125 },\n  { x: 0.734375, y: 0.953125 },\n  { x: 0.734375, y: 0.953125 },\n  { x: 0.765625, y: 0.953125 },\n  { x: 0.765625, y: 0.953125 },\n  { x: 0.796875, y: 0.953125 },\n  { x: 0.796875, y: 0.953125 },\n  { x: 0.828125, y: 0.953125 },\n  { x: 0.828125, y: 0.953125 },\n  { x: 0.859375, y: 0.953125 },\n  { x: 0.859375, y: 0.953125 },\n  { x: 0.890625, y: 0.953125 },\n  { x: 0.890625, y: 0.953125 },\n  { x: 0.921875, y: 0.953125 },\n  { x: 0.921875, y: 0.953125 },\n  { x: 0.953125, y: 0.953125 },\n  { x: 0.953125, y: 0.953125 },\n  { x: 0.984375, y: 0.953125 },\n  { x: 0.984375, y: 0.953125 },\n  { x: 0.015625, y: 0.984375 },\n  { x: 0.015625, y: 0.984375 },\n  { x: 0.046875, y: 0.984375 },\n  { x: 0.046875, y: 0.984375 },\n  { x: 0.078125, y: 0.984375 },\n  { x: 0.078125, y: 0.984375 },\n  { x: 0.109375, y: 0.984375 },\n  { x: 0.109375, y: 0.984375 },\n  { x: 0.140625, y: 0.984375 },\n  { x: 0.140625, y: 0.984375 },\n  { x: 0.171875, y: 0.984375 },\n  { x: 0.171875, y: 0.984375 },\n  { x: 0.203125, y: 0.984375 },\n  { x: 0.203125, y: 0.984375 },\n  { x: 0.234375, y: 0.984375 },\n  { x: 0.234375, y: 0.984375 },\n  { x: 0.265625, y: 0.984375 },\n  { x: 0.265625, y: 0.984375 },\n  { x: 0.296875, y: 0.984375 },\n  { x: 0.296875, y: 0.984375 },\n  { x: 0.328125, y: 0.984375 },\n  { x: 0.328125, y: 0.984375 },\n  { x: 0.359375, y: 0.984375 },\n  { x: 0.359375, y: 0.984375 },\n  { x: 0.390625, y: 0.984375 },\n  { x: 0.390625, y: 0.984375 },\n  { x: 0.421875, y: 0.984375 },\n  { x: 0.421875, y: 0.984375 },\n  { x: 0.453125, y: 0.984375 },\n  { x: 0.453125, y: 0.984375 },\n  { x: 0.484375, y: 0.984375 },\n  { x: 0.484375, y: 0.984375 },\n  { x: 0.515625, y: 0.984375 },\n  { x: 0.515625, y: 0.984375 },\n  { x: 0.546875, y: 0.984375 },\n  { x: 0.546875, y: 0.984375 },\n  { x: 0.578125, y: 0.984375 },\n  { x: 0.578125, y: 0.984375 },\n  { x: 0.609375, y: 0.984375 },\n  { x: 0.609375, y: 0.984375 },\n  { x: 0.640625, y: 0.984375 },\n  { x: 0.640625, y: 0.984375 },\n  { x: 0.671875, y: 0.984375 },\n  { x: 0.671875, y: 0.984375 },\n  { x: 0.703125, y: 0.984375 },\n  { x: 0.703125, y: 0.984375 },\n  { x: 0.734375, y: 0.984375 },\n  { x: 0.734375, y: 0.984375 },\n  { x: 0.765625, y: 0.984375 },\n  { x: 0.765625, y: 0.984375 },\n  { x: 0.796875, y: 0.984375 },\n  { x: 0.796875, y: 0.984375 },\n  { x: 0.828125, y: 0.984375 },\n  { x: 0.828125, y: 0.984375 },\n  { x: 0.859375, y: 0.984375 },\n  { x: 0.859375, y: 0.984375 },\n  { x: 0.890625, y: 0.984375 },\n  { x: 0.890625, y: 0.984375 },\n  { x: 0.921875, y: 0.984375 },\n  { x: 0.921875, y: 0.984375 },\n  { x: 0.953125, y: 0.984375 },\n  { x: 0.953125, y: 0.984375 },\n  { x: 0.984375, y: 0.984375 },\n  { x: 0.984375, y: 0.984375 },\n  { x: 0.03125, y: 0.03125 },\n  { x: 0.03125, y: 0.03125 },\n  { x: 0.09375, y: 0.03125 },\n  { x: 0.09375, y: 0.03125 },\n  { x: 0.15625, y: 0.03125 },\n  { x: 0.15625, y: 0.03125 },\n  { x: 0.21875, y: 0.03125 },\n  { x: 0.21875, y: 0.03125 },\n  { x: 0.28125, y: 0.03125 },\n  { x: 0.28125, y: 0.03125 },\n  { x: 0.34375, y: 0.03125 },\n  { x: 0.34375, y: 0.03125 },\n  { x: 0.40625, y: 0.03125 },\n  { x: 0.40625, y: 0.03125 },\n  { x: 0.46875, y: 0.03125 },\n  { x: 0.46875, y: 0.03125 },\n  { x: 0.53125, y: 0.03125 },\n  { x: 0.53125, y: 0.03125 },\n  { x: 0.59375, y: 0.03125 },\n  { x: 0.59375, y: 0.03125 },\n  { x: 0.65625, y: 0.03125 },\n  { x: 0.65625, y: 0.03125 },\n  { x: 0.71875, y: 0.03125 },\n  { x: 0.71875, y: 0.03125 },\n  { x: 0.78125, y: 0.03125 },\n  { x: 0.78125, y: 0.03125 },\n  { x: 0.84375, y: 0.03125 },\n  { x: 0.84375, y: 0.03125 },\n  { x: 0.90625, y: 0.03125 },\n  { x: 0.90625, y: 0.03125 },\n  { x: 0.96875, y: 0.03125 },\n  { x: 0.96875, y: 0.03125 },\n  { x: 0.03125, y: 0.09375 },\n  { x: 0.03125, y: 0.09375 },\n  { x: 0.09375, y: 0.09375 },\n  { x: 0.09375, y: 0.09375 },\n  { x: 0.15625, y: 0.09375 },\n  { x: 0.15625, y: 0.09375 },\n  { x: 0.21875, y: 0.09375 },\n  { x: 0.21875, y: 0.09375 },\n  { x: 0.28125, y: 0.09375 },\n  { x: 0.28125, y: 0.09375 },\n  { x: 0.34375, y: 0.09375 },\n  { x: 0.34375, y: 0.09375 },\n  { x: 0.40625, y: 0.09375 },\n  { x: 0.40625, y: 0.09375 },\n  { x: 0.46875, y: 0.09375 },\n  { x: 0.46875, y: 0.09375 },\n  { x: 0.53125, y: 0.09375 },\n  { x: 0.53125, y: 0.09375 },\n  { x: 0.59375, y: 0.09375 },\n  { x: 0.59375, y: 0.09375 },\n  { x: 0.65625, y: 0.09375 },\n  { x: 0.65625, y: 0.09375 },\n  { x: 0.71875, y: 0.09375 },\n  { x: 0.71875, y: 0.09375 },\n  { x: 0.78125, y: 0.09375 },\n  { x: 0.78125, y: 0.09375 },\n  { x: 0.84375, y: 0.09375 },\n  { x: 0.84375, y: 0.09375 },\n  { x: 0.90625, y: 0.09375 },\n  { x: 0.90625, y: 0.09375 },\n  { x: 0.96875, y: 0.09375 },\n  { x: 0.96875, y: 0.09375 },\n  { x: 0.03125, y: 0.15625 },\n  { x: 0.03125, y: 0.15625 },\n  { x: 0.09375, y: 0.15625 },\n  { x: 0.09375, y: 0.15625 },\n  { x: 0.15625, y: 0.15625 },\n  { x: 0.15625, y: 0.15625 },\n  { x: 0.21875, y: 0.15625 },\n  { x: 0.21875, y: 0.15625 },\n  { x: 0.28125, y: 0.15625 },\n  { x: 0.28125, y: 0.15625 },\n  { x: 0.34375, y: 0.15625 },\n  { x: 0.34375, y: 0.15625 },\n  { x: 0.40625, y: 0.15625 },\n  { x: 0.40625, y: 0.15625 },\n  { x: 0.46875, y: 0.15625 },\n  { x: 0.46875, y: 0.15625 },\n  { x: 0.53125, y: 0.15625 },\n  { x: 0.53125, y: 0.15625 },\n  { x: 0.59375, y: 0.15625 },\n  { x: 0.59375, y: 0.15625 },\n  { x: 0.65625, y: 0.15625 },\n  { x: 0.65625, y: 0.15625 },\n  { x: 0.71875, y: 0.15625 },\n  { x: 0.71875, y: 0.15625 },\n  { x: 0.78125, y: 0.15625 },\n  { x: 0.78125, y: 0.15625 },\n  { x: 0.84375, y: 0.15625 },\n  { x: 0.84375, y: 0.15625 },\n  { x: 0.90625, y: 0.15625 },\n  { x: 0.90625, y: 0.15625 },\n  { x: 0.96875, y: 0.15625 },\n  { x: 0.96875, y: 0.15625 },\n  { x: 0.03125, y: 0.21875 },\n  { x: 0.03125, y: 0.21875 },\n  { x: 0.09375, y: 0.21875 },\n  { x: 0.09375, y: 0.21875 },\n  { x: 0.15625, y: 0.21875 },\n  { x: 0.15625, y: 0.21875 },\n  { x: 0.21875, y: 0.21875 },\n  { x: 0.21875, y: 0.21875 },\n  { x: 0.28125, y: 0.21875 },\n  { x: 0.28125, y: 0.21875 },\n  { x: 0.34375, y: 0.21875 },\n  { x: 0.34375, y: 0.21875 },\n  { x: 0.40625, y: 0.21875 },\n  { x: 0.40625, y: 0.21875 },\n  { x: 0.46875, y: 0.21875 },\n  { x: 0.46875, y: 0.21875 },\n  { x: 0.53125, y: 0.21875 },\n  { x: 0.53125, y: 0.21875 },\n  { x: 0.59375, y: 0.21875 },\n  { x: 0.59375, y: 0.21875 },\n  { x: 0.65625, y: 0.21875 },\n  { x: 0.65625, y: 0.21875 },\n  { x: 0.71875, y: 0.21875 },\n  { x: 0.71875, y: 0.21875 },\n  { x: 0.78125, y: 0.21875 },\n  { x: 0.78125, y: 0.21875 },\n  { x: 0.84375, y: 0.21875 },\n  { x: 0.84375, y: 0.21875 },\n  { x: 0.90625, y: 0.21875 },\n  { x: 0.90625, y: 0.21875 },\n  { x: 0.96875, y: 0.21875 },\n  { x: 0.96875, y: 0.21875 },\n  { x: 0.03125, y: 0.28125 },\n  { x: 0.03125, y: 0.28125 },\n  { x: 0.09375, y: 0.28125 },\n  { x: 0.09375, y: 0.28125 },\n  { x: 0.15625, y: 0.28125 },\n  { x: 0.15625, y: 0.28125 },\n  { x: 0.21875, y: 0.28125 },\n  { x: 0.21875, y: 0.28125 },\n  { x: 0.28125, y: 0.28125 },\n  { x: 0.28125, y: 0.28125 },\n  { x: 0.34375, y: 0.28125 },\n  { x: 0.34375, y: 0.28125 },\n  { x: 0.40625, y: 0.28125 },\n  { x: 0.40625, y: 0.28125 },\n  { x: 0.46875, y: 0.28125 },\n  { x: 0.46875, y: 0.28125 },\n  { x: 0.53125, y: 0.28125 },\n  { x: 0.53125, y: 0.28125 },\n  { x: 0.59375, y: 0.28125 },\n  { x: 0.59375, y: 0.28125 },\n  { x: 0.65625, y: 0.28125 },\n  { x: 0.65625, y: 0.28125 },\n  { x: 0.71875, y: 0.28125 },\n  { x: 0.71875, y: 0.28125 },\n  { x: 0.78125, y: 0.28125 },\n  { x: 0.78125, y: 0.28125 },\n  { x: 0.84375, y: 0.28125 },\n  { x: 0.84375, y: 0.28125 },\n  { x: 0.90625, y: 0.28125 },\n  { x: 0.90625, y: 0.28125 },\n  { x: 0.96875, y: 0.28125 },\n  { x: 0.96875, y: 0.28125 },\n  { x: 0.03125, y: 0.34375 },\n  { x: 0.03125, y: 0.34375 },\n  { x: 0.09375, y: 0.34375 },\n  { x: 0.09375, y: 0.34375 },\n  { x: 0.15625, y: 0.34375 },\n  { x: 0.15625, y: 0.34375 },\n  { x: 0.21875, y: 0.34375 },\n  { x: 0.21875, y: 0.34375 },\n  { x: 0.28125, y: 0.34375 },\n  { x: 0.28125, y: 0.34375 },\n  { x: 0.34375, y: 0.34375 },\n  { x: 0.34375, y: 0.34375 },\n  { x: 0.40625, y: 0.34375 },\n  { x: 0.40625, y: 0.34375 },\n  { x: 0.46875, y: 0.34375 },\n  { x: 0.46875, y: 0.34375 },\n  { x: 0.53125, y: 0.34375 },\n  { x: 0.53125, y: 0.34375 },\n  { x: 0.59375, y: 0.34375 },\n  { x: 0.59375, y: 0.34375 },\n  { x: 0.65625, y: 0.34375 },\n  { x: 0.65625, y: 0.34375 },\n  { x: 0.71875, y: 0.34375 },\n  { x: 0.71875, y: 0.34375 },\n  { x: 0.78125, y: 0.34375 },\n  { x: 0.78125, y: 0.34375 },\n  { x: 0.84375, y: 0.34375 },\n  { x: 0.84375, y: 0.34375 },\n  { x: 0.90625, y: 0.34375 },\n  { x: 0.90625, y: 0.34375 },\n  { x: 0.96875, y: 0.34375 },\n  { x: 0.96875, y: 0.34375 },\n  { x: 0.03125, y: 0.40625 },\n  { x: 0.03125, y: 0.40625 },\n  { x: 0.09375, y: 0.40625 },\n  { x: 0.09375, y: 0.40625 },\n  { x: 0.15625, y: 0.40625 },\n  { x: 0.15625, y: 0.40625 },\n  { x: 0.21875, y: 0.40625 },\n  { x: 0.21875, y: 0.40625 },\n  { x: 0.28125, y: 0.40625 },\n  { x: 0.28125, y: 0.40625 },\n  { x: 0.34375, y: 0.40625 },\n  { x: 0.34375, y: 0.40625 },\n  { x: 0.40625, y: 0.40625 },\n  { x: 0.40625, y: 0.40625 },\n  { x: 0.46875, y: 0.40625 },\n  { x: 0.46875, y: 0.40625 },\n  { x: 0.53125, y: 0.40625 },\n  { x: 0.53125, y: 0.40625 },\n  { x: 0.59375, y: 0.40625 },\n  { x: 0.59375, y: 0.40625 },\n  { x: 0.65625, y: 0.40625 },\n  { x: 0.65625, y: 0.40625 },\n  { x: 0.71875, y: 0.40625 },\n  { x: 0.71875, y: 0.40625 },\n  { x: 0.78125, y: 0.40625 },\n  { x: 0.78125, y: 0.40625 },\n  { x: 0.84375, y: 0.40625 },\n  { x: 0.84375, y: 0.40625 },\n  { x: 0.90625, y: 0.40625 },\n  { x: 0.90625, y: 0.40625 },\n  { x: 0.96875, y: 0.40625 },\n  { x: 0.96875, y: 0.40625 },\n  { x: 0.03125, y: 0.46875 },\n  { x: 0.03125, y: 0.46875 },\n  { x: 0.09375, y: 0.46875 },\n  { x: 0.09375, y: 0.46875 },\n  { x: 0.15625, y: 0.46875 },\n  { x: 0.15625, y: 0.46875 },\n  { x: 0.21875, y: 0.46875 },\n  { x: 0.21875, y: 0.46875 },\n  { x: 0.28125, y: 0.46875 },\n  { x: 0.28125, y: 0.46875 },\n  { x: 0.34375, y: 0.46875 },\n  { x: 0.34375, y: 0.46875 },\n  { x: 0.40625, y: 0.46875 },\n  { x: 0.40625, y: 0.46875 },\n  { x: 0.46875, y: 0.46875 },\n  { x: 0.46875, y: 0.46875 },\n  { x: 0.53125, y: 0.46875 },\n  { x: 0.53125, y: 0.46875 },\n  { x: 0.59375, y: 0.46875 },\n  { x: 0.59375, y: 0.46875 },\n  { x: 0.65625, y: 0.46875 },\n  { x: 0.65625, y: 0.46875 },\n  { x: 0.71875, y: 0.46875 },\n  { x: 0.71875, y: 0.46875 },\n  { x: 0.78125, y: 0.46875 },\n  { x: 0.78125, y: 0.46875 },\n  { x: 0.84375, y: 0.46875 },\n  { x: 0.84375, y: 0.46875 },\n  { x: 0.90625, y: 0.46875 },\n  { x: 0.90625, y: 0.46875 },\n  { x: 0.96875, y: 0.46875 },\n  { x: 0.96875, y: 0.46875 },\n  { x: 0.03125, y: 0.53125 },\n  { x: 0.03125, y: 0.53125 },\n  { x: 0.09375, y: 0.53125 },\n  { x: 0.09375, y: 0.53125 },\n  { x: 0.15625, y: 0.53125 },\n  { x: 0.15625, y: 0.53125 },\n  { x: 0.21875, y: 0.53125 },\n  { x: 0.21875, y: 0.53125 },\n  { x: 0.28125, y: 0.53125 },\n  { x: 0.28125, y: 0.53125 },\n  { x: 0.34375, y: 0.53125 },\n  { x: 0.34375, y: 0.53125 },\n  { x: 0.40625, y: 0.53125 },\n  { x: 0.40625, y: 0.53125 },\n  { x: 0.46875, y: 0.53125 },\n  { x: 0.46875, y: 0.53125 },\n  { x: 0.53125, y: 0.53125 },\n  { x: 0.53125, y: 0.53125 },\n  { x: 0.59375, y: 0.53125 },\n  { x: 0.59375, y: 0.53125 },\n  { x: 0.65625, y: 0.53125 },\n  { x: 0.65625, y: 0.53125 },\n  { x: 0.71875, y: 0.53125 },\n  { x: 0.71875, y: 0.53125 },\n  { x: 0.78125, y: 0.53125 },\n  { x: 0.78125, y: 0.53125 },\n  { x: 0.84375, y: 0.53125 },\n  { x: 0.84375, y: 0.53125 },\n  { x: 0.90625, y: 0.53125 },\n  { x: 0.90625, y: 0.53125 },\n  { x: 0.96875, y: 0.53125 },\n  { x: 0.96875, y: 0.53125 },\n  { x: 0.03125, y: 0.59375 },\n  { x: 0.03125, y: 0.59375 },\n  { x: 0.09375, y: 0.59375 },\n  { x: 0.09375, y: 0.59375 },\n  { x: 0.15625, y: 0.59375 },\n  { x: 0.15625, y: 0.59375 },\n  { x: 0.21875, y: 0.59375 },\n  { x: 0.21875, y: 0.59375 },\n  { x: 0.28125, y: 0.59375 },\n  { x: 0.28125, y: 0.59375 },\n  { x: 0.34375, y: 0.59375 },\n  { x: 0.34375, y: 0.59375 },\n  { x: 0.40625, y: 0.59375 },\n  { x: 0.40625, y: 0.59375 },\n  { x: 0.46875, y: 0.59375 },\n  { x: 0.46875, y: 0.59375 },\n  { x: 0.53125, y: 0.59375 },\n  { x: 0.53125, y: 0.59375 },\n  { x: 0.59375, y: 0.59375 },\n  { x: 0.59375, y: 0.59375 },\n  { x: 0.65625, y: 0.59375 },\n  { x: 0.65625, y: 0.59375 },\n  { x: 0.71875, y: 0.59375 },\n  { x: 0.71875, y: 0.59375 },\n  { x: 0.78125, y: 0.59375 },\n  { x: 0.78125, y: 0.59375 },\n  { x: 0.84375, y: 0.59375 },\n  { x: 0.84375, y: 0.59375 },\n  { x: 0.90625, y: 0.59375 },\n  { x: 0.90625, y: 0.59375 },\n  { x: 0.96875, y: 0.59375 },\n  { x: 0.96875, y: 0.59375 },\n  { x: 0.03125, y: 0.65625 },\n  { x: 0.03125, y: 0.65625 },\n  { x: 0.09375, y: 0.65625 },\n  { x: 0.09375, y: 0.65625 },\n  { x: 0.15625, y: 0.65625 },\n  { x: 0.15625, y: 0.65625 },\n  { x: 0.21875, y: 0.65625 },\n  { x: 0.21875, y: 0.65625 },\n  { x: 0.28125, y: 0.65625 },\n  { x: 0.28125, y: 0.65625 },\n  { x: 0.34375, y: 0.65625 },\n  { x: 0.34375, y: 0.65625 },\n  { x: 0.40625, y: 0.65625 },\n  { x: 0.40625, y: 0.65625 },\n  { x: 0.46875, y: 0.65625 },\n  { x: 0.46875, y: 0.65625 },\n  { x: 0.53125, y: 0.65625 },\n  { x: 0.53125, y: 0.65625 },\n  { x: 0.59375, y: 0.65625 },\n  { x: 0.59375, y: 0.65625 },\n  { x: 0.65625, y: 0.65625 },\n  { x: 0.65625, y: 0.65625 },\n  { x: 0.71875, y: 0.65625 },\n  { x: 0.71875, y: 0.65625 },\n  { x: 0.78125, y: 0.65625 },\n  { x: 0.78125, y: 0.65625 },\n  { x: 0.84375, y: 0.65625 },\n  { x: 0.84375, y: 0.65625 },\n  { x: 0.90625, y: 0.65625 },\n  { x: 0.90625, y: 0.65625 },\n  { x: 0.96875, y: 0.65625 },\n  { x: 0.96875, y: 0.65625 },\n  { x: 0.03125, y: 0.71875 },\n  { x: 0.03125, y: 0.71875 },\n  { x: 0.09375, y: 0.71875 },\n  { x: 0.09375, y: 0.71875 },\n  { x: 0.15625, y: 0.71875 },\n  { x: 0.15625, y: 0.71875 },\n  { x: 0.21875, y: 0.71875 },\n  { x: 0.21875, y: 0.71875 },\n  { x: 0.28125, y: 0.71875 },\n  { x: 0.28125, y: 0.71875 },\n  { x: 0.34375, y: 0.71875 },\n  { x: 0.34375, y: 0.71875 },\n  { x: 0.40625, y: 0.71875 },\n  { x: 0.40625, y: 0.71875 },\n  { x: 0.46875, y: 0.71875 },\n  { x: 0.46875, y: 0.71875 },\n  { x: 0.53125, y: 0.71875 },\n  { x: 0.53125, y: 0.71875 },\n  { x: 0.59375, y: 0.71875 },\n  { x: 0.59375, y: 0.71875 },\n  { x: 0.65625, y: 0.71875 },\n  { x: 0.65625, y: 0.71875 },\n  { x: 0.71875, y: 0.71875 },\n  { x: 0.71875, y: 0.71875 },\n  { x: 0.78125, y: 0.71875 },\n  { x: 0.78125, y: 0.71875 },\n  { x: 0.84375, y: 0.71875 },\n  { x: 0.84375, y: 0.71875 },\n  { x: 0.90625, y: 0.71875 },\n  { x: 0.90625, y: 0.71875 },\n  { x: 0.96875, y: 0.71875 },\n  { x: 0.96875, y: 0.71875 },\n  { x: 0.03125, y: 0.78125 },\n  { x: 0.03125, y: 0.78125 },\n  { x: 0.09375, y: 0.78125 },\n  { x: 0.09375, y: 0.78125 },\n  { x: 0.15625, y: 0.78125 },\n  { x: 0.15625, y: 0.78125 },\n  { x: 0.21875, y: 0.78125 },\n  { x: 0.21875, y: 0.78125 },\n  { x: 0.28125, y: 0.78125 },\n  { x: 0.28125, y: 0.78125 },\n  { x: 0.34375, y: 0.78125 },\n  { x: 0.34375, y: 0.78125 },\n  { x: 0.40625, y: 0.78125 },\n  { x: 0.40625, y: 0.78125 },\n  { x: 0.46875, y: 0.78125 },\n  { x: 0.46875, y: 0.78125 },\n  { x: 0.53125, y: 0.78125 },\n  { x: 0.53125, y: 0.78125 },\n  { x: 0.59375, y: 0.78125 },\n  { x: 0.59375, y: 0.78125 },\n  { x: 0.65625, y: 0.78125 },\n  { x: 0.65625, y: 0.78125 },\n  { x: 0.71875, y: 0.78125 },\n  { x: 0.71875, y: 0.78125 },\n  { x: 0.78125, y: 0.78125 },\n  { x: 0.78125, y: 0.78125 },\n  { x: 0.84375, y: 0.78125 },\n  { x: 0.84375, y: 0.78125 },\n  { x: 0.90625, y: 0.78125 },\n  { x: 0.90625, y: 0.78125 },\n  { x: 0.96875, y: 0.78125 },\n  { x: 0.96875, y: 0.78125 },\n  { x: 0.03125, y: 0.84375 },\n  { x: 0.03125, y: 0.84375 },\n  { x: 0.09375, y: 0.84375 },\n  { x: 0.09375, y: 0.84375 },\n  { x: 0.15625, y: 0.84375 },\n  { x: 0.15625, y: 0.84375 },\n  { x: 0.21875, y: 0.84375 },\n  { x: 0.21875, y: 0.84375 },\n  { x: 0.28125, y: 0.84375 },\n  { x: 0.28125, y: 0.84375 },\n  { x: 0.34375, y: 0.84375 },\n  { x: 0.34375, y: 0.84375 },\n  { x: 0.40625, y: 0.84375 },\n  { x: 0.40625, y: 0.84375 },\n  { x: 0.46875, y: 0.84375 },\n  { x: 0.46875, y: 0.84375 },\n  { x: 0.53125, y: 0.84375 },\n  { x: 0.53125, y: 0.84375 },\n  { x: 0.59375, y: 0.84375 },\n  { x: 0.59375, y: 0.84375 },\n  { x: 0.65625, y: 0.84375 },\n  { x: 0.65625, y: 0.84375 },\n  { x: 0.71875, y: 0.84375 },\n  { x: 0.71875, y: 0.84375 },\n  { x: 0.78125, y: 0.84375 },\n  { x: 0.78125, y: 0.84375 },\n  { x: 0.84375, y: 0.84375 },\n  { x: 0.84375, y: 0.84375 },\n  { x: 0.90625, y: 0.84375 },\n  { x: 0.90625, y: 0.84375 },\n  { x: 0.96875, y: 0.84375 },\n  { x: 0.96875, y: 0.84375 },\n  { x: 0.03125, y: 0.90625 },\n  { x: 0.03125, y: 0.90625 },\n  { x: 0.09375, y: 0.90625 },\n  { x: 0.09375, y: 0.90625 },\n  { x: 0.15625, y: 0.90625 },\n  { x: 0.15625, y: 0.90625 },\n  { x: 0.21875, y: 0.90625 },\n  { x: 0.21875, y: 0.90625 },\n  { x: 0.28125, y: 0.90625 },\n  { x: 0.28125, y: 0.90625 },\n  { x: 0.34375, y: 0.90625 },\n  { x: 0.34375, y: 0.90625 },\n  { x: 0.40625, y: 0.90625 },\n  { x: 0.40625, y: 0.90625 },\n  { x: 0.46875, y: 0.90625 },\n  { x: 0.46875, y: 0.90625 },\n  { x: 0.53125, y: 0.90625 },\n  { x: 0.53125, y: 0.90625 },\n  { x: 0.59375, y: 0.90625 },\n  { x: 0.59375, y: 0.90625 },\n  { x: 0.65625, y: 0.90625 },\n  { x: 0.65625, y: 0.90625 },\n  { x: 0.71875, y: 0.90625 },\n  { x: 0.71875, y: 0.90625 },\n  { x: 0.78125, y: 0.90625 },\n  { x: 0.78125, y: 0.90625 },\n  { x: 0.84375, y: 0.90625 },\n  { x: 0.84375, y: 0.90625 },\n  { x: 0.90625, y: 0.90625 },\n  { x: 0.90625, y: 0.90625 },\n  { x: 0.96875, y: 0.90625 },\n  { x: 0.96875, y: 0.90625 },\n  { x: 0.03125, y: 0.96875 },\n  { x: 0.03125, y: 0.96875 },\n  { x: 0.09375, y: 0.96875 },\n  { x: 0.09375, y: 0.96875 },\n  { x: 0.15625, y: 0.96875 },\n  { x: 0.15625, y: 0.96875 },\n  { x: 0.21875, y: 0.96875 },\n  { x: 0.21875, y: 0.96875 },\n  { x: 0.28125, y: 0.96875 },\n  { x: 0.28125, y: 0.96875 },\n  { x: 0.34375, y: 0.96875 },\n  { x: 0.34375, y: 0.96875 },\n  { x: 0.40625, y: 0.96875 },\n  { x: 0.40625, y: 0.96875 },\n  { x: 0.46875, y: 0.96875 },\n  { x: 0.46875, y: 0.96875 },\n  { x: 0.53125, y: 0.96875 },\n  { x: 0.53125, y: 0.96875 },\n  { x: 0.59375, y: 0.96875 },\n  { x: 0.59375, y: 0.96875 },\n  { x: 0.65625, y: 0.96875 },\n  { x: 0.65625, y: 0.96875 },\n  { x: 0.71875, y: 0.96875 },\n  { x: 0.71875, y: 0.96875 },\n  { x: 0.78125, y: 0.96875 },\n  { x: 0.78125, y: 0.96875 },\n  { x: 0.84375, y: 0.96875 },\n  { x: 0.84375, y: 0.96875 },\n  { x: 0.90625, y: 0.96875 },\n  { x: 0.90625, y: 0.96875 },\n  { x: 0.96875, y: 0.96875 },\n  { x: 0.96875, y: 0.96875 },\n  { x: 0.0625, y: 0.0625 },\n  { x: 0.0625, y: 0.0625 },\n  { x: 0.0625, y: 0.0625 },\n  { x: 0.0625, y: 0.0625 },\n  { x: 0.0625, y: 0.0625 },\n  { x: 0.0625, y: 0.0625 },\n  { x: 0.1875, y: 0.0625 },\n  { x: 0.1875, y: 0.0625 },\n  { x: 0.1875, y: 0.0625 },\n  { x: 0.1875, y: 0.0625 },\n  { x: 0.1875, y: 0.0625 },\n  { x: 0.1875, y: 0.0625 },\n  { x: 0.3125, y: 0.0625 },\n  { x: 0.3125, y: 0.0625 },\n  { x: 0.3125, y: 0.0625 },\n  { x: 0.3125, y: 0.0625 },\n  { x: 0.3125, y: 0.0625 },\n  { x: 0.3125, y: 0.0625 },\n  { x: 0.4375, y: 0.0625 },\n  { x: 0.4375, y: 0.0625 },\n  { x: 0.4375, y: 0.0625 },\n  { x: 0.4375, y: 0.0625 },\n  { x: 0.4375, y: 0.0625 },\n  { x: 0.4375, y: 0.0625 },\n  { x: 0.5625, y: 0.0625 },\n  { x: 0.5625, y: 0.0625 },\n  { x: 0.5625, y: 0.0625 },\n  { x: 0.5625, y: 0.0625 },\n  { x: 0.5625, y: 0.0625 },\n  { x: 0.5625, y: 0.0625 },\n  { x: 0.6875, y: 0.0625 },\n  { x: 0.6875, y: 0.0625 },\n  { x: 0.6875, y: 0.0625 },\n  { x: 0.6875, y: 0.0625 },\n  { x: 0.6875, y: 0.0625 },\n  { x: 0.6875, y: 0.0625 },\n  { x: 0.8125, y: 0.0625 },\n  { x: 0.8125, y: 0.0625 },\n  { x: 0.8125, y: 0.0625 },\n  { x: 0.8125, y: 0.0625 },\n  { x: 0.8125, y: 0.0625 },\n  { x: 0.8125, y: 0.0625 },\n  { x: 0.9375, y: 0.0625 },\n  { x: 0.9375, y: 0.0625 },\n  { x: 0.9375, y: 0.0625 },\n  { x: 0.9375, y: 0.0625 },\n  { x: 0.9375, y: 0.0625 },\n  { x: 0.9375, y: 0.0625 },\n  { x: 0.0625, y: 0.1875 },\n  { x: 0.0625, y: 0.1875 },\n  { x: 0.0625, y: 0.1875 },\n  { x: 0.0625, y: 0.1875 },\n  { x: 0.0625, y: 0.1875 },\n  { x: 0.0625, y: 0.1875 },\n  { x: 0.1875, y: 0.1875 },\n  { x: 0.1875, y: 0.1875 },\n  { x: 0.1875, y: 0.1875 },\n  { x: 0.1875, y: 0.1875 },\n  { x: 0.1875, y: 0.1875 },\n  { x: 0.1875, y: 0.1875 },\n  { x: 0.3125, y: 0.1875 },\n  { x: 0.3125, y: 0.1875 },\n  { x: 0.3125, y: 0.1875 },\n  { x: 0.3125, y: 0.1875 },\n  { x: 0.3125, y: 0.1875 },\n  { x: 0.3125, y: 0.1875 },\n  { x: 0.4375, y: 0.1875 },\n  { x: 0.4375, y: 0.1875 },\n  { x: 0.4375, y: 0.1875 },\n  { x: 0.4375, y: 0.1875 },\n  { x: 0.4375, y: 0.1875 },\n  { x: 0.4375, y: 0.1875 },\n  { x: 0.5625, y: 0.1875 },\n  { x: 0.5625, y: 0.1875 },\n  { x: 0.5625, y: 0.1875 },\n  { x: 0.5625, y: 0.1875 },\n  { x: 0.5625, y: 0.1875 },\n  { x: 0.5625, y: 0.1875 },\n  { x: 0.6875, y: 0.1875 },\n  { x: 0.6875, y: 0.1875 },\n  { x: 0.6875, y: 0.1875 },\n  { x: 0.6875, y: 0.1875 },\n  { x: 0.6875, y: 0.1875 },\n  { x: 0.6875, y: 0.1875 },\n  { x: 0.8125, y: 0.1875 },\n  { x: 0.8125, y: 0.1875 },\n  { x: 0.8125, y: 0.1875 },\n  { x: 0.8125, y: 0.1875 },\n  { x: 0.8125, y: 0.1875 },\n  { x: 0.8125, y: 0.1875 },\n  { x: 0.9375, y: 0.1875 },\n  { x: 0.9375, y: 0.1875 },\n  { x: 0.9375, y: 0.1875 },\n  { x: 0.9375, y: 0.1875 },\n  { x: 0.9375, y: 0.1875 },\n  { x: 0.9375, y: 0.1875 },\n  { x: 0.0625, y: 0.3125 },\n  { x: 0.0625, y: 0.3125 },\n  { x: 0.0625, y: 0.3125 },\n  { x: 0.0625, y: 0.3125 },\n  { x: 0.0625, y: 0.3125 },\n  { x: 0.0625, y: 0.3125 },\n  { x: 0.1875, y: 0.3125 },\n  { x: 0.1875, y: 0.3125 },\n  { x: 0.1875, y: 0.3125 },\n  { x: 0.1875, y: 0.3125 },\n  { x: 0.1875, y: 0.3125 },\n  { x: 0.1875, y: 0.3125 },\n  { x: 0.3125, y: 0.3125 },\n  { x: 0.3125, y: 0.3125 },\n  { x: 0.3125, y: 0.3125 },\n  { x: 0.3125, y: 0.3125 },\n  { x: 0.3125, y: 0.3125 },\n  { x: 0.3125, y: 0.3125 },\n  { x: 0.4375, y: 0.3125 },\n  { x: 0.4375, y: 0.3125 },\n  { x: 0.4375, y: 0.3125 },\n  { x: 0.4375, y: 0.3125 },\n  { x: 0.4375, y: 0.3125 },\n  { x: 0.4375, y: 0.3125 },\n  { x: 0.5625, y: 0.3125 },\n  { x: 0.5625, y: 0.3125 },\n  { x: 0.5625, y: 0.3125 },\n  { x: 0.5625, y: 0.3125 },\n  { x: 0.5625, y: 0.3125 },\n  { x: 0.5625, y: 0.3125 },\n  { x: 0.6875, y: 0.3125 },\n  { x: 0.6875, y: 0.3125 },\n  { x: 0.6875, y: 0.3125 },\n  { x: 0.6875, y: 0.3125 },\n  { x: 0.6875, y: 0.3125 },\n  { x: 0.6875, y: 0.3125 },\n  { x: 0.8125, y: 0.3125 },\n  { x: 0.8125, y: 0.3125 },\n  { x: 0.8125, y: 0.3125 },\n  { x: 0.8125, y: 0.3125 },\n  { x: 0.8125, y: 0.3125 },\n  { x: 0.8125, y: 0.3125 },\n  { x: 0.9375, y: 0.3125 },\n  { x: 0.9375, y: 0.3125 },\n  { x: 0.9375, y: 0.3125 },\n  { x: 0.9375, y: 0.3125 },\n  { x: 0.9375, y: 0.3125 },\n  { x: 0.9375, y: 0.3125 },\n  { x: 0.0625, y: 0.4375 },\n  { x: 0.0625, y: 0.4375 },\n  { x: 0.0625, y: 0.4375 },\n  { x: 0.0625, y: 0.4375 },\n  { x: 0.0625, y: 0.4375 },\n  { x: 0.0625, y: 0.4375 },\n  { x: 0.1875, y: 0.4375 },\n  { x: 0.1875, y: 0.4375 },\n  { x: 0.1875, y: 0.4375 },\n  { x: 0.1875, y: 0.4375 },\n  { x: 0.1875, y: 0.4375 },\n  { x: 0.1875, y: 0.4375 },\n  { x: 0.3125, y: 0.4375 },\n  { x: 0.3125, y: 0.4375 },\n  { x: 0.3125, y: 0.4375 },\n  { x: 0.3125, y: 0.4375 },\n  { x: 0.3125, y: 0.4375 },\n  { x: 0.3125, y: 0.4375 },\n  { x: 0.4375, y: 0.4375 },\n  { x: 0.4375, y: 0.4375 },\n  { x: 0.4375, y: 0.4375 },\n  { x: 0.4375, y: 0.4375 },\n  { x: 0.4375, y: 0.4375 },\n  { x: 0.4375, y: 0.4375 },\n  { x: 0.5625, y: 0.4375 },\n  { x: 0.5625, y: 0.4375 },\n  { x: 0.5625, y: 0.4375 },\n  { x: 0.5625, y: 0.4375 },\n  { x: 0.5625, y: 0.4375 },\n  { x: 0.5625, y: 0.4375 },\n  { x: 0.6875, y: 0.4375 },\n  { x: 0.6875, y: 0.4375 },\n  { x: 0.6875, y: 0.4375 },\n  { x: 0.6875, y: 0.4375 },\n  { x: 0.6875, y: 0.4375 },\n  { x: 0.6875, y: 0.4375 },\n  { x: 0.8125, y: 0.4375 },\n  { x: 0.8125, y: 0.4375 },\n  { x: 0.8125, y: 0.4375 },\n  { x: 0.8125, y: 0.4375 },\n  { x: 0.8125, y: 0.4375 },\n  { x: 0.8125, y: 0.4375 },\n  { x: 0.9375, y: 0.4375 },\n  { x: 0.9375, y: 0.4375 },\n  { x: 0.9375, y: 0.4375 },\n  { x: 0.9375, y: 0.4375 },\n  { x: 0.9375, y: 0.4375 },\n  { x: 0.9375, y: 0.4375 },\n  { x: 0.0625, y: 0.5625 },\n  { x: 0.0625, y: 0.5625 },\n  { x: 0.0625, y: 0.5625 },\n  { x: 0.0625, y: 0.5625 },\n  { x: 0.0625, y: 0.5625 },\n  { x: 0.0625, y: 0.5625 },\n  { x: 0.1875, y: 0.5625 },\n  { x: 0.1875, y: 0.5625 },\n  { x: 0.1875, y: 0.5625 },\n  { x: 0.1875, y: 0.5625 },\n  { x: 0.1875, y: 0.5625 },\n  { x: 0.1875, y: 0.5625 },\n  { x: 0.3125, y: 0.5625 },\n  { x: 0.3125, y: 0.5625 },\n  { x: 0.3125, y: 0.5625 },\n  { x: 0.3125, y: 0.5625 },\n  { x: 0.3125, y: 0.5625 },\n  { x: 0.3125, y: 0.5625 },\n  { x: 0.4375, y: 0.5625 },\n  { x: 0.4375, y: 0.5625 },\n  { x: 0.4375, y: 0.5625 },\n  { x: 0.4375, y: 0.5625 },\n  { x: 0.4375, y: 0.5625 },\n  { x: 0.4375, y: 0.5625 },\n  { x: 0.5625, y: 0.5625 },\n  { x: 0.5625, y: 0.5625 },\n  { x: 0.5625, y: 0.5625 },\n  { x: 0.5625, y: 0.5625 },\n  { x: 0.5625, y: 0.5625 },\n  { x: 0.5625, y: 0.5625 },\n  { x: 0.6875, y: 0.5625 },\n  { x: 0.6875, y: 0.5625 },\n  { x: 0.6875, y: 0.5625 },\n  { x: 0.6875, y: 0.5625 },\n  { x: 0.6875, y: 0.5625 },\n  { x: 0.6875, y: 0.5625 },\n  { x: 0.8125, y: 0.5625 },\n  { x: 0.8125, y: 0.5625 },\n  { x: 0.8125, y: 0.5625 },\n  { x: 0.8125, y: 0.5625 },\n  { x: 0.8125, y: 0.5625 },\n  { x: 0.8125, y: 0.5625 },\n  { x: 0.9375, y: 0.5625 },\n  { x: 0.9375, y: 0.5625 },\n  { x: 0.9375, y: 0.5625 },\n  { x: 0.9375, y: 0.5625 },\n  { x: 0.9375, y: 0.5625 },\n  { x: 0.9375, y: 0.5625 },\n  { x: 0.0625, y: 0.6875 },\n  { x: 0.0625, y: 0.6875 },\n  { x: 0.0625, y: 0.6875 },\n  { x: 0.0625, y: 0.6875 },\n  { x: 0.0625, y: 0.6875 },\n  { x: 0.0625, y: 0.6875 },\n  { x: 0.1875, y: 0.6875 },\n  { x: 0.1875, y: 0.6875 },\n  { x: 0.1875, y: 0.6875 },\n  { x: 0.1875, y: 0.6875 },\n  { x: 0.1875, y: 0.6875 },\n  { x: 0.1875, y: 0.6875 },\n  { x: 0.3125, y: 0.6875 },\n  { x: 0.3125, y: 0.6875 },\n  { x: 0.3125, y: 0.6875 },\n  { x: 0.3125, y: 0.6875 },\n  { x: 0.3125, y: 0.6875 },\n  { x: 0.3125, y: 0.6875 },\n  { x: 0.4375, y: 0.6875 },\n  { x: 0.4375, y: 0.6875 },\n  { x: 0.4375, y: 0.6875 },\n  { x: 0.4375, y: 0.6875 },\n  { x: 0.4375, y: 0.6875 },\n  { x: 0.4375, y: 0.6875 },\n  { x: 0.5625, y: 0.6875 },\n  { x: 0.5625, y: 0.6875 },\n  { x: 0.5625, y: 0.6875 },\n  { x: 0.5625, y: 0.6875 },\n  { x: 0.5625, y: 0.6875 },\n  { x: 0.5625, y: 0.6875 },\n  { x: 0.6875, y: 0.6875 },\n  { x: 0.6875, y: 0.6875 },\n  { x: 0.6875, y: 0.6875 },\n  { x: 0.6875, y: 0.6875 },\n  { x: 0.6875, y: 0.6875 },\n  { x: 0.6875, y: 0.6875 },\n  { x: 0.8125, y: 0.6875 },\n  { x: 0.8125, y: 0.6875 },\n  { x: 0.8125, y: 0.6875 },\n  { x: 0.8125, y: 0.6875 },\n  { x: 0.8125, y: 0.6875 },\n  { x: 0.8125, y: 0.6875 },\n  { x: 0.9375, y: 0.6875 },\n  { x: 0.9375, y: 0.6875 },\n  { x: 0.9375, y: 0.6875 },\n  { x: 0.9375, y: 0.6875 },\n  { x: 0.9375, y: 0.6875 },\n  { x: 0.9375, y: 0.6875 },\n  { x: 0.0625, y: 0.8125 },\n  { x: 0.0625, y: 0.8125 },\n  { x: 0.0625, y: 0.8125 },\n  { x: 0.0625, y: 0.8125 },\n  { x: 0.0625, y: 0.8125 },\n  { x: 0.0625, y: 0.8125 },\n  { x: 0.1875, y: 0.8125 },\n  { x: 0.1875, y: 0.8125 },\n  { x: 0.1875, y: 0.8125 },\n  { x: 0.1875, y: 0.8125 },\n  { x: 0.1875, y: 0.8125 },\n  { x: 0.1875, y: 0.8125 },\n  { x: 0.3125, y: 0.8125 },\n  { x: 0.3125, y: 0.8125 },\n  { x: 0.3125, y: 0.8125 },\n  { x: 0.3125, y: 0.8125 },\n  { x: 0.3125, y: 0.8125 },\n  { x: 0.3125, y: 0.8125 },\n  { x: 0.4375, y: 0.8125 },\n  { x: 0.4375, y: 0.8125 },\n  { x: 0.4375, y: 0.8125 },\n  { x: 0.4375, y: 0.8125 },\n  { x: 0.4375, y: 0.8125 },\n  { x: 0.4375, y: 0.8125 },\n  { x: 0.5625, y: 0.8125 },\n  { x: 0.5625, y: 0.8125 },\n  { x: 0.5625, y: 0.8125 },\n  { x: 0.5625, y: 0.8125 },\n  { x: 0.5625, y: 0.8125 },\n  { x: 0.5625, y: 0.8125 },\n  { x: 0.6875, y: 0.8125 },\n  { x: 0.6875, y: 0.8125 },\n  { x: 0.6875, y: 0.8125 },\n  { x: 0.6875, y: 0.8125 },\n  { x: 0.6875, y: 0.8125 },\n  { x: 0.6875, y: 0.8125 },\n  { x: 0.8125, y: 0.8125 },\n  { x: 0.8125, y: 0.8125 },\n  { x: 0.8125, y: 0.8125 },\n  { x: 0.8125, y: 0.8125 },\n  { x: 0.8125, y: 0.8125 },\n  { x: 0.8125, y: 0.8125 },\n  { x: 0.9375, y: 0.8125 },\n  { x: 0.9375, y: 0.8125 },\n  { x: 0.9375, y: 0.8125 },\n  { x: 0.9375, y: 0.8125 },\n  { x: 0.9375, y: 0.8125 },\n  { x: 0.9375, y: 0.8125 },\n  { x: 0.0625, y: 0.9375 },\n  { x: 0.0625, y: 0.9375 },\n  { x: 0.0625, y: 0.9375 },\n  { x: 0.0625, y: 0.9375 },\n  { x: 0.0625, y: 0.9375 },\n  { x: 0.0625, y: 0.9375 },\n  { x: 0.1875, y: 0.9375 },\n  { x: 0.1875, y: 0.9375 },\n  { x: 0.1875, y: 0.9375 },\n  { x: 0.1875, y: 0.9375 },\n  { x: 0.1875, y: 0.9375 },\n  { x: 0.1875, y: 0.9375 },\n  { x: 0.3125, y: 0.9375 },\n  { x: 0.3125, y: 0.9375 },\n  { x: 0.3125, y: 0.9375 },\n  { x: 0.3125, y: 0.9375 },\n  { x: 0.3125, y: 0.9375 },\n  { x: 0.3125, y: 0.9375 },\n  { x: 0.4375, y: 0.9375 },\n  { x: 0.4375, y: 0.9375 },\n  { x: 0.4375, y: 0.9375 },\n  { x: 0.4375, y: 0.9375 },\n  { x: 0.4375, y: 0.9375 },\n  { x: 0.4375, y: 0.9375 },\n  { x: 0.5625, y: 0.9375 },\n  { x: 0.5625, y: 0.9375 },\n  { x: 0.5625, y: 0.9375 },\n  { x: 0.5625, y: 0.9375 },\n  { x: 0.5625, y: 0.9375 },\n  { x: 0.5625, y: 0.9375 },\n  { x: 0.6875, y: 0.9375 },\n  { x: 0.6875, y: 0.9375 },\n  { x: 0.6875, y: 0.9375 },\n  { x: 0.6875, y: 0.9375 },\n  { x: 0.6875, y: 0.9375 },\n  { x: 0.6875, y: 0.9375 },\n  { x: 0.8125, y: 0.9375 },\n  { x: 0.8125, y: 0.9375 },\n  { x: 0.8125, y: 0.9375 },\n  { x: 0.8125, y: 0.9375 },\n  { x: 0.8125, y: 0.9375 },\n  { x: 0.8125, y: 0.9375 },\n  { x: 0.9375, y: 0.9375 },\n  { x: 0.9375, y: 0.9375 },\n  { x: 0.9375, y: 0.9375 },\n  { x: 0.9375, y: 0.9375 },\n  { x: 0.9375, y: 0.9375 },\n  { x: 0.9375, y: 0.9375 },\n];\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nexport class HandDetector {\n  model: GraphModel;\n  anchors: number[][];\n  anchorsTensor: Tensor;\n  inputSize: number;\n  inputSizeTensor: Tensor;\n  doubleInputSizeTensor: Tensor;\n\n  constructor(model) {\n    this.model = model;\n    this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n    this.anchorsTensor = tf.tensor2d(this.anchors);\n    // @ts-ignore model is not undefined here\n    this.inputSize = this.model?.inputs[0].shape[2];\n    this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n    this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n  }\n\n  normalizeBoxes(boxes) {\n    return tf.tidy(() => {\n      const boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n      const boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n      const boxCenterPoints = tf.add(tf.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor);\n      const halfBoxSizes = tf.div(boxSizes, this.doubleInputSizeTensor);\n      const startPoints = tf.mul(tf.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n      const endPoints = tf.mul(tf.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n      return tf.concat2d([startPoints, endPoints], 1);\n    });\n  }\n\n  normalizeLandmarks(rawPalmLandmarks, index) {\n    return tf.tidy(() => {\n      const landmarks = tf.add(tf.div(tf.reshape(rawPalmLandmarks, [-1, 7, 2]), this.inputSizeTensor), this.anchors[index]);\n      return tf.mul(landmarks, this.inputSizeTensor);\n    });\n  }\n\n  async getBoxes(input, config) {\n    const batched = this.model.predict(input) as Tensor;\n    const predictions = tf.squeeze(batched);\n    tf.dispose(batched);\n    const scoresT = tf.tidy(() => tf.squeeze(tf.sigmoid(tf.slice(predictions, [0, 0], [-1, 1]))));\n    const scores = await scoresT.data();\n    const rawBoxes = tf.slice(predictions, [0, 1], [-1, 4]);\n    const boxes = this.normalizeBoxes(rawBoxes);\n    tf.dispose(rawBoxes);\n    const filteredT = await tf.image.nonMaxSuppressionAsync(boxes, scores, config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n    const filtered = await filteredT.array();\n\n    tf.dispose(scoresT);\n    tf.dispose(filteredT);\n    const hands: Array<{ box: Tensor, palmLandmarks: Tensor, confidence: number }> = [];\n    for (const index of filtered) {\n      if (scores[index] >= config.hand.minConfidence) {\n        const matchingBox = tf.slice(boxes, [index, 0], [1, -1]);\n        const rawPalmLandmarks = tf.slice(predictions, [index, 5], [1, 14]);\n        const palmLandmarks = tf.tidy(() => tf.reshape(this.normalizeLandmarks(rawPalmLandmarks, index), [-1, 2]));\n        tf.dispose(rawPalmLandmarks);\n        hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] });\n      }\n    }\n    tf.dispose(predictions);\n    tf.dispose(boxes);\n    return hands;\n  }\n\n  async estimateHandBounds(input, config): Promise<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }[]> {\n    const inputHeight = input.shape[1];\n    const inputWidth = input.shape[2];\n    const image = tf.tidy(() => tf.sub(tf.div(tf.image.resizeBilinear(input, [this.inputSize, this.inputSize]), 127.5), 1));\n    const predictions = await this.getBoxes(image, config);\n    tf.dispose(image);\n    const hands: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number }> = [];\n    if (!predictions || predictions.length === 0) return hands;\n    for (const prediction of predictions) {\n      const boxes = await prediction.box.data();\n      const startPoint = boxes.slice(0, 2);\n      const endPoint = boxes.slice(2, 4);\n      const palmLandmarks = await prediction.palmLandmarks.array();\n      tf.dispose(prediction.box);\n      tf.dispose(prediction.palmLandmarks);\n      hands.push(box.scaleBoxCoordinates({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize]));\n    }\n    return hands;\n  }\n}\n", "export function normalizeRadians(angle) {\n  return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n  const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n  return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n  let product = 0;\n  for (let i = 0; i < v1.length; i++) {\n    product += v1[i] * v2[i];\n  }\n  return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n  const column: Array<number> = [];\n  for (let i = 0; i < arr.length; i++) {\n    column.push(arr[i][columnIndex]);\n  }\n  return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n  const product: Array<number[]> = [];\n  const size = mat1.length;\n  for (let row = 0; row < size; row++) {\n    product.push([]);\n    for (let col = 0; col < size; col++) {\n      product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n    }\n  }\n  return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n  const cosA = Math.cos(rotation);\n  const sinA = Math.sin(rotation);\n  const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n  const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n  const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n  const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n  return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n  const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n  const translationComponent = [matrix[0][2], matrix[1][2]];\n  const invertedTranslation = [\n    -dot(rotationComponent[0], translationComponent),\n    -dot(rotationComponent[1], translationComponent),\n  ];\n  return [\n    rotationComponent[0].concat(invertedTranslation[0]),\n    rotationComponent[1].concat(invertedTranslation[1]),\n    [0, 0, 1],\n  ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n  return [\n    dot(homogeneousCoordinate, rotationMatrix[0]),\n    dot(homogeneousCoordinate, rotationMatrix[1]),\n  ];\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\nimport * as detector from './handdetector';\nimport { Tensor, GraphModel } from '../tfjs/types';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\n\nexport class HandPipeline {\n  handDetector: detector.HandDetector;\n  handPoseModel: GraphModel;\n  inputSize: number;\n  storedBoxes: Array<{ startPoint: number[]; endPoint: number[]; palmLandmarks: number[]; confidence: number } | null>;\n  skipped: number;\n  detectedHands: number;\n\n  constructor(handDetector, handPoseModel) {\n    this.handDetector = handDetector;\n    this.handPoseModel = handPoseModel;\n    // @ts-ignore model is not undefined here\n    this.inputSize = this.handPoseModel?.inputs[0].shape[2];\n    this.storedBoxes = [];\n    this.skipped = 0;\n    this.detectedHands = 0;\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  calculateLandmarksBoundingBox(landmarks) {\n    const xs = landmarks.map((d) => d[0]);\n    const ys = landmarks.map((d) => d[1]);\n    const startPoint = [Math.min(...xs), Math.min(...ys)];\n    const endPoint = [Math.max(...xs), Math.max(...ys)];\n    return { startPoint, endPoint };\n  }\n\n  getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n    const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n    const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n    return box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n  }\n\n  getBoxForHandLandmarks(landmarks) {\n    const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n    const boxAroundHand = box.enlargeBox(box.squarifyBox(boundingBox), handBoxEnlargeFactor);\n    boxAroundHand.palmLandmarks = [];\n    for (let i = 0; i < palmLandmarkIds.length; i++) {\n      boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n    }\n    return boxAroundHand;\n  }\n\n  transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n    const boxSize = box.getBoxSize(box2);\n    const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n    const coordsScaled = rawCoords.map((coord) => [\n      scaleFactor[0] * (coord[0] - this.inputSize / 2),\n      scaleFactor[1] * (coord[1] - this.inputSize / 2),\n      scaleFactor[2] * coord[2],\n    ]);\n    const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n    const coordsRotated = coordsScaled.map((coord) => {\n      const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n      return [...rotated, coord[2]];\n    });\n    const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n    const boxCenter = [...box.getBoxCenter(box2), 1];\n    const originalBoxCenter = [\n      util.dot(boxCenter, inverseRotationMatrix[0]),\n      util.dot(boxCenter, inverseRotationMatrix[1]),\n    ];\n    return coordsRotated.map((coord) => [\n      Math.trunc(coord[0] + originalBoxCenter[0]),\n      Math.trunc(coord[1] + originalBoxCenter[1]),\n      Math.trunc(coord[2]),\n    ]);\n  }\n\n  async estimateHands(image, config) {\n    let useFreshBox = false;\n\n    // run new detector every skipFrames unless we only want box to start with\n    let boxes;\n\n    // console.log(this.skipped, config.hand.skipFrames, !config.hand.landmarks, !config.skipFrame);\n    if ((this.skipped === 0) || (this.skipped > config.hand.skipFrames) || !config.hand.landmarks || !config.skipFrame) {\n      boxes = await this.handDetector.estimateHandBounds(image, config);\n      this.skipped = 0;\n    }\n    if (config.skipFrame) this.skipped++;\n\n    // if detector result count doesn't match current working set, use it to reset current working set\n    if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n      this.detectedHands = 0;\n      this.storedBoxes = [...boxes];\n      // for (const possible of boxes) this.storedBoxes.push(possible);\n      if (this.storedBoxes.length > 0) useFreshBox = true;\n    }\n    const hands: Array<{ landmarks?: number[], confidence: number, box: { topLeft: number[], bottomRight: number[] } }> = [];\n\n    // go through working set of boxes\n    for (let i = 0; i < this.storedBoxes.length; i++) {\n      const currentBox = this.storedBoxes[i];\n      if (!currentBox) continue;\n      if (config.hand.landmarks) {\n        const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n        const palmCenter = box.getBoxCenter(currentBox);\n        const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n        const rotatedImage = config.hand.rotation && tf.ENV.flags.IS_BROWSER ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n        const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n        const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n        const croppedInput = box.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n        const handImage = tf.div(croppedInput, 255);\n        tf.dispose(croppedInput);\n        tf.dispose(rotatedImage);\n        const [confidenceT, keypoints] = await this.handPoseModel.predict(handImage) as Array<Tensor>;\n        tf.dispose(handImage);\n        const confidence = confidenceT.dataSync()[0];\n        tf.dispose(confidenceT);\n        if (confidence >= config.hand.minConfidence) {\n          const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n          const rawCoords = await keypointsReshaped.array();\n          tf.dispose(keypoints);\n          tf.dispose(keypointsReshaped);\n          const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n          const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n          this.storedBoxes[i] = { ...nextBoundingBox, confidence };\n          const result = {\n            landmarks: coords,\n            confidence,\n            box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n          };\n          hands.push(result);\n        } else {\n          this.storedBoxes[i] = null;\n        }\n        tf.dispose(keypoints);\n      } else {\n        // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n        const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);\n        const result = {\n          confidence: currentBox.confidence,\n          box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n        };\n        hands.push(result);\n      }\n    }\n    this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n    this.detectedHands = hands.length;\n    return hands;\n  }\n}\n", "/**\n * HandPose module entry point\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport { Hand } from '../result';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Config } from '../config';\n\nconst meshAnnotations = {\n  thumb: [1, 2, 3, 4],\n  indexFinger: [5, 6, 7, 8],\n  middleFinger: [9, 10, 11, 12],\n  ringFinger: [13, 14, 15, 16],\n  pinky: [17, 18, 19, 20],\n  palmBase: [0],\n};\n\nlet handDetectorModel: GraphModel | null;\nlet handPoseModel: GraphModel | null;\nlet handPipeline: handpipeline.HandPipeline;\n\nexport async function predict(input: Tensor, config: Config): Promise<Hand[]> {\n  const predictions = await handPipeline.estimateHands(input, config);\n  if (!predictions) return [];\n  const hands: Array<Hand> = [];\n  for (let i = 0; i < predictions.length; i++) {\n    const annotations = {};\n    if (predictions[i].landmarks) {\n      for (const key of Object.keys(meshAnnotations)) {\n        // @ts-ignore landmarks are not undefined\n        annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n      }\n    }\n\n    const keypoints = predictions[i].landmarks as unknown as Array<[number, number, number]>;\n\n    let box: [number, number, number, number] = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; // maximums so conditionals work\n    let boxRaw: [number, number, number, number] = [0, 0, 0, 0];\n    if (keypoints && keypoints.length > 0) { // if we have landmarks, calculate box based on landmarks\n      for (const pt of keypoints) {\n        if (pt[0] < box[0]) box[0] = pt[0];\n        if (pt[1] < box[1]) box[1] = pt[1];\n        if (pt[0] > box[2]) box[2] = pt[0];\n        if (pt[1] > box[3]) box[3] = pt[1];\n      }\n      box[2] -= box[0];\n      box[3] -= box[1];\n      boxRaw = [box[0] / (input.shape[2] || 0), box[1] / (input.shape[1] || 0), box[2] / (input.shape[2] || 0), box[3] / (input.shape[1] || 0)];\n    } else { // otherwise use box from prediction\n      box = predictions[i].box ? [\n        Math.trunc(Math.max(0, predictions[i].box.topLeft[0])),\n        Math.trunc(Math.max(0, predictions[i].box.topLeft[1])),\n        Math.trunc(Math.min((input.shape[2] || 0), predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0])),\n        Math.trunc(Math.min((input.shape[1] || 0), predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1])),\n      ] : [0, 0, 0, 0];\n      boxRaw = [\n        (predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n        (predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n        (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / (input.shape[2] || 0),\n        (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / (input.shape[1] || 0),\n      ];\n    }\n    hands.push({ id: i, score: Math.round(100 * predictions[i].confidence) / 100, box, boxRaw, keypoints, annotations });\n  }\n  return hands;\n}\n\nexport async function load(config: Config): Promise<[GraphModel | null, GraphModel | null]> {\n  if (!handDetectorModel || !handPoseModel) {\n    // @ts-ignore type mismatch on GraphModel\n    [handDetectorModel, handPoseModel] = await Promise.all([\n      config.hand.enabled ? tf.loadGraphModel(join(config.modelBasePath, config.hand.detector.modelPath), { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) : null,\n      config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : null,\n    ]);\n    if (config.hand.enabled) {\n      if (!handDetectorModel || !handDetectorModel['modelUrl']) log('load model failed:', config.hand.detector.modelPath);\n      else if (config.debug) log('load model:', handDetectorModel['modelUrl']);\n      if (!handPoseModel || !handPoseModel['modelUrl']) log('load model failed:', config.hand.skeleton.modelPath);\n      else if (config.debug) log('load model:', handPoseModel['modelUrl']);\n    }\n  } else {\n    if (config.debug) log('cached model:', handDetectorModel['modelUrl']);\n    if (config.debug) log('cached model:', handPoseModel['modelUrl']);\n  }\n  const handDetector = new handdetector.HandDetector(handDetectorModel);\n  handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n  return [handDetectorModel, handPoseModel];\n}\n", "export const full = [\n  'nose',\n  'leftEyeInside',\n  'leftEye',\n  'leftEyeOutside',\n  'rightEyeInside',\n  'rightEye',\n  'rightEyeOutside',\n  'leftEar',\n  'rightEar',\n  'leftMouth',\n  'rightMouth',\n  'leftShoulder',\n  'rightShoulder',\n  'leftElbow',\n  'rightElbow',\n  'leftWrist',\n  'rightWrist',\n  'leftPalm',\n  'rightPalm',\n  'leftIndex',\n  'rightIndex',\n  'leftPinky',\n  'rightPinky',\n  'leftHip',\n  'rightHip',\n  'leftKnee',\n  'rightKnee',\n  'leftAnkle',\n  'rightAnkle',\n  'leftHeel',\n  'rightHeel',\n  'leftFoot',\n  'rightFoot',\n  'midHip',\n  'forehead',\n  'leftThumb',\n  'leftHand',\n  'rightThumb',\n  'rightHand',\n];\n\nexport const upper = [\n  'nose',\n  'leftEyeInside',\n  'leftEye',\n  'leftEyeOutside',\n  'rightEyeInside',\n  'rightEye',\n  'rightEyeOutside',\n  'leftEar',\n  'rightEar',\n  'leftMouth',\n  'rightMouth',\n  'leftShoulder',\n  'rightShoulder',\n  'leftElbow',\n  'rightElbow',\n  'left:15',\n  'right:16',\n  'left:17',\n  'right:18',\n  'left:19',\n  'right:20',\n  'left:21',\n  'right:22',\n  'leftChest',\n  'rightChest',\n  'neck',\n  'forehead',\n  'left:27',\n  'right:28',\n  'left:29',\n  'right:30',\n];\n", "/**\n * BlazePose Module\n */\n\n// paper: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as annotations from './annotations';\nimport { Tensor, GraphModel } from '../tfjs/types';\nimport { Body } from '../result';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    // @ts-ignore type mismatch for Graphmodel\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n    model['width'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[2].size);\n    model['height'] = parseInt(model['signature'].inputs['input_1:0'].tensorShape.dim[1].size);\n    if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n    else if (config.debug) log('load model:', model['modelUrl']);\n  } else if (config.debug) log('cached model:', model['modelUrl']);\n  return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise<Body[]> {\n  if (!model) return [];\n  if (!config.body.enabled) return [];\n  const imgSize = { width: (image.shape[2] || 0), height: (image.shape[1] || 0) };\n  const resize = tf.image.resizeBilinear(image, [model['width'], model['height']], false);\n  const normalize = tf.div(resize, [255.0]);\n  tf.dispose(resize);\n  const resT = await model.predict(normalize) as Array<Tensor>;\n  const findT = resT.find((t) => (t.size === 195 || t.size === 155));\n  const points = await findT?.data() || []; // order of output tensors may change between models, full has 195 and upper has 155 items\n  resT.forEach((t) => tf.dispose(t));\n  tf.dispose(normalize);\n  const keypoints: Array<{ id, part, position: [number, number, number], positionRaw: [number, number, number], score, presence }> = [];\n  const labels = points?.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints\n  const depth = 5; // each points has x,y,z,visibility,presence\n  for (let i = 0; i < points.length / depth; i++) {\n    keypoints.push({\n      id: i,\n      part: labels[i],\n      position: [\n        Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n        Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n        Math.trunc(points[depth * i + 2]) + 0, // fix negative zero\n      ],\n      positionRaw: [\n        points[depth * i + 0] / 255, // return x value normalized to 0..1\n        points[depth * i + 1] / 255, // return y value normalized to 0..1\n        points[depth * i + 2] + 0, // fix negative zero\n      ],\n      score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value\n      presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value\n    });\n  }\n  const x = keypoints.map((a) => a.position[0]);\n  const y = keypoints.map((a) => a.position[1]);\n  const box: [number, number, number, number] = [\n    Math.min(...x),\n    Math.min(...y),\n    Math.max(...x) - Math.min(...x),\n    Math.max(...y) - Math.min(...x),\n  ];\n  const boxRaw: [number, number, number, number] = [0, 0, 0, 0]; // not yet implemented\n  const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n  return [{ id: 0, score, box, boxRaw, keypoints }];\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array<Keypoints> = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['head', 'neck', 'rightShoulder', 'rightElbow', 'rightWrist', 'chest', 'leftShoulder', 'leftElbow', 'leftWrist', 'pelvis', 'rightHip', 'rightKnee', 'rightAnkle', 'leftHip', 'leftKnee', 'leftAnkle'];\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    // @ts-ignore type mismatch on GraphModel\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n    if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n    else if (config.debug) log('load model:', model['modelUrl']);\n  } else if (config.debug) log('cached model:', model['modelUrl']);\n  return model;\n}\n\n// performs argmax and max functions on a 2d tensor\nfunction max2d(inputs, minScore) {\n  const [width, height] = inputs.shape;\n  return tf.tidy(() => {\n    // modulus op implemented in tf\n    const mod = (a, b) => tf.sub(a, tf.mul(tf.div(a, tf.scalar(b, 'int32')), tf.scalar(b, 'int32')));\n    // combine all data\n    const reshaped = tf.reshape(inputs, [height * width]);\n    // get highest score\n    const newScore = tf.max(reshaped, 0).dataSync()[0]; // inside tf.tidy\n    if (newScore > minScore) {\n      // skip coordinate calculation is score is too low\n      const coords = tf.argMax(reshaped, 0);\n      const x = mod(coords, width).dataSync()[0]; // inside tf.tidy\n      const y = tf.div(coords, tf.scalar(width, 'int32')).dataSync()[0]; // inside tf.tidy\n      return [x, y, newScore];\n    }\n    return [0, 0, newScore];\n  });\n}\n\nexport async function predict(image: Tensor, config: Config): Promise<Body[]> {\n  if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n    skipped++;\n    return [{ id: 0, score, box, boxRaw, keypoints }];\n  }\n  skipped = 0;\n  return new Promise(async (resolve) => {\n    const tensor = tf.tidy(() => {\n      if (!model.inputs[0].shape) return null;\n      const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n      const enhance = tf.mul(resize, 2);\n      const norm = enhance.sub(1);\n      return norm;\n    });\n\n    let resT;\n    if (config.body.enabled) resT = await model.predict(tensor);\n    tf.dispose(tensor);\n\n    if (resT) {\n      keypoints.length = 0;\n      const squeeze = resT.squeeze();\n      tf.dispose(resT);\n      // body parts are basically just a stack of 2d tensors\n      const stack = squeeze.unstack(2);\n      tf.dispose(squeeze);\n      // process each unstacked tensor as a separate body part\n      for (let id = 0; id < stack.length; id++) {\n        // actual processing to get coordinates and score\n        const [x, y, partScore] = max2d(stack[id], config.body.minConfidence);\n        if (score > config.body.minConfidence) {\n          keypoints.push({\n            score: Math.round(100 * partScore) / 100,\n            part: bodyParts[id],\n            positionRaw: [ // normalized to 0..1\n              // @ts-ignore model is not undefined here\n              x / model.inputs[0].shape[2], y / model.inputs[0].shape[1],\n            ],\n            position: [ // normalized to input image size\n              // @ts-ignore model is not undefined here\n              Math.round(image.shape[2] * x / model.inputs[0].shape[2]), Math.round(image.shape[1] * y / model.inputs[0].shape[1]),\n            ],\n          });\n        }\n      }\n      stack.forEach((s) => tf.dispose(s));\n    }\n    score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n    const x = keypoints.map((a) => a.position[0]);\n    const y = keypoints.map((a) => a.position[1]);\n    box = [\n      Math.min(...x),\n      Math.min(...y),\n      Math.max(...x) - Math.min(...x),\n      Math.max(...y) - Math.min(...y),\n    ];\n    const xRaw = keypoints.map((a) => a.positionRaw[0]);\n    const yRaw = keypoints.map((a) => a.positionRaw[1]);\n    boxRaw = [\n      Math.min(...xRaw),\n      Math.min(...yRaw),\n      Math.max(...xRaw) - Math.min(...xRaw),\n      Math.max(...yRaw) - Math.min(...yRaw),\n    ];\n    resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n  });\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { Body } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model: GraphModel;\n\ntype Keypoints = { score: number, part: string, position: [number, number], positionRaw: [number, number] };\n\nconst keypoints: Array<Keypoints> = [];\nlet box: [number, number, number, number] = [0, 0, 0, 0];\nlet boxRaw: [number, number, number, number] = [0, 0, 0, 0];\nlet score = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst bodyParts = ['nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder', 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist', 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle'];\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    // @ts-ignore type mismatch on GraphModel\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n    if (!model || !model['modelUrl']) log('load model failed:', config.body.modelPath);\n    else if (config.debug) log('load model:', model['modelUrl']);\n  } else if (config.debug) log('cached model:', model['modelUrl']);\n  return model;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise<Body[]> {\n  if ((skipped < config.body.skipFrames) && config.skipFrame && Object.keys(keypoints).length > 0) {\n    skipped++;\n    return [{ id: 0, score, box, boxRaw, keypoints }];\n  }\n  skipped = 0;\n  return new Promise(async (resolve) => {\n    const tensor = tf.tidy(() => {\n      if (!model.inputs[0].shape) return null;\n      const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n      const cast = tf.cast(resize, 'int32');\n      return cast;\n    });\n\n    let resT;\n    if (config.body.enabled) resT = await model.predict(tensor);\n    tf.dispose(tensor);\n\n    if (resT) {\n      keypoints.length = 0;\n      const res = await resT.array();\n      tf.dispose(resT);\n      const kpt = res[0][0];\n      for (let id = 0; id < kpt.length; id++) {\n        score = kpt[id][2];\n        if (score > config.body.minConfidence) {\n          keypoints.push({\n            score: Math.round(100 * score) / 100,\n            part: bodyParts[id],\n            positionRaw: [ // normalized to 0..1\n              kpt[id][1],\n              kpt[id][0],\n            ],\n            position: [ // normalized to input image size\n              Math.round((image.shape[2] || 0) * kpt[id][1]),\n              Math.round((image.shape[1] || 0) * kpt[id][0]),\n            ],\n          });\n        }\n      }\n    }\n    score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n    const x = keypoints.map((a) => a.position[0]);\n    const y = keypoints.map((a) => a.position[1]);\n    box = [\n      Math.min(...x),\n      Math.min(...y),\n      Math.max(...x) - Math.min(...x),\n      Math.max(...y) - Math.min(...y),\n    ];\n    const xRaw = keypoints.map((a) => a.positionRaw[0]);\n    const yRaw = keypoints.map((a) => a.positionRaw[1]);\n    boxRaw = [\n      Math.min(...xRaw),\n      Math.min(...yRaw),\n      Math.max(...xRaw) - Math.min(...xRaw),\n      Math.max(...yRaw) - Math.min(...yRaw),\n    ];\n    resolve([{ id: 0, score, box, boxRaw, keypoints }]);\n  });\n}\n", "/**\n * CoCo Labels used by object detection modules\n */\nexport const labels = [\n  { class: 1, label: 'person' },\n  { class: 2, label: 'bicycle' },\n  { class: 3, label: 'car' },\n  { class: 4, label: 'motorcycle' },\n  { class: 5, label: 'airplane' },\n  { class: 6, label: 'bus' },\n  { class: 7, label: 'train' },\n  { class: 8, label: 'truck' },\n  { class: 9, label: 'boat' },\n  { class: 10, label: 'traffic light' },\n  { class: 11, label: 'fire hydrant' },\n  { class: 12, label: 'stop sign' },\n  { class: 13, label: 'parking meter' },\n  { class: 14, label: 'bench' },\n  { class: 15, label: 'bird' },\n  { class: 16, label: 'cat' },\n  { class: 17, label: 'dog' },\n  { class: 18, label: 'horse' },\n  { class: 19, label: 'sheep' },\n  { class: 20, label: 'cow' },\n  { class: 21, label: 'elephant' },\n  { class: 22, label: 'bear' },\n  { class: 23, label: 'zebra' },\n  { class: 24, label: 'giraffe' },\n  { class: 25, label: 'backpack' },\n  { class: 26, label: 'umbrella' },\n  { class: 27, label: 'handbag' },\n  { class: 28, label: 'tie' },\n  { class: 29, label: 'suitcase' },\n  { class: 30, label: 'frisbee' },\n  { class: 31, label: 'skis' },\n  { class: 32, label: 'snowboard' },\n  { class: 33, label: 'sports ball' },\n  { class: 34, label: 'kite' },\n  { class: 35, label: 'baseball bat' },\n  { class: 36, label: 'baseball glove' },\n  { class: 37, label: 'skateboard' },\n  { class: 38, label: 'surfboard' },\n  { class: 39, label: 'tennis racket' },\n  { class: 40, label: 'bottle' },\n  { class: 41, label: 'wine glass' },\n  { class: 42, label: 'cup' },\n  { class: 43, label: 'fork' },\n  { class: 44, label: 'knife' },\n  { class: 45, label: 'spoon' },\n  { class: 46, label: 'bowl' },\n  { class: 47, label: 'banana' },\n  { class: 48, label: 'apple' },\n  { class: 49, label: 'sandwich' },\n  { class: 50, label: 'orange' },\n  { class: 51, label: 'broccoli' },\n  { class: 52, label: 'carrot' },\n  { class: 53, label: 'hot dog' },\n  { class: 54, label: 'pizza' },\n  { class: 55, label: 'donut' },\n  { class: 56, label: 'cake' },\n  { class: 57, label: 'chair' },\n  { class: 58, label: 'couch' },\n  { class: 59, label: 'potted plant' },\n  { class: 60, label: 'bed' },\n  { class: 61, label: 'dining table' },\n  { class: 62, label: 'toilet' },\n  { class: 63, label: 'tv' },\n  { class: 64, label: 'laptop' },\n  { class: 65, label: 'mouse' },\n  { class: 66, label: 'remote' },\n  { class: 67, label: 'keyboard' },\n  { class: 68, label: 'cell phone' },\n  { class: 69, label: 'microwave' },\n  { class: 70, label: 'oven' },\n  { class: 71, label: 'toaster' },\n  { class: 72, label: 'sink' },\n  { class: 73, label: 'refrigerator' },\n  { class: 74, label: 'book' },\n  { class: 75, label: 'clock' },\n  { class: 76, label: 'vase' },\n  { class: 77, label: 'scissors' },\n  { class: 78, label: 'teddy bear' },\n  { class: 79, label: 'hair drier' },\n  { class: 80, label: 'toothbrush' },\n];\n", "/**\n * NanoDet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Array<Item> = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n    const inputs = Object.values(model.modelSignature['inputs']);\n    model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n    if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n    if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n    else if (config.debug) log('load model:', model.modelUrl);\n  } else if (config.debug) log('cached model:', model.modelUrl);\n  return model;\n}\n\nasync function process(res, inputSize, outputShape, config) {\n  let id = 0;\n  let results: Array<Item> = [];\n  for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n    // find scores, boxes, classes\n    tf.tidy(async () => { // wrap in tidy to automatically deallocate temp tensors\n      const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n      // find boxes and scores output depending on stride\n      const scoresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] === labels.length))?.squeeze();\n      const featuresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] < labels.length))?.squeeze();\n      const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n      const boxIdx = await boxesMax.argMax(2).array(); // what we need is indexes of features with highest scores, not values itself\n      const scores = await scoresT.array(); // optionally use exponential scores or just as-is\n      for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n        for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n          const score = scores[i][j]; // get score for current position\n          if (score > config.object.minConfidence && j !== 61) {\n            const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n            const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n            const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n            const [x, y] = [\n              cx - (scaleBox / strideSize * boxOffset[0]),\n              cy - (scaleBox / strideSize * boxOffset[1]),\n            ];\n            const [w, h] = [\n              cx + (scaleBox / strideSize * boxOffset[2]) - x,\n              cy + (scaleBox / strideSize * boxOffset[3]) - y,\n            ];\n            let boxRaw = [x, y, w, h]; // results normalized to range 0..1\n            boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); // fix out-of-bounds coords\n            const box = [ // results normalized to input image pixels\n              boxRaw[0] * outputShape[0],\n              boxRaw[1] * outputShape[1],\n              boxRaw[2] * outputShape[0],\n              boxRaw[3] * outputShape[1],\n            ];\n            const result = {\n              id: id++,\n              // strideSize,\n              score: Math.round(100 * score) / 100,\n              class: j + 1,\n              label: labels[j].label,\n              // center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n              // centerRaw: [cx, cy],\n              box: (box.map((a) => Math.trunc(a))) as [number, number, number, number],\n              boxRaw: boxRaw as [number, number, number, number],\n            };\n            results.push(result);\n          }\n        }\n      }\n    });\n  }\n  // deallocate tensors\n  res.forEach((t) => tf.dispose(t));\n\n  // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of\n  // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)\n  const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); // switches coordinates from x,y to y,x as expected by tf.nms\n  const nmsScores = results.map((a) => a.score);\n  let nmsIdx: Array<number> = [];\n  if (nmsBoxes && nmsBoxes.length > 0) {\n    const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n    nmsIdx = await nms.data();\n    tf.dispose(nms);\n  }\n\n  // filter & sort results\n  results = results\n    .filter((_val, idx) => nmsIdx.includes(idx))\n    .sort((a, b) => (b.score - a.score));\n\n  return results;\n}\n\nexport async function predict(image: Tensor, config: Config): Promise<Item[]> {\n  if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n    skipped++;\n    return last;\n  }\n  skipped = 0;\n  return new Promise(async (resolve) => {\n    const outputSize = [image.shape[2], image.shape[1]];\n    const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n    const norm = tf.div(resize, 255);\n    const transpose = norm.transpose([0, 3, 1, 2]);\n    tf.dispose(norm);\n    tf.dispose(resize);\n\n    let objectT;\n    if (config.object.enabled) objectT = await model.predict(transpose);\n    tf.dispose(transpose);\n\n    const obj = await process(objectT, model.inputSize, outputSize, config);\n    last = obj;\n    resolve(obj);\n  });\n}\n", "/**\n * CenterNet object detection module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n    const inputs = Object.values(model.modelSignature['inputs']);\n    model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n    if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n    if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n    else if (config.debug) log('load model:', model.modelUrl);\n  } else if (config.debug) log('cached model:', model.modelUrl);\n  return model;\n}\n\nasync function process(res: Tensor, inputSize, outputShape, config: Config) {\n  if (!res) return [];\n  const results: Array<Item> = [];\n  const detections = await res.array();\n  const squeezeT = tf.squeeze(res);\n  tf.dispose(res);\n  const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n  tf.dispose(squeezeT);\n  const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // reorder dims as tf.nms expects y, x\n  const boxesT = tf.squeeze(stackT);\n  const scoresT = tf.squeeze(arr[4]);\n  const classesT = tf.squeeze(arr[5]);\n  arr.forEach((t) => tf.dispose(t));\n  const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n  tf.dispose(boxesT);\n  tf.dispose(scoresT);\n  tf.dispose(classesT);\n  const nms = await nmsT.data();\n  tf.dispose(nmsT);\n  let i = 0;\n  for (const id of nms) {\n    const score = Math.trunc(100 * detections[0][id][4]) / 100;\n    const classVal = detections[0][id][5];\n    const label = labels[classVal].label;\n    const [x, y] = [\n      detections[0][id][0] / inputSize,\n      detections[0][id][1] / inputSize,\n    ];\n    const boxRaw = [\n      x,\n      y,\n      detections[0][id][2] / inputSize - x,\n      detections[0][id][3] / inputSize - y,\n    ] as [number, number, number, number];\n    const box = [\n      Math.trunc(boxRaw[0] * outputShape[0]),\n      Math.trunc(boxRaw[1] * outputShape[1]),\n      Math.trunc(boxRaw[2] * outputShape[0]),\n      Math.trunc(boxRaw[3] * outputShape[1]),\n    ] as [number, number, number, number];\n    results.push({ id: i++, score, class: classVal, label, box, boxRaw });\n  }\n  return results;\n}\n\nexport async function predict(input: Tensor, config: Config): Promise<Item[]> {\n  if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n    skipped++;\n    return last;\n  }\n  skipped = 0;\n  return new Promise(async (resolve) => {\n    const outputSize = [input.shape[2], input.shape[1]];\n    const resize = tf.image.resizeBilinear(input, [model.inputSize, model.inputSize]);\n    const objectT = config.object.enabled ? model.execute(resize, ['tower_0/detections']) : null;\n    tf.dispose(resize);\n\n    const obj = await process(objectT, model.inputSize, outputSize, config);\n    last = obj;\n    resolve(obj);\n  });\n}\n", "/*\nWebGLImageFilter by Dominic Szablewski: <https://github.com/phoboslab/WebGLImageFilter>\n*/\n\nfunction GLProgram(gl, vertexSource, fragmentSource) {\n  const _collect = function (source, prefix, collection) {\n    const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n    source.replace(r, (match, name) => {\n      collection[name] = 0;\n      return match;\n    });\n  };\n\n  const _compile = function (source, type) {\n    const shader = gl.createShader(type);\n    gl.shaderSource(shader, source);\n    gl.compileShader(shader);\n    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Filter: GL compile failed', gl.getShaderInfoLog(shader));\n    return shader;\n  };\n\n  this.uniform = {};\n  this.attribute = {};\n  const _vsh = _compile(vertexSource, gl.VERTEX_SHADER);\n  const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER);\n  this.id = gl.createProgram();\n  gl.attachShader(this.id, _vsh);\n  gl.attachShader(this.id, _fsh);\n  gl.linkProgram(this.id);\n\n  if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) throw new Error('Filter: GL link failed', gl.getProgramInfoLog(this.id));\n\n  gl.useProgram(this.id);\n  // Collect attributes\n  _collect(vertexSource, 'attribute', this.attribute);\n  for (const a in this.attribute) this.attribute[a] = gl.getAttribLocation(this.id, a);\n  // Collect uniforms\n  _collect(vertexSource, 'uniform', this.uniform);\n  _collect(fragmentSource, 'uniform', this.uniform);\n  for (const u in this.uniform) this.uniform[u] = gl.getUniformLocation(this.id, u);\n}\n\n// export const GLImageFilter = function (params) {\nexport function GLImageFilter(params) {\n  if (!params) params = { };\n  let _drawCount = 0;\n  let _sourceTexture = null;\n  let _lastInChain = false;\n  let _currentFramebufferIndex = -1;\n  let _tempFramebuffers = [null, null];\n  let _filterChain = [];\n  let _width = -1;\n  let _height = -1;\n  let _vertexBuffer = null;\n  let _currentProgram = null;\n  const _filter = {};\n  const _canvas = params.canvas || document.createElement('canvas');\n  // key is the shader program source, value is the compiled program\n  const _shaderProgramCache = { };\n  const DRAW = { INTERMEDIATE: 1 };\n  const gl = _canvas.getContext('webgl');\n  if (!gl) throw new Error('Filter: getContext() failed');\n\n  this.addFilter = function (name) {\n    // eslint-disable-next-line prefer-rest-params\n    const args = Array.prototype.slice.call(arguments, 1);\n    const filter = _filter[name];\n    _filterChain.push({ func: filter, args });\n  };\n\n  this.reset = function () {\n    _filterChain = [];\n  };\n\n  const _resize = function (width, height) {\n    // Same width/height? Nothing to do here\n    if (width === _width && height === _height) { return; }\n    _canvas.width = width;\n    _width = width;\n    _canvas.height = height;\n    _height = height;\n    // Create the context if we don't have it yet\n    if (!_vertexBuffer) {\n      // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n      const vertices = new Float32Array([\n        -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0,\n        -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0,\n      ]);\n      // eslint-disable-next-line no-unused-expressions\n      (_vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer));\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n    }\n    gl.viewport(0, 0, _width, _height);\n    // Delete old temp framebuffers\n    _tempFramebuffers = [null, null];\n  };\n\n  const _createFramebufferTexture = function (width, height) {\n    const fbo = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n    const renderbuffer = gl.createRenderbuffer();\n    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    return { fbo, texture };\n  };\n\n  const _getTempFramebuffer = function (index) {\n    _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height);\n    return _tempFramebuffers[index];\n  };\n\n  const _draw = function (flags = null) {\n    let source = null;\n    let target = null;\n    let flipY = false;\n    // Set up the source\n    if (_drawCount === 0) {\n      // First draw call - use the source texture\n      source = _sourceTexture;\n    } else {\n      // All following draw calls use the temp buffer last drawn to\n      source = _getTempFramebuffer(_currentFramebufferIndex)?.texture;\n    }\n    _drawCount++;\n    // Set up the target\n    if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) {\n      // Last filter in our chain - draw directly to the WebGL Canvas. We may\n      // also have to flip the image vertically now\n      target = null;\n      flipY = _drawCount % 2 === 0;\n    } else {\n      // Intermediate draw call - get a temp buffer to draw to\n      _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2;\n      target = _getTempFramebuffer(_currentFramebufferIndex)?.fbo;\n    }\n    // Bind the source and target and draw the two triangles\n    gl.bindTexture(gl.TEXTURE_2D, source);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n    gl.uniform1f(_currentProgram.uniform.flipY, (flipY ? -1 : 1));\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n  };\n\n  this.apply = function (image) {\n    _resize(image.width, image.height);\n    _drawCount = 0;\n    // Create the texture for the input image if we haven't yet\n    if (!_sourceTexture) _sourceTexture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, _sourceTexture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n    // No filters? Just draw\n    if (_filterChain.length === 0) {\n      // const program = _compileShader(SHADER.FRAGMENT_IDENTITY);\n      _draw();\n      return _canvas;\n    }\n    for (let i = 0; i < _filterChain.length; i++) {\n      _lastInChain = (i === _filterChain.length - 1);\n      const f = _filterChain[i];\n      f.func.apply(this, f.args || []);\n    }\n    return _canvas;\n  };\n\n  const _compileShader = function (fragmentSource) {\n    if (_shaderProgramCache[fragmentSource]) {\n      _currentProgram = _shaderProgramCache[fragmentSource];\n      gl.useProgram(_currentProgram.id);\n      return _currentProgram;\n    }\n    // Compile shaders\n    const SHADER = {};\n    SHADER.VERTEX_IDENTITY = [\n      'precision highp float;',\n      'attribute vec2 pos;',\n      'attribute vec2 uv;',\n      'varying vec2 vUv;',\n      'uniform float flipY;',\n      'void main(void) {',\n      'vUv = uv;',\n      'gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);',\n      '}',\n    ].join('\\n');\n    SHADER.FRAGMENT_IDENTITY = [\n      'precision highp float;',\n      'varying vec2 vUv;',\n      'uniform sampler2D texture;',\n      'void main(void) {',\n      'gl_FragColor = texture2D(texture, vUv);',\n      '}',\n    ].join('\\n');\n    _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource);\n    const floatSize = Float32Array.BYTES_PER_ELEMENT;\n    const vertSize = 4 * floatSize;\n    gl.enableVertexAttribArray(_currentProgram.attribute.pos);\n    gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n    gl.enableVertexAttribArray(_currentProgram.attribute.uv);\n    gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n    _shaderProgramCache[fragmentSource] = _currentProgram;\n    return _currentProgram;\n  };\n\n  // -------------------------------------------------------------------------\n  // Color Matrix Filter\n  _filter.colorMatrix = function (matrix) {\n    // Create a Float32 Array and normalize the offset component to 0-1\n    const m = new Float32Array(matrix);\n    m[4] /= 255;\n    m[9] /= 255;\n    m[14] /= 255;\n    m[19] /= 255;\n    // Can we ignore the alpha value? Makes things a bit faster.\n    const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0)\n      ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA\n      : _filter.colorMatrix.SHADER.WITH_ALPHA;\n    const program = _compileShader(shader);\n    gl.uniform1fv(program.uniform.m, m);\n    _draw();\n  };\n  _filter.colorMatrix.SHADER = {};\n  _filter.colorMatrix.SHADER.WITH_ALPHA = [\n    'precision highp float;',\n    'varying vec2 vUv;',\n    'uniform sampler2D texture;',\n    'uniform float m[20];',\n    'void main(void) {',\n    'vec4 c = texture2D(texture, vUv);',\n    'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];',\n    'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];',\n    'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];',\n    'gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];',\n    '}',\n  ].join('\\n');\n  _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [\n    'precision highp float;',\n    'varying vec2 vUv;',\n    'uniform sampler2D texture;',\n    'uniform float m[20];',\n    'void main(void) {',\n    'vec4 c = texture2D(texture, vUv);',\n    'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];',\n    'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];',\n    'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];',\n    'gl_FragColor.a = c.a;',\n    '}',\n  ].join('\\n');\n\n  _filter.brightness = function (brightness) {\n    const b = (brightness || 0) + 1;\n    _filter.colorMatrix([\n      b, 0, 0, 0, 0,\n      0, b, 0, 0, 0,\n      0, 0, b, 0, 0,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.saturation = function (amount) {\n    const x = (amount || 0) * 2 / 3 + 1;\n    const y = ((x - 1) * -0.5);\n    _filter.colorMatrix([\n      x, y, y, 0, 0,\n      y, x, y, 0, 0,\n      y, y, x, 0, 0,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.desaturate = function () {\n    _filter.saturation(-1);\n  };\n\n  _filter.contrast = function (amount) {\n    const v = (amount || 0) + 1;\n    const o = -128 * (v - 1);\n\n    _filter.colorMatrix([\n      v, 0, 0, 0, o,\n      0, v, 0, 0, o,\n      0, 0, v, 0, o,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.negative = function () {\n    _filter.contrast(-2);\n  };\n\n  _filter.hue = function (rotation) {\n    rotation = (rotation || 0) / 180 * Math.PI;\n    const cos = Math.cos(rotation);\n    const sin = Math.sin(rotation);\n    const lumR = 0.213;\n    const lumG = 0.715;\n    const lumB = 0.072;\n\n    _filter.colorMatrix([\n      lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n      lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n      lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.desaturateLuminance = function () {\n    _filter.colorMatrix([\n      0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n      0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n      0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.sepia = function () {\n    _filter.colorMatrix([\n      0.393, 0.7689999, 0.18899999, 0, 0,\n      0.349, 0.6859999, 0.16799999, 0, 0,\n      0.272, 0.5339999, 0.13099999, 0, 0,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.brownie = function () {\n    _filter.colorMatrix([\n      0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n      -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n      0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.vintagePinhole = function () {\n    _filter.colorMatrix([\n      0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n      0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n      0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.kodachrome = function () {\n    _filter.colorMatrix([\n      1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n      -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n      -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.technicolor = function () {\n    _filter.colorMatrix([\n      1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n      -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n      -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.polaroid = function () {\n    _filter.colorMatrix([\n      1.438, -0.062, -0.062, 0, 0,\n      -0.122, 1.378, -0.122, 0, 0,\n      -0.016, -0.016, 1.483, 0, 0,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  _filter.shiftToBGR = function () {\n    _filter.colorMatrix([\n      0, 0, 1, 0, 0,\n      0, 1, 0, 0, 0,\n      1, 0, 0, 0, 0,\n      0, 0, 0, 1, 0,\n    ]);\n  };\n\n  // -------------------------------------------------------------------------\n  // Convolution Filter\n  _filter.convolution = function (matrix) {\n    const m = new Float32Array(matrix);\n    const pixelSizeX = 1 / _width;\n    const pixelSizeY = 1 / _height;\n    const program = _compileShader(_filter.convolution.SHADER);\n    gl.uniform1fv(program.uniform.m, m);\n    gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY);\n    _draw();\n  };\n\n  _filter.convolution.SHADER = [\n    'precision highp float;',\n    'varying vec2 vUv;',\n    'uniform sampler2D texture;',\n    'uniform vec2 px;',\n    'uniform float m[9];',\n    'void main(void) {',\n    'vec4 c11 = texture2D(texture, vUv - px);', // top left\n    'vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));', // top center\n    'vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));', // top right\n    'vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );', // mid left\n    'vec4 c22 = texture2D(texture, vUv);', // mid center\n    'vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );', // mid right\n    'vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );', // bottom left\n    'vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );', // bottom center\n    'vec4 c33 = texture2D(texture, vUv + px );', // bottom right\n    'gl_FragColor = ',\n    'c11 * m[0] + c12 * m[1] + c22 * m[2] +',\n    'c21 * m[3] + c22 * m[4] + c23 * m[5] +',\n    'c31 * m[6] + c32 * m[7] + c33 * m[8];',\n    'gl_FragColor.a = c22.a;',\n    '}',\n  ].join('\\n');\n\n  _filter.detectEdges = function () {\n    _filter.convolution.call(this, [\n      0, 1, 0,\n      1, -4, 1,\n      0, 1, 0,\n    ]);\n  };\n\n  _filter.sobelX = function () {\n    _filter.convolution.call(this, [\n      -1, 0, 1,\n      -2, 0, 2,\n      -1, 0, 1,\n    ]);\n  };\n\n  _filter.sobelY = function () {\n    _filter.convolution.call(this, [\n      -1, -2, -1,\n      0, 0, 0,\n      1, 2, 1,\n    ]);\n  };\n\n  _filter.sharpen = function (amount) {\n    const a = amount || 1;\n    _filter.convolution.call(this, [\n      0, -1 * a, 0,\n      -1 * a, 1 + 4 * a, -1 * a,\n      0, -1 * a, 0,\n    ]);\n  };\n\n  _filter.emboss = function (size) {\n    const s = size || 1;\n    _filter.convolution.call(this, [\n      -2 * s, -1 * s, 0,\n      -1 * s, 1, 1 * s,\n      0, 1 * s, 2 * s,\n    ]);\n  };\n\n  // -------------------------------------------------------------------------\n  // Blur Filter\n  _filter.blur = function (size) {\n    const blurSizeX = (size / 7) / _width;\n    const blurSizeY = (size / 7) / _height;\n    const program = _compileShader(_filter.blur.SHADER);\n    // Vertical\n    gl.uniform2f(program.uniform.px, 0, blurSizeY);\n    _draw(DRAW.INTERMEDIATE);\n    // Horizontal\n    gl.uniform2f(program.uniform.px, blurSizeX, 0);\n    _draw();\n  };\n\n  _filter.blur.SHADER = [\n    'precision highp float;',\n    'varying vec2 vUv;',\n    'uniform sampler2D texture;',\n    'uniform vec2 px;',\n    'void main(void) {',\n    'gl_FragColor = vec4(0.0);',\n    'gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;',\n    'gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;',\n    'gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;',\n    'gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;',\n    'gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;',\n    'gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;',\n    'gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;',\n    'gl_FragColor += texture2D(texture, vUv                             )*0.159576912161;',\n    'gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x,  1.0*px.y))*0.147308056121;',\n    'gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x,  2.0*px.y))*0.115876621105;',\n    'gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x,  3.0*px.y))*0.0776744219933;',\n    'gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x,  4.0*px.y))*0.0443683338718;',\n    'gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x,  5.0*px.y))*0.0215963866053;',\n    'gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x,  6.0*px.y))*0.00895781211794;',\n    'gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x,  7.0*px.y))*0.0044299121055113265;',\n    '}',\n  ].join('\\n');\n\n  // -------------------------------------------------------------------------\n  // Pixelate Filter\n  _filter.pixelate = function (size) {\n    const blurSizeX = (size) / _width;\n    const blurSizeY = (size) / _height;\n    const program = _compileShader(_filter.pixelate.SHADER);\n    // Horizontal\n    gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY);\n    _draw();\n  };\n\n  _filter.pixelate.SHADER = [\n    'precision highp float;',\n    'varying vec2 vUv;',\n    'uniform vec2 size;',\n    'uniform sampler2D texture;',\n    'vec2 pixelate(vec2 coord, vec2 size) {',\n    'return floor( coord / size ) * size;',\n    '}',\n    'void main(void) {',\n    'gl_FragColor = vec4(0.0);',\n    'vec2 coord = pixelate(vUv, size);',\n    'gl_FragColor += texture2D(texture, coord);',\n    '}',\n  ].join('\\n');\n}\n", "/**\n * Image Processing module used by Human\n */\n\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\nimport { Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\ntype Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx;\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport function process(input: Input, config: Config): { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement } {\n  let tensor;\n  if (!input) throw new Error('Human: Input is missing');\n  // sanity checks since different browsers do not implement all dom elements\n  if (\n    !(input instanceof tf.Tensor)\n    && !(typeof Image !== 'undefined' && input instanceof Image)\n    && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n    && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n    && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n    && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n    && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n    && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n    && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n  ) {\n    throw new Error('Human: Input type is not recognized');\n  }\n  if (input instanceof tf.Tensor) {\n    // if input is tensor, use as-is\n    if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) tensor = tf.clone(input);\n    else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`);\n  } else {\n    // check if resizing will be needed\n    const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n    const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n    if (!originalWidth || !originalHeight) return { tensor: null, canvas: inCanvas }; // video may become temporarily unavailable due to onresize\n    let targetWidth = originalWidth;\n    let targetHeight = originalHeight;\n    if (targetWidth > maxSize) {\n      targetWidth = maxSize;\n      targetHeight = targetWidth * originalHeight / originalWidth;\n    }\n    if (targetHeight > maxSize) {\n      targetHeight = maxSize;\n      targetWidth = targetHeight * originalWidth / originalHeight;\n    }\n\n    // create our canvas and resize it if needed\n    if (config.filter.width > 0) targetWidth = config.filter.width;\n    else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight);\n    if (config.filter.height > 0) targetHeight = config.filter.height;\n    else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth);\n    if (!targetWidth || !targetHeight) throw new Error('Human: Input cannot determine dimension');\n    if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) {\n      inCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n      if (inCanvas?.width !== targetWidth) inCanvas.width = targetWidth;\n      if (inCanvas?.height !== targetHeight) inCanvas.height = targetHeight;\n    }\n\n    // draw input to our canvas\n    const ctx = inCanvas.getContext('2d');\n    if (input instanceof ImageData) {\n      ctx.putImageData(input, 0, 0);\n    } else {\n      if (config.filter.flip && typeof ctx.translate !== 'undefined') {\n        ctx.translate(originalWidth, 0);\n        ctx.scale(-1, 1);\n        ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n        ctx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n      } else {\n        ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n      }\n    }\n\n    // imagefx transforms using gl\n    if (config.filter.enabled) {\n      if (!fx || !outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) {\n        outCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(inCanvas?.width, inCanvas?.height) : document.createElement('canvas');\n        if (outCanvas?.width !== inCanvas?.width) outCanvas.width = inCanvas?.width;\n        if (outCanvas?.height !== inCanvas?.height) outCanvas.height = inCanvas?.height;\n        // log('created FX filter');\n        fx = tf.ENV.flags.IS_BROWSER ? new fxImage.GLImageFilter({ canvas: outCanvas }) : null; // && (typeof document !== 'undefined')\n      }\n      if (!fx) return { tensor: null, canvas: inCanvas };\n      fx.reset();\n      fx.addFilter('brightness', config.filter.brightness); // must have at least one filter enabled\n      if (config.filter.contrast !== 0) fx.addFilter('contrast', config.filter.contrast);\n      if (config.filter.sharpness !== 0) fx.addFilter('sharpen', config.filter.sharpness);\n      if (config.filter.blur !== 0) fx.addFilter('blur', config.filter.blur);\n      if (config.filter.saturation !== 0) fx.addFilter('saturation', config.filter.saturation);\n      if (config.filter.hue !== 0) fx.addFilter('hue', config.filter.hue);\n      if (config.filter.negative) fx.addFilter('negative');\n      if (config.filter.sepia) fx.addFilter('sepia');\n      if (config.filter.vintage) fx.addFilter('brownie');\n      if (config.filter.sepia) fx.addFilter('sepia');\n      if (config.filter.kodachrome) fx.addFilter('kodachrome');\n      if (config.filter.technicolor) fx.addFilter('technicolor');\n      if (config.filter.polaroid) fx.addFilter('polaroid');\n      if (config.filter.pixelate !== 0) fx.addFilter('pixelate', config.filter.pixelate);\n      fx.apply(inCanvas);\n      // read pixel data\n      /*\n      const gl = outCanvas.getContext('webgl');\n      if (gl) {\n        const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4);\n        const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3);\n        gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer);\n        // gl returns rbga while we only need rgb, so discarding alpha channel\n        // gl returns starting point as lower left, so need to invert vertical\n        let i = 0;\n        for (let y = outCanvas.height - 1; y >= 0; y--) {\n          for (let x = 0; x < outCanvas.width; x++) {\n            const index = (x + y * outCanvas.width) * 4;\n            pixBuffer[i++] = glBuffer[index + 0];\n            pixBuffer[i++] = glBuffer[index + 1];\n            pixBuffer[i++] = glBuffer[index + 2];\n          }\n        }\n        outCanvas.data = pixBuffer;\n        const shape = [outCanvas.height, outCanvas.width, 3];\n        const pixels = tf.tensor3d(outCanvas.data, shape, 'float32');\n        tensor = tf.expandDims(pixels, 0);\n        tf.dispose(pixels);\n      }\n      */\n    } else {\n      outCanvas = inCanvas;\n      if (fx) fx = null;\n    }\n\n    // create tensor from image if tensor is not already defined\n    if (!tensor) {\n      let pixels;\n      if (outCanvas.data) { // if we have data, just convert to tensor\n        const shape = [outCanvas.height, outCanvas.width, 3];\n        pixels = tf.tensor3d(outCanvas.data, shape, 'int32');\n      } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it\n        pixels = tf.browser ? tf.browser.fromPixels(outCanvas) : null;\n      } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n        // we cant use canvas as-is as it already has a context, so we do a silly one more canvas\n        const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n        tempCanvas.width = targetWidth;\n        tempCanvas.height = targetHeight;\n        const tempCtx = tempCanvas.getContext('2d');\n        tempCtx?.drawImage(outCanvas, 0, 0);\n        pixels = tf.browser ? tf.browser.fromPixels(tempCanvas) : null;\n      } else { // cpu and wasm kernel does not implement efficient fromPixels method\n        // we cant use canvas as-is as it already has a context, so we do a silly one more canvas and do fromPixels on ImageData instead\n        const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n        tempCanvas.width = targetWidth;\n        tempCanvas.height = targetHeight;\n        const tempCtx = tempCanvas.getContext('2d');\n        tempCtx?.drawImage(outCanvas, 0, 0);\n        const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n        pixels = tf.browser ? tf.browser.fromPixels(data) : null;\n      }\n      if (pixels) {\n        const casted = tf.cast(pixels, 'float32');\n        tensor = tf.expandDims(casted, 0);\n        tf.dispose(pixels);\n        tf.dispose(casted);\n      }\n    }\n  }\n  const canvas = config.filter.return ? outCanvas : null;\n  return { tensor, canvas };\n}\n", "/**\n * EfficientPose Module\n */\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as image from '../image/image';\nimport { GraphModel, Tensor } from '../tfjs/types';\nimport { Config } from '../config';\n\ntype Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\nlet model: GraphModel;\nlet busy = false;\n\nexport async function load(config: Config): Promise<GraphModel> {\n  if (!model) {\n    // @ts-ignore type mismatch on GraphModel\n    model = await tf.loadGraphModel(join(config.modelBasePath, config.segmentation.modelPath));\n    if (!model || !model['modelUrl']) log('load model failed:', config.segmentation.modelPath);\n    else if (config.debug) log('load model:', model['modelUrl']);\n  } else if (config.debug) log('cached model:', model['modelUrl']);\n  return model;\n}\n\nexport async function predict(input: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement }): Promise<Uint8ClampedArray | null> {\n  const width = input.tensor?.shape[1] || 0;\n  const height = input.tensor?.shape[2] || 0;\n  if (!input.tensor) return null;\n  if (!model || !model.inputs[0].shape) return null;\n  const resizeInput = tf.image.resizeBilinear(input.tensor, [model.inputs[0].shape[1], model.inputs[0].shape[2]], false);\n  const norm = tf.div(resizeInput, 255);\n  const res = model.predict(norm) as Tensor;\n  // meet output:   1,256,256,1\n  // selfie output: 1,144,256,2\n  tf.dispose(resizeInput);\n  tf.dispose(norm);\n\n  const squeeze = tf.squeeze(res, 0);\n  let resizeOutput;\n  if (squeeze.shape[2] === 2) {\n    // model meet has two channels for fg and bg\n    const softmax = squeeze.softmax();\n    const [bg, fg] = tf.unstack(softmax, 2);\n    const expand = tf.expandDims(fg, 2);\n    const pad = tf.expandDims(expand, 0);\n    tf.dispose(softmax);\n    tf.dispose(bg);\n    tf.dispose(fg);\n    // running sofmax before unstack creates 2x2 matrix so we only take upper-left quadrant\n    const crop = tf.image.cropAndResize(pad, [[0, 0, 0.5, 0.5]], [0], [width, height]);\n    // otherwise run softmax after unstack and use standard resize\n    // resizeOutput = tf.image.resizeBilinear(expand, [input.tensor?.shape[1], input.tensor?.shape[2]]);\n    resizeOutput = tf.squeeze(crop, 0);\n    tf.dispose(crop);\n    tf.dispose(expand);\n    tf.dispose(pad);\n  } else { // model selfie has a single channel that we can use directly\n    resizeOutput = tf.image.resizeBilinear(squeeze, [width, height]);\n  }\n\n  if (typeof document === 'undefined') return resizeOutput.data(); // we're running in nodejs so return alpha array as-is\n\n  const overlay = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas');\n  overlay.width = width;\n  overlay.height = height;\n  if (tf.browser) await tf.browser.toPixels(resizeOutput, overlay);\n  tf.dispose(resizeOutput);\n  tf.dispose(squeeze);\n  tf.dispose(res);\n\n  // get alpha channel data\n  const alphaCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas'); // need one more copy since input may already have gl context so 2d context fails\n  alphaCanvas.width = width;\n  alphaCanvas.height = height;\n  const ctxAlpha = alphaCanvas.getContext('2d') as CanvasRenderingContext2D;\n  ctxAlpha.filter = 'blur(8px';\n  await ctxAlpha.drawImage(overlay, 0, 0);\n  const alpha = ctxAlpha.getImageData(0, 0, width, height).data;\n\n  // get original canvas merged with overlay\n  const original = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(width, height) : document.createElement('canvas'); // need one more copy since input may already have gl context so 2d context fails\n  original.width = width;\n  original.height = height;\n  const ctx = original.getContext('2d') as CanvasRenderingContext2D;\n  if (input.canvas) await ctx.drawImage(input.canvas, 0, 0);\n  // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation // best options are: darken, color-burn, multiply\n  ctx.globalCompositeOperation = 'darken';\n  ctx.filter = 'blur(8px)'; // use css filter for bluring, can be done with gaussian blur manually instead\n  await ctx.drawImage(overlay, 0, 0);\n  ctx.globalCompositeOperation = 'source-over'; // reset\n  ctx.filter = 'none'; // reset\n\n  input.canvas = original;\n\n  return alpha;\n}\n\nexport async function process(input: Input, background: Input | undefined, config: Config): Promise<HTMLCanvasElement | OffscreenCanvas | null> {\n  if (busy) return null;\n  busy = true;\n  if (!model) await load(config);\n  const img = image.process(input, config);\n  const alpha = await predict(img);\n  tf.dispose(img.tensor);\n\n  if (background && alpha) {\n    const tmp = image.process(background, config);\n    const bg = tmp.canvas;\n    tf.dispose(tmp.tensor);\n    const fg = img.canvas;\n    const fgData = fg.getContext('2d')?.getImageData(0, 0, fg.width, fg.height).data as Uint8ClampedArray;\n\n    const c = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(fg.width, fg.height) : document.createElement('canvas');\n    c.width = fg.width;\n    c.height = fg.height;\n    const ctx = c.getContext('2d') as CanvasRenderingContext2D;\n\n    ctx.globalCompositeOperation = 'copy'; // reset\n    ctx.drawImage(bg, 0, 0, c.width, c.height);\n    const cData = ctx.getImageData(0, 0, c.width, c.height) as ImageData;\n    for (let i = 0; i < c.width * c.height; i++) { // this should be done with globalCompositeOperation instead of looping through image data\n      cData.data[4 * i + 0] = ((255 - alpha[4 * i + 0]) / 255.0 * cData.data[4 * i + 0]) + (alpha[4 * i + 0] / 255.0 * fgData[4 * i + 0]);\n      cData.data[4 * i + 1] = ((255 - alpha[4 * i + 1]) / 255.0 * cData.data[4 * i + 1]) + (alpha[4 * i + 1] / 255.0 * fgData[4 * i + 1]);\n      cData.data[4 * i + 2] = ((255 - alpha[4 * i + 2]) / 255.0 * cData.data[4 * i + 2]) + (alpha[4 * i + 2] / 255.0 * fgData[4 * i + 2]);\n      cData.data[4 * i + 3] = ((255 - alpha[4 * i + 3]) / 255.0 * cData.data[4 * i + 3]) + (alpha[4 * i + 3] / 255.0 * fgData[4 * i + 3]);\n    }\n    ctx.putImageData(cData, 0, 0);\n    img.canvas = c;\n  }\n  busy = false;\n  return img.canvas;\n}\n", "import * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as emotion from './emotion/emotion';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as segmentation from './segmentation/segmentation';\n// import * as agegenderrace from './gear/agegenderrace';\n\n/** Load method preloads all instance.configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n * @param userinstance.config?: {@link instance.config}\n*/\nexport async function load(instance) {\n  if (instance.config.async) { // load models concurrently\n    [\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.face,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.emotion,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.handpose,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.posenet,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.blazepose,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.efficientpose,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.movenet,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.nanodet,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.centernet,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.faceres,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      instance.models.segmentation,\n      // @ts-ignore models loaded via promise array cannot be correctly inferred\n      // instance.models.agegenderrace,\n    ] = await Promise.all([\n      instance.models.face || (instance.config.face.enabled ? facemesh.load(instance.config) : null),\n      instance.models.emotion || ((instance.config.face.enabled && instance.config.face.emotion.enabled) ? emotion.load(instance.config) : null),\n      instance.models.handpose || (instance.config.hand.enabled ? handpose.load(instance.config) : null),\n      instance.models.posenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('posenet') ? posenet.load(instance.config) : null),\n      instance.models.blazepose || (instance.config.body.enabled && instance.config.body.modelPath.includes('blazepose') ? blazepose.load(instance.config) : null),\n      instance.models.efficientpose || (instance.config.body.enabled && instance.config.body.modelPath.includes('efficientpose') ? efficientpose.load(instance.config) : null),\n      instance.models.movenet || (instance.config.body.enabled && instance.config.body.modelPath.includes('movenet') ? movenet.load(instance.config) : null),\n      instance.models.nanodet || (instance.config.object.enabled && instance.config.object.modelPath.includes('nanodet') ? nanodet.load(instance.config) : null),\n      instance.models.centernet || (instance.config.object.enabled && instance.config.object.modelPath.includes('centernet') ? centernet.load(instance.config) : null),\n      instance.models.faceres || ((instance.config.face.enabled && instance.config.face.description.enabled) ? faceres.load(instance.config) : null),\n      instance.models.segmentation || (instance.config.segmentation.enabled ? segmentation.load(instance.config) : null),\n      // instance.models.agegenderrace || ((instance.config.face.enabled && instance.config.face.agegenderrace.enabled) ? agegenderrace.load(instance.config) : null),\n    ]);\n  } else { // load models sequentially\n    if (instance.config.face.enabled && !instance.models.face) instance.models.face = await facemesh.load(instance.config);\n    if (instance.config.face.enabled && instance.config.face.emotion.enabled && !instance.models.emotion) instance.models.emotion = await emotion.load(instance.config);\n    if (instance.config.hand.enabled && !instance.models.handpose) instance.models.handpose = await handpose.load(instance.config);\n    if (instance.config.body.enabled && !instance.models.posenet && instance.config.body.modelPath.includes('posenet')) instance.models.posenet = await posenet.load(instance.config);\n    if (instance.config.body.enabled && !instance.models.blazepose && instance.config.body.modelPath.includes('blazepose')) instance.models.blazepose = await blazepose.load(instance.config);\n    if (instance.config.body.enabled && !instance.models.efficientpose && instance.config.body.modelPath.includes('efficientpose')) instance.models.efficientpose = await blazepose.load(instance.config);\n    if (instance.config.body.enabled && !instance.models.movenet && instance.config.body.modelPath.includes('movenet')) instance.models.movenet = await movenet.load(instance.config);\n    if (instance.config.object.enabled && !instance.models.nanodet && instance.config.object.modelPath.includes('nanodet')) instance.models.nanodet = await nanodet.load(instance.config);\n    if (instance.config.object.enabled && !instance.models.centernet && instance.config.object.modelPath.includes('centernet')) instance.models.centernet = await centernet.load(instance.config);\n    if (instance.config.face.enabled && instance.config.face.description.enabled && !instance.models.faceres) instance.models.faceres = await faceres.load(instance.config);\n    if (instance.config.segmentation.enabled && !instance.models.segmentation) instance.models.segmentation = await segmentation.load(instance.config);\n    // if (instance.config.face.enabled && instance.config.face.agegenderrace.enabled && !instance.models.agegenderrace) instance.models.agegenderrace = await agegenderrace.load(instance.config);\n  }\n}\n", "/**\n * Module that analyzes person age\n * Obsolete\n */\n\nimport { log, now } from './helpers';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\nimport { Tensor } from './tfjs/types';\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nconst calculateGaze = (face): { bearing: number, strength: number } => {\n  const radians = (pt1, pt2) => Math.atan2(pt1[1] - pt2[1], pt1[0] - pt2[0]); // function to calculate angle between any two points\n  if (!face.annotations['rightEyeIris'] || !face.annotations['leftEyeIris']) return { bearing: 0, strength: 0 };\n\n  const offsetIris = [0, -0.1]; // iris center may not align with average of eye extremes\n  const eyeRatio = 1; // factor to normalize changes x vs y\n\n  const left = face.mesh[33][2] > face.mesh[263][2]; // pick left or right eye depending which one is closer bazed on outsize point z axis\n  const irisCenter = left ? face.mesh[473] : face.mesh[468];\n  const eyeCenter = left // eye center is average of extreme points on x axis for both x and y, ignoring y extreme points as eyelids naturally open/close more when gazing up/down so relative point is less precise\n    ? [(face.mesh[133][0] + face.mesh[33][0]) / 2, (face.mesh[133][1] + face.mesh[33][1]) / 2]\n    : [(face.mesh[263][0] + face.mesh[362][0]) / 2, (face.mesh[263][1] + face.mesh[362][1]) / 2];\n  const eyeSize = left // eye size is difference between extreme points for both x and y, used to normalize & squarify eye dimensions\n    ? [face.mesh[133][0] - face.mesh[33][0], face.mesh[23][1] - face.mesh[27][1]]\n    : [face.mesh[263][0] - face.mesh[362][0], face.mesh[253][1] - face.mesh[257][1]];\n\n  const eyeDiff = [ // x distance between extreme point and center point normalized with eye size\n    (eyeCenter[0] - irisCenter[0]) / eyeSize[0] - offsetIris[0],\n    eyeRatio * (irisCenter[1] - eyeCenter[1]) / eyeSize[1] - offsetIris[1],\n  ];\n  let strength = Math.sqrt((eyeDiff[0] ** 2) + (eyeDiff[1] ** 2)); // vector length is a diagonal between two differences\n  strength = Math.min(strength, face.boxRaw[2] / 2, face.boxRaw[3] / 2); // limit strength to half of box size to avoid clipping due to low precision\n  const bearing = (radians([0, 0], eyeDiff) + (Math.PI / 2)) % Math.PI; // using eyeDiff instead eyeCenter/irisCenter combo due to manual adjustments and rotate clockwise 90degrees\n\n  return { bearing, strength };\n};\n\nconst calculateFaceAngle = (face, imageSize): {\n  angle: { pitch: number, yaw: number, roll: number },\n  matrix: [number, number, number, number, number, number, number, number, number],\n  gaze: { bearing: number, strength: number },\n} => {\n  // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n  const normalize = (v) => { // normalize vector\n    const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n    v[0] /= length;\n    v[1] /= length;\n    v[2] /= length;\n    return v;\n  };\n  const subVectors = (a, b) => { // vector subtraction (a - b)\n    const x = a[0] - b[0];\n    const y = a[1] - b[1];\n    const z = a[2] - b[2];\n    return [x, y, z];\n  };\n  const crossVectors = (a, b) => { // vector cross product (a x b)\n    const x = a[1] * b[2] - a[2] * b[1];\n    const y = a[2] * b[0] - a[0] * b[2];\n    const z = a[0] * b[1] - a[1] * b[0];\n    return [x, y, z];\n  };\n  // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n  const rotationMatrixToEulerAngle = (r) => {\n    // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n    const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r;\n    let thetaX; let thetaY; let thetaZ;\n    if (r10 < 1) { // YZX calculation\n      if (r10 > -1) {\n        thetaZ = Math.asin(r10);\n        thetaY = Math.atan2(-r20, r00);\n        thetaX = Math.atan2(-r12, r11);\n      } else {\n        thetaZ = -Math.PI / 2;\n        thetaY = -Math.atan2(r21, r22);\n        thetaX = 0;\n      }\n    } else {\n      thetaZ = Math.PI / 2;\n      thetaY = Math.atan2(r21, r22);\n      thetaX = 0;\n    }\n    return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n  };\n  // simple Euler angle calculation based existing 3D mesh\n  // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n  const meshToEulerAngle = (mesh) => {\n    const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n    // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n    const angle = {\n      // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n      // pitch is face move up/down\n      pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face\n      // yaw is face turn left/right\n      yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye\n      // roll is face lean left/right\n      roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye\n    };\n    return angle;\n  };\n\n  // initialize gaze and mesh\n  const mesh = face.meshRaw;\n  if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1], gaze: { bearing: 0, strength: 0 } };\n\n  const size = Math.max(face.boxRaw[2] * imageSize[0], face.boxRaw[3] * imageSize[1]) / 1.5;\n  // top, bottom, left, right\n  const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [\n    // make the xyz coordinates proportional, independent of the image/box size\n    pt[0] * imageSize[0] / size,\n    pt[1] * imageSize[1] / size,\n    pt[2],\n  ]);\n\n  const y_axis = normalize(subVectors(pts[1], pts[0]));\n  let x_axis = normalize(subVectors(pts[3], pts[2]));\n  const z_axis = normalize(crossVectors(x_axis, y_axis));\n  // adjust x_axis to make sure that all axes are perpendicular to each other\n  x_axis = crossVectors(y_axis, z_axis);\n\n  // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n  // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n  const matrix: [number, number, number, number, number, number, number, number, number] = [\n    x_axis[0], x_axis[1], x_axis[2],\n    y_axis[0], y_axis[1], y_axis[2],\n    z_axis[0], z_axis[1], z_axis[2],\n  ];\n  const angle = rotationMatrixToEulerAngle(matrix);\n  // const angle = meshToEulerAngle(mesh);\n\n  // we have iris keypoints so we can calculate gaze direction\n  const gaze = mesh.length === 478 ? calculateGaze(face) : { bearing: 0, strength: 0 };\n\n  return { angle, matrix, gaze };\n};\n\nexport const detectFace = async (parent /* instance of human */, input: Tensor): Promise<Face[]> => {\n  // run facemesh, includes blazeface and iris\n  // eslint-disable-next-line no-async-promise-executor\n  let timeStamp;\n  let ageRes;\n  let gearRes;\n  let genderRes;\n  let emotionRes;\n  let embeddingRes;\n  let descRes;\n  const faceRes: Array<Face> = [];\n  parent.state = 'run:face';\n  timeStamp = now();\n  const faces = await facemesh.predict(input, parent.config);\n  parent.performance.face = Math.trunc(now() - timeStamp);\n  if (!input.shape || input.shape.length !== 4) return [];\n  if (!faces) return [];\n  // for (const face of faces) {\n  for (let i = 0; i < faces.length; i++) {\n    parent.analyze('Get Face');\n\n    // is something went wrong, skip the face\n    // @ts-ignore possibly undefined\n    if (!faces[i].tensor || faces[i].tensor['isDisposedInternal']) {\n      log('Face object is disposed:', faces[i].tensor);\n      continue;\n    }\n\n    const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);\n\n    // run emotion, inherits face from blazeface\n    parent.analyze('Start Emotion:');\n    if (parent.config.async) {\n      emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n    } else {\n      parent.state = 'run:emotion';\n      timeStamp = now();\n      emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n      parent.performance.emotion = Math.trunc(now() - timeStamp);\n    }\n    parent.analyze('End Emotion:');\n\n    // run gear, inherits face from blazeface\n    /*\n    parent.analyze('Start GEAR:');\n    if (parent.config.async) {\n      gearRes = parent.config.face.agegenderrace.enabled ? agegenderrace.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n    } else {\n      parent.state = 'run:gear';\n      timeStamp = now();\n      gearRes = parent.config.face.agegenderrace.enabled ? await agegenderrace.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : {};\n      parent.performance.emotion = Math.trunc(now() - timeStamp);\n    }\n    parent.analyze('End GEAR:');\n    */\n\n    // run emotion, inherits face from blazeface\n    parent.analyze('Start Description:');\n    if (parent.config.async) {\n      descRes = parent.config.face.description.enabled ? faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];\n    } else {\n      parent.state = 'run:description';\n      timeStamp = now();\n      descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].tensor || tf.tensor([]), parent.config, i, faces.length) : [];\n      parent.performance.embedding = Math.trunc(now() - timeStamp);\n    }\n    parent.analyze('End Description:');\n\n    // if async wait for results\n    if (parent.config.async) {\n      [ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes, gearRes]);\n    }\n\n    parent.analyze('Finish Face:');\n\n    // calculate iris distance\n    // iris: array[ center, left, top, right, bottom]\n    if (!parent.config.face.iris.enabled && faces[i]?.annotations?.leftEyeIris && faces[i]?.annotations?.rightEyeIris) {\n      delete faces[i].annotations.leftEyeIris;\n      delete faces[i].annotations.rightEyeIris;\n    }\n    const irisSize = (faces[i].annotations?.leftEyeIris && faces[i].annotations?.rightEyeIris)\n    /* note: average human iris size is 11.7mm */\n      ? Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) / input.shape[2]\n      : 0;\n\n    // optionally return tensor\n    const tensor = parent.config.face.detector.return ? tf.squeeze(faces[i].tensor) : null;\n    // dispose original face tensor\n    tf.dispose(faces[i].tensor);\n    // delete temp face image\n    if (faces[i].tensor) delete faces[i].tensor;\n    // combine results\n    faceRes.push({\n      ...faces[i],\n      id: i,\n      age: descRes.age,\n      gender: descRes.gender,\n      genderScore: descRes.genderScore,\n      embedding: descRes.descriptor,\n      emotion: emotionRes,\n      iris: irisSize !== 0 ? Math.trunc(500 / irisSize / 11.7) / 100 : 0,\n      rotation,\n      tensor,\n    });\n\n    parent.analyze('End Face');\n  }\n  parent.analyze('End FaceMesh:');\n  if (parent.config.async) {\n    if (parent.performance.face) delete parent.performance.face;\n    if (parent.performance.age) delete parent.performance.age;\n    if (parent.performance.gender) delete parent.performance.gender;\n    if (parent.performance.emotion) delete parent.performance.emotion;\n  }\n  return faceRes;\n};\n", "/**\n * Gesture detection module\n */\n\nimport { Gesture } from '../result';\n\n/**\n * @typedef FaceGesture\n */\nexport type FaceGesture =\n  `facing ${'left' | 'center' | 'right'}`\n  | `blink ${'left' | 'right'} eye`\n  | `mouth ${number}% open`\n  | `head ${'up' | 'down'}`;\n\n/**\n * @typedef IrisGesture\n */\nexport type IrisGesture =\n  'facing center'\n  | `looking ${'left' | 'right' | 'up' | 'down'}`\n  | 'looking center';\n\n/**\n * @typedef BodyGesture\n */\nexport type BodyGesture =\n  `leaning ${'left' | 'right'}`\n  | `raise ${'left' | 'right'} hand`\n  | 'i give up';\n\n/**\n * @typedef BodyGesture\n */\nexport type HandGesture =\n  `${'thumb' | 'index finger' | 'middle finger' | 'ring finger' | 'pinky'} forward`\n  | `${'thumb' | 'index finger' | 'middle finger' | 'ring finger' | 'pinky'} up`;\n\nexport const body = (res): Gesture[] => {\n  if (!res) return [];\n  const gestures: Array<{ body: number, gesture: BodyGesture }> = [];\n  for (let i = 0; i < res.length; i++) {\n    // raising hands\n    const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n    const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n    const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n    if (nose && leftWrist && rightWrist && (leftWrist.position.y < nose.position.y) && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'i give up' });\n    else if (nose && leftWrist && (leftWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise left hand' });\n    else if (nose && rightWrist && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise right hand' });\n\n    // leaning\n    const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n    const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n    if (leftShoulder && rightShoulder) gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position.y > rightShoulder.position.y) ? 'left' : 'right'}` });\n  }\n  return gestures;\n};\n\nexport const face = (res): Gesture[] => {\n  if (!res) return [];\n  const gestures: Array<{ face: number, gesture: FaceGesture }> = [];\n  for (let i = 0; i < res.length; i++) {\n    if (res[i].mesh && res[i].mesh.length > 0) {\n      const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2];\n      if (Math.abs(eyeFacing) < 10) gestures.push({ face: i, gesture: 'facing center' });\n      else gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? 'left' : 'right'}` });\n      const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n      if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n      const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n      if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n      const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n      if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n      const chinDepth = res[i].mesh[152][2];\n      if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n    }\n  }\n  return gestures;\n};\n\nexport const iris = (res): Gesture[] => {\n  if (!res) return [];\n  const gestures: Array<{ iris: number, gesture: IrisGesture }> = [];\n  for (let i = 0; i < res.length; i++) {\n    if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) continue;\n    const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n    const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n    const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n    const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n    const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n    const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n    let center = false;\n    const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n    if (difference < 0.25) {\n      center = true;\n      gestures.push({ iris: i, gesture: 'facing center' });\n    }\n\n    const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].box[2];\n    const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].box[2];\n    if (leftIrisCenterX > 0.06 || rightIrisCenterX > 0.06) center = false;\n    if (leftIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking right' });\n    if (rightIrisCenterX > 0.06) gestures.push({ iris: i, gesture: 'looking left' });\n\n    const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].box[3];\n    const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].box[3];\n    if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01 || leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) center = false;\n    if (leftIrisCenterY < 0.01 || rightIrisCenterY < 0.01) gestures.push({ iris: i, gesture: 'looking down' });\n    if (leftIrisCenterY > 0.022 || rightIrisCenterY > 0.022) gestures.push({ iris: i, gesture: 'looking up' });\n\n    // still center;\n    if (center) gestures.push({ iris: i, gesture: 'looking center' });\n  }\n  return gestures;\n};\n\nexport const hand = (res): Gesture[] => {\n  if (!res) return [];\n  const gestures: Array<{ hand: number, gesture: HandGesture }> = [];\n  for (let i = 0; i < res.length; i++) {\n    const fingers: Array<{ name: string, position: number }> = [];\n    for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n      if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n    }\n    if (fingers && fingers.length > 0) {\n      const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));\n      gestures.push({ hand: i, gesture: `${closest.name} forward` as HandGesture });\n      const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n      gestures.push({ hand: i, gesture: `${highest.name} up` as HandGesture });\n    }\n  }\n  return gestures;\n};\n", "/**\n * Module that implements helper draw functions, exposed as human.draw\n */\n\nimport { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep, now } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from '../result';\n\n/**\n * Draw Options\n * Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n * -color: draw color\n * -labelColor: color for labels\n * -shadowColor: optional shadow color for labels\n * -font: font for labels\n * -lineHeight: line height for labels, used for multi-line labels,\n * -lineWidth: width of any lines,\n * -pointSize: size of any point,\n * -roundRect: for boxes, round corners by this many pixels,\n * -drawPoints: should points be drawn,\n * -drawLabels: should labels be drawn,\n * -drawBoxes: should boxes be drawn,\n * -drawPolygons: should polygons be drawn,\n * -fillPolygons: should drawn polygons be filled,\n * -useDepth: use z-axis coordinate as color shade,\n * -useCurves: draw polygons as cures or as lines,\n * -bufferedOutput: experimental: allows to call draw methods multiple times for each detection and interpolate results between results thus achieving smoother animations\n */\nexport interface DrawOptions {\n  color: string,\n  labelColor: string,\n  shadowColor: string,\n  font: string,\n  lineHeight: number,\n  lineWidth: number,\n  pointSize: number,\n  roundRect: number,\n  drawPoints: boolean,\n  drawLabels: boolean,\n  drawBoxes: boolean,\n  drawPolygons: boolean,\n  drawGaze: boolean,\n  fillPolygons: boolean,\n  useDepth: boolean,\n  useCurves: boolean,\n  bufferedOutput: boolean,\n}\n\nexport const options: DrawOptions = {\n  color: <string>'rgba(173, 216, 230, 0.6)', // 'lightblue' with light alpha channel\n  labelColor: <string>'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n  shadowColor: <string>'black',\n  font: <string>'small-caps 14px \"Segoe UI\"',\n  lineHeight: <number>18,\n  lineWidth: <number>4,\n  pointSize: <number>2,\n  roundRect: <number>8,\n  drawPoints: <boolean>false,\n  drawLabels: <boolean>true,\n  drawBoxes: <boolean>true,\n  drawPolygons: <boolean>true,\n  drawGaze: <boolean>true,\n  fillPolygons: <boolean>false,\n  useDepth: <boolean>true,\n  useCurves: <boolean>false,\n  bufferedOutput: <boolean>true,\n};\n\nconst rad2deg = (theta) => Math.round((theta * 180) / Math.PI);\n\nfunction point(ctx, x, y, z = 0, localOptions) {\n  ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n  ctx.beginPath();\n  ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n  ctx.fill();\n}\n\nfunction rect(ctx, x, y, width, height, localOptions) {\n  ctx.beginPath();\n  if (localOptions.useCurves) {\n    const cx = (x + x + width) / 2;\n    const cy = (y + y + height) / 2;\n    ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n  } else {\n    ctx.lineWidth = localOptions.lineWidth;\n    ctx.moveTo(x + localOptions.roundRect, y);\n    ctx.lineTo(x + width - localOptions.roundRect, y);\n    ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n    ctx.lineTo(x + width, y + height - localOptions.roundRect);\n    ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n    ctx.lineTo(x + localOptions.roundRect, y + height);\n    ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n    ctx.lineTo(x, y + localOptions.roundRect);\n    ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n    ctx.closePath();\n  }\n  ctx.stroke();\n}\n\nfunction lines(ctx, points: [number, number, number?][] = [], localOptions) {\n  if (points === undefined || points.length === 0) return;\n  ctx.beginPath();\n  ctx.moveTo(points[0][0], points[0][1]);\n  for (const pt of points) {\n    const z = pt[2] || 0;\n    ctx.strokeStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n    ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n    ctx.lineTo(pt[0], Math.round(pt[1]));\n  }\n  ctx.stroke();\n  if (localOptions.fillPolygons) {\n    ctx.closePath();\n    ctx.fill();\n  }\n}\n\nfunction curves(ctx, points: [number, number, number?][] = [], localOptions) {\n  if (points === undefined || points.length === 0) return;\n  if (!localOptions.useCurves || points.length <= 2) {\n    lines(ctx, points, localOptions);\n    return;\n  }\n  ctx.moveTo(points[0][0], points[0][1]);\n  for (let i = 0; i < points.length - 2; i++) {\n    const xc = (points[i][0] + points[i + 1][0]) / 2;\n    const yc = (points[i][1] + points[i + 1][1]) / 2;\n    ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n  }\n  ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n  ctx.stroke();\n  if (localOptions.fillPolygons) {\n    ctx.closePath();\n    ctx.fill();\n  }\n}\n\nexport async function gesture(inCanvas: HTMLCanvasElement, result: Array<Gesture>, drawOptions?: DrawOptions) {\n  const localOptions = mergeDeep(options, drawOptions);\n  if (!result || !inCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement)) return;\n  const ctx = inCanvas.getContext('2d');\n  if (!ctx) return;\n  ctx.font = localOptions.font;\n  ctx.fillStyle = localOptions.color;\n  let i = 1;\n  for (let j = 0; j < result.length; j++) {\n    let where: unknown[] = []; // what&where is a record\n    let what: unknown[] = []; // what&where is a record\n    [where, what] = Object.entries(result[j]);\n    if ((what.length > 1) && ((what[1] as string).length > 0)) {\n      const who = where[1] as number > 0 ? `#${where[1]}` : '';\n      const label = `${where[0]} ${who}: ${what[1]}`;\n      if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n        ctx.fillStyle = localOptions.shadowColor;\n        ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n      }\n      ctx.fillStyle = localOptions.labelColor;\n      ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n      i += 1;\n    }\n  }\n}\n\nexport async function face(inCanvas: HTMLCanvasElement, result: Array<Face>, drawOptions?: DrawOptions) {\n  const localOptions = mergeDeep(options, drawOptions);\n  if (!result || !inCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement)) return;\n  const ctx = inCanvas.getContext('2d');\n  if (!ctx) return;\n  for (const f of result) {\n    ctx.font = localOptions.font;\n    ctx.strokeStyle = localOptions.color;\n    ctx.fillStyle = localOptions.color;\n    if (localOptions.drawBoxes) rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n    // silly hack since fillText does not suport new line\n    const labels:string[] = [];\n    labels.push(`face: ${Math.trunc(100 * f.score)}%`);\n    if (f.genderScore) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderScore)}%`);\n    if (f.age) labels.push(`age: ${f.age || ''}`);\n    if (f.iris) labels.push(`distance: ${f.iris}`);\n    if (f.emotion && f.emotion.length > 0) {\n      const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n      if (emotion.length > 3) emotion.length = 3;\n      labels.push(emotion.join(' '));\n    }\n    if (f.rotation && f.rotation.angle && f.rotation.gaze) {\n      if (f.rotation.angle.roll) labels.push(`roll: ${rad2deg(f.rotation.angle.roll)}\u00B0 yaw:${rad2deg(f.rotation.angle.yaw)}\u00B0 pitch:${rad2deg(f.rotation.angle.pitch)}\u00B0`);\n      if (f.rotation.gaze.bearing) labels.push(`gaze: ${rad2deg(f.rotation.gaze.bearing)}\u00B0`);\n    }\n    if (labels.length === 0) labels.push('face');\n    ctx.fillStyle = localOptions.color;\n    for (let i = labels.length - 1; i >= 0; i--) {\n      const x = Math.max(f.box[0], 0);\n      const y = i * localOptions.lineHeight + f.box[1];\n      if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n        ctx.fillStyle = localOptions.shadowColor;\n        ctx.fillText(labels[i], x + 5, y + 16);\n      }\n      ctx.fillStyle = localOptions.labelColor;\n      ctx.fillText(labels[i], x + 4, y + 15);\n    }\n    ctx.lineWidth = 1;\n    if (f.mesh && f.mesh.length > 0) {\n      if (localOptions.drawPoints) {\n        for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n        // for (const pt of f.meshRaw) point(ctx, pt[0] * inCanvas.offsetWidth, pt[1] * inCanvas.offsetHeight, pt[2]);\n      }\n      if (localOptions.drawPolygons) {\n        ctx.lineWidth = 1;\n        for (let i = 0; i < triangulation.length / 3; i++) {\n          const points = [\n            triangulation[i * 3 + 0],\n            triangulation[i * 3 + 1],\n            triangulation[i * 3 + 2],\n          ].map((index) => f.mesh[index]);\n          lines(ctx, points, localOptions);\n        }\n        // iris: array[center, left, top, right, bottom]\n        if (f.annotations && f.annotations['leftEyeIris']) {\n          ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n          ctx.beginPath();\n          const sizeX = Math.abs(f.annotations['leftEyeIris'][3][0] - f.annotations['leftEyeIris'][1][0]) / 2;\n          const sizeY = Math.abs(f.annotations['leftEyeIris'][4][1] - f.annotations['leftEyeIris'][2][1]) / 2;\n          ctx.ellipse(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n          ctx.stroke();\n          if (localOptions.fillPolygons) {\n            ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n            ctx.fill();\n          }\n        }\n        if (f.annotations && f.annotations['rightEyeIris']) {\n          ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n          ctx.beginPath();\n          const sizeX = Math.abs(f.annotations['rightEyeIris'][3][0] - f.annotations['rightEyeIris'][1][0]) / 2;\n          const sizeY = Math.abs(f.annotations['rightEyeIris'][4][1] - f.annotations['rightEyeIris'][2][1]) / 2;\n          ctx.ellipse(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n          ctx.stroke();\n          if (localOptions.fillPolygons) {\n            ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n            ctx.fill();\n          }\n        }\n        if (localOptions.drawGaze && f.rotation?.gaze?.strength && f.rotation?.gaze?.bearing && f.annotations['leftEyeIris'] && f.annotations['rightEyeIris'] && f.annotations['leftEyeIris'][0] && f.annotations['rightEyeIris'][0]) {\n          ctx.strokeStyle = 'pink';\n          ctx.beginPath();\n\n          const leftGaze = [\n            f.annotations['leftEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n            f.annotations['leftEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n          ];\n          ctx.moveTo(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1]);\n          ctx.lineTo(leftGaze[0], leftGaze[1]);\n\n          const rightGaze = [\n            f.annotations['rightEyeIris'][0][0] + (Math.sin(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[3]),\n            f.annotations['rightEyeIris'][0][1] + (Math.cos(f.rotation.gaze.bearing) * f.rotation.gaze.strength * f.box[2]),\n          ];\n          ctx.moveTo(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1]);\n          ctx.lineTo(rightGaze[0], rightGaze[1]);\n\n          ctx.stroke();\n        }\n      }\n    }\n  }\n}\n\nexport async function body(inCanvas: HTMLCanvasElement, result: Array<Body>, drawOptions?: DrawOptions) {\n  const localOptions = mergeDeep(options, drawOptions);\n  if (!result || !inCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement)) return;\n  const ctx = inCanvas.getContext('2d');\n  if (!ctx) return;\n  ctx.lineJoin = 'round';\n  for (let i = 0; i < result.length; i++) {\n    ctx.strokeStyle = localOptions.color;\n    ctx.fillStyle = localOptions.color;\n    ctx.lineWidth = localOptions.lineWidth;\n    ctx.font = localOptions.font;\n    if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n      // @ts-ignore box may not exist\n      rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n      if (localOptions.drawLabels) {\n        if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n          ctx.fillStyle = localOptions.shadowColor;\n          // @ts-ignore box may not exist\n          ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n        }\n        ctx.fillStyle = localOptions.labelColor;\n        // @ts-ignore box may not exist\n        ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n      }\n    }\n    if (localOptions.drawPoints) {\n      for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n        ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position[2] ? `rgba(${127.5 + (2 * (result[i].keypoints[pt].position[2] || 0))}, ${127.5 - (2 * (result[i].keypoints[pt].position[2] || 0))}, 255, 0.5)` : localOptions.color;\n        point(ctx, result[i].keypoints[pt].position[0], result[i].keypoints[pt].position[1], 0, localOptions);\n      }\n    }\n    if (localOptions.drawLabels) {\n      ctx.font = localOptions.font;\n      if (result[i].keypoints) {\n        for (const pt of result[i].keypoints) {\n          ctx.fillStyle = localOptions.useDepth && pt.position[2] ? `rgba(${127.5 + (2 * pt.position[2])}, ${127.5 - (2 * pt.position[2])}, 255, 0.5)` : localOptions.color;\n          ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position[0] + 4, pt.position[1] + 4);\n        }\n      }\n    }\n    if (localOptions.drawPolygons && result[i].keypoints) {\n      let part;\n      const points: [number, number, number?][] = [];\n      // shoulder line\n      points.length = 0;\n      part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n      if (part) points.push([part.position[0], part.position[1]]);\n      curves(ctx, points, localOptions);\n      // torso main\n      points.length = 0;\n      part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightHip');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftHip');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n      if (part) points.push([part.position[0], part.position[1]]);\n      if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso\n      // leg left\n      points.length = 0;\n      part = result[i].keypoints.find((a) => a.part === 'leftHip');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n      if (part) points.push([part.position[0], part.position[1]]);\n      curves(ctx, points, localOptions);\n      // leg right\n      points.length = 0;\n      part = result[i].keypoints.find((a) => a.part === 'rightHip');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n      if (part) points.push([part.position[0], part.position[1]]);\n      curves(ctx, points, localOptions);\n      // arm left\n      points.length = 0;\n      part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n      if (part) points.push([part.position[0], part.position[1]]);\n      curves(ctx, points, localOptions);\n      // arm right\n      points.length = 0;\n      part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n      if (part) points.push([part.position[0], part.position[1]]);\n      part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n      if (part) points.push([part.position[0], part.position[1]]);\n      curves(ctx, points, localOptions);\n      // draw all\n    }\n  }\n}\n\nexport async function hand(inCanvas: HTMLCanvasElement, result: Array<Hand>, drawOptions?: DrawOptions) {\n  const localOptions = mergeDeep(options, drawOptions);\n  if (!result || !inCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement)) return;\n  const ctx = inCanvas.getContext('2d');\n  if (!ctx) return;\n  ctx.lineJoin = 'round';\n  ctx.font = localOptions.font;\n  for (const h of result) {\n    if (localOptions.drawBoxes) {\n      ctx.strokeStyle = localOptions.color;\n      ctx.fillStyle = localOptions.color;\n      rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n      if (localOptions.drawLabels) {\n        if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n          ctx.fillStyle = localOptions.shadowColor;\n          ctx.fillText('hand', h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n        }\n        ctx.fillStyle = localOptions.labelColor;\n        ctx.fillText('hand', h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n      }\n      ctx.stroke();\n    }\n    if (localOptions.drawPoints) {\n      if (h.keypoints && h.keypoints.length > 0) {\n        for (const pt of h.keypoints) {\n          ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.5)` : localOptions.color;\n          point(ctx, pt[0], pt[1], 0, localOptions);\n        }\n      }\n    }\n    if (localOptions.drawLabels) {\n      const addHandLabel = (part, title) => {\n        ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[part.length - 1][2])}, ${127.5 - (2 * part[part.length - 1][2])}, 255, 0.5)` : localOptions.color;\n        ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n      };\n      ctx.font = localOptions.font;\n      addHandLabel(h.annotations['indexFinger'], 'index');\n      addHandLabel(h.annotations['middleFinger'], 'middle');\n      addHandLabel(h.annotations['ringFinger'], 'ring');\n      addHandLabel(h.annotations['pinky'], 'pinky');\n      addHandLabel(h.annotations['thumb'], 'thumb');\n      addHandLabel(h.annotations['palmBase'], 'palm');\n    }\n    if (localOptions.drawPolygons) {\n      const addHandLine = (part) => {\n        if (!part) return;\n        for (let i = 0; i < part.length; i++) {\n          ctx.beginPath();\n          ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[i][2])}, ${127.5 - (2 * part[i][2])}, 255, 0.5)` : localOptions.color;\n          ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n          ctx.lineTo(part[i][0], part[i][1]);\n          ctx.stroke();\n        }\n      };\n      ctx.lineWidth = localOptions.lineWidth;\n      addHandLine(h.annotations['indexFinger']);\n      addHandLine(h.annotations['middleFinger']);\n      addHandLine(h.annotations['ringFinger']);\n      addHandLine(h.annotations['pinky']);\n      addHandLine(h.annotations['thumb']);\n      // addPart(h.annotations.palmBase);\n    }\n  }\n}\n\nexport async function object(inCanvas: HTMLCanvasElement, result: Array<Item>, drawOptions?: DrawOptions) {\n  const localOptions = mergeDeep(options, drawOptions);\n  if (!result || !inCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement)) return;\n  const ctx = inCanvas.getContext('2d');\n  if (!ctx) return;\n  ctx.lineJoin = 'round';\n  ctx.font = localOptions.font;\n  for (const h of result) {\n    if (localOptions.drawBoxes) {\n      ctx.strokeStyle = localOptions.color;\n      ctx.fillStyle = localOptions.color;\n      rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n      if (localOptions.drawLabels) {\n        const label = `${h.label} ${Math.round(100 * h.score)}%`;\n        if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n          ctx.fillStyle = localOptions.shadowColor;\n          ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n        }\n        ctx.fillStyle = localOptions.labelColor;\n        ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n      }\n      ctx.stroke();\n    }\n  }\n}\n\nexport async function person(inCanvas: HTMLCanvasElement, result: Array<Person>, drawOptions?: DrawOptions) {\n  const localOptions = mergeDeep(options, drawOptions);\n  if (!result || !inCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement)) return;\n  const ctx = inCanvas.getContext('2d');\n  if (!ctx) return;\n  ctx.lineJoin = 'round';\n  ctx.font = localOptions.font;\n\n  for (let i = 0; i < result.length; i++) {\n    if (localOptions.drawBoxes) {\n      ctx.strokeStyle = localOptions.color;\n      ctx.fillStyle = localOptions.color;\n      rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n      if (localOptions.drawLabels) {\n        const label = `person #${i}`;\n        if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n          ctx.fillStyle = localOptions.shadowColor;\n          ctx.fillText(label, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n        }\n        ctx.fillStyle = localOptions.labelColor;\n        ctx.fillText(label, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n      }\n      ctx.stroke();\n    }\n  }\n}\n\nexport async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n  if (!inCanvas || !outCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;\n  const outCtx = inCanvas.getContext('2d');\n  outCtx?.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n  const timestamp = now();\n  const localOptions = mergeDeep(options, drawOptions);\n  if (!result || !inCanvas) return;\n  if (!(inCanvas instanceof HTMLCanvasElement)) return;\n\n  face(inCanvas, result.face, localOptions);\n  body(inCanvas, result.body, localOptions);\n  hand(inCanvas, result.hand, localOptions);\n  object(inCanvas, result.object, localOptions);\n  // person(inCanvas, result.persons, localOptions);\n  gesture(inCanvas, result.gesture, localOptions); // gestures do not have buffering\n\n  /*\n  if (!bufferedResult) bufferedResult = result; // first pass\n  else if (localOptions.bufferedOutput) calcBuffered(result); // do results interpolation\n  else bufferedResult = result; // or just use results as-is\n  const promises: Promise<void>[] = [];\n  promises.push(face(inCanvas, bufferedResult.face, localOptions));\n  promises.push(body(inCanvas, bufferedResult.body, localOptions));\n  promises.push(hand(inCanvas, bufferedResult.hand, localOptions));\n  promises.push(object(inCanvas, bufferedResult.object, localOptions));\n  // promises.push(person(inCanvas, bufferedResult.persons, localOptions));\n  promises.push(gesture(inCanvas, result.gesture, localOptions)); // gestures do not have buffering\n  // await Promise.all(promises);\n  */\n  result.performance.draw = Math.trunc(now() - timestamp);\n}\n", "/**\n * Module that analyzes existing results and recombines them into a unified person object\n */\n\nimport { Face, Body, Hand, Gesture, Person } from './result';\n\nexport function join(faces: Array<Face>, bodies: Array<Body>, hands: Array<Hand>, gestures: Array<Gesture>, shape: Array<number> | undefined): Array<Person> {\n  let id = 0;\n  const persons: Array<Person> = [];\n  for (const face of faces) { // person is defined primarily by face and then we append other objects as found\n    const person: Person = { id: id++, face, body: null, hands: { left: null, right: null }, gestures: [], box: [0, 0, 0, 0] };\n    for (const body of bodies) {\n      if (face.box[0] > body.box[0] // x within body\n        && face.box[0] < body.box[0] + body.box[2]\n        && face.box[1] + face.box[3] > body.box[1] // y within body\n        && face.box[1] + face.box[3] < body.box[1] + body.box[3]) {\n        person.body = body;\n      }\n    }\n    if (person.body) { // only try to join hands if body is found\n      for (const hand of hands) {\n        if (hand.box[0] + hand.box[2] > person.body.box[0] // x within body for left hand\n          && hand.box[0] + hand.box[2] < person.body.box[0] + person.body.box[2]\n          && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for left hand\n          && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n          if (person.hands) person.hands.left = hand;\n        }\n        if (hand.box[0] < person.body.box[0] + person.body.box[2] // x within body for right hand\n          && hand.box[0] > person.body.box[0]\n          && hand.box[1] + hand.box[3] > person.body.box[1] // x within body for right hand\n          && hand.box[1] + hand.box[3] < person.body.box[1] + person.body.box[3]) {\n          if (person.hands) person.hands.right = hand;\n        }\n      }\n    }\n    for (const gesture of gestures) { // append all gestures according to ids\n      if (gesture['face'] !== undefined && gesture['face'] === face.id) person.gestures?.push(gesture);\n      else if (gesture['iris'] !== undefined && gesture['iris'] === face.id) person.gestures?.push(gesture);\n      else if (gesture['body'] !== undefined && gesture['body'] === person.body?.id) person.gestures?.push(gesture);\n      else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.left?.id) person.gestures?.push(gesture);\n      else if (gesture['hand'] !== undefined && gesture['hand'] === person.hands?.right?.id) person.gestures?.push(gesture);\n    }\n\n    // create new overarching box from all boxes beloning to person\n    const x: number[] = [];\n    const y: number[] = [];\n    const extractXY = (box) => { // extract all [x, y] coordinates from boxes [x, y, width, height]\n      if (box && box.length === 4) {\n        x.push(box[0], box[0] + box[2]);\n        y.push(box[1], box[1] + box[3]);\n      }\n    };\n    extractXY(person.face?.box);\n    extractXY(person.body?.box);\n    extractXY(person.hands?.left?.box);\n    extractXY(person.hands?.right?.box);\n    const minX = Math.min(...x);\n    const minY = Math.min(...y);\n    person.box = [minX, minY, Math.max(...x) - minX, Math.max(...y) - minY]; // create new overarching box\n\n    // shape is known so we calculate boxRaw as well\n    if (shape && shape.length === 4) person.boxRaw = [person.box[0] / shape[2], person.box[1] / shape[1], person.box[2] / shape[2], person.box[3] / shape[1]];\n\n    persons.push(person);\n  }\n  return persons;\n}\n", "/**\n * Module that interpolates results for smoother animations\n */\n\nimport type { Result, Face, Body, Hand, Item, Gesture, Person } from './result';\n\nconst bufferedResult: Result = { face: [], body: [], hand: [], gesture: [], object: [], persons: [], performance: {}, timestamp: 0 };\n\nexport function calc(newResult: Result): Result {\n  // each record is only updated using deep clone when number of detected record changes, otherwise it will converge by itself\n  // otherwise bufferedResult is a shallow clone of result plus updated local calculated values\n  // thus mixing by-reference and by-value assignments to minimize memory operations\n\n  const elapsed = Date.now() - newResult.timestamp;\n  // curve fitted: buffer = 8 - ln(delay)\n  // interpolation formula: current = ((buffer - 1) * previous + live) / buffer\n  // - at  50ms delay buffer = ~4.1 => 28% towards live data\n  // - at 250ms delay buffer = ~2.5 => 40% towards live data\n  // - at 500ms delay buffer = ~1.8 => 55% towards live data\n  // - at 750ms delay buffer = ~1.4 => 71% towards live data\n  // - at  1sec delay buffer = 1 which means live data is used\n  const bufferedFactor = elapsed < 1000 ? 8 - Math.log(elapsed) : 1;\n\n  bufferedResult.canvas = newResult.canvas;\n\n  // interpolate body results\n  if (!bufferedResult.body || (newResult.body.length !== bufferedResult.body.length)) {\n    bufferedResult.body = JSON.parse(JSON.stringify(newResult.body as Body[])); // deep clone once\n  } else {\n    for (let i = 0; i < newResult.body.length; i++) {\n      const box = newResult.body[i].box // update box\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].box[j] + b) / bufferedFactor) as [number, number, number, number];\n      const boxRaw = newResult.body[i].boxRaw // update boxRaw\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.body[i].boxRaw[j] + b) / bufferedFactor) as [number, number, number, number];\n      const keypoints = (newResult.body[i].keypoints // update keypoints\n        .map((keypoint, j) => ({\n          score: keypoint.score,\n          part: keypoint.part,\n          position: [\n            bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[0] + keypoint.position[0]) / bufferedFactor : keypoint.position[0],\n            bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].position[1] + keypoint.position[1]) / bufferedFactor : keypoint.position[1],\n          ],\n          positionRaw: [\n            bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[0] + keypoint.positionRaw[0]) / bufferedFactor : keypoint.position[0],\n            bufferedResult.body[i].keypoints[j] ? ((bufferedFactor - 1) * bufferedResult.body[i].keypoints[j].positionRaw[1] + keypoint.positionRaw[1]) / bufferedFactor : keypoint.position[1],\n          ],\n        }))) as Array<{ score: number, part: string, position: [number, number, number?], positionRaw: [number, number, number?] }>;\n      bufferedResult.body[i] = { ...newResult.body[i], box, boxRaw, keypoints }; // shallow clone plus updated values\n    }\n  }\n\n  // interpolate hand results\n  if (!bufferedResult.hand || (newResult.hand.length !== bufferedResult.hand.length)) {\n    bufferedResult.hand = JSON.parse(JSON.stringify(newResult.hand as Hand[])); // deep clone once\n  } else {\n    for (let i = 0; i < newResult.hand.length; i++) {\n      const box = (newResult.hand[i].box// update box\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n      const boxRaw = (newResult.hand[i].boxRaw // update boxRaw\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.hand[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n      const keypoints = newResult.hand[i].keypoints // update landmarks\n        .map((landmark, j) => landmark\n          .map((coord, k) => (((bufferedFactor - 1) * bufferedResult.hand[i].keypoints[j][k] + coord) / bufferedFactor)) as [number, number, number]);\n      const keys = Object.keys(newResult.hand[i].annotations); // update annotations\n      const annotations = {};\n      for (const key of keys) {\n        annotations[key] = newResult.hand[i].annotations[key]\n          .map((val, j) => val.map((coord, k) => ((bufferedFactor - 1) * bufferedResult.hand[i].annotations[key][j][k] + coord) / bufferedFactor));\n      }\n      bufferedResult.hand[i] = { ...newResult.hand[i], box, boxRaw, keypoints, annotations }; // shallow clone plus updated values\n    }\n  }\n\n  // interpolate face results\n  if (!bufferedResult.face || (newResult.face.length !== bufferedResult.face.length)) {\n    bufferedResult.face = JSON.parse(JSON.stringify(newResult.face as Face[])); // deep clone once\n  } else {\n    for (let i = 0; i < newResult.face.length; i++) {\n      const box = (newResult.face[i].box // update box\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n      const boxRaw = (newResult.face[i].boxRaw // update boxRaw\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.face[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n      const rotation: {\n        matrix: [number, number, number, number, number, number, number, number, number],\n        angle: { roll: number, yaw: number, pitch: number },\n        gaze: { bearing: number, strength: number }\n      } = { matrix: [0, 0, 0, 0, 0, 0, 0, 0, 0], angle: { roll: 0, yaw: 0, pitch: 0 }, gaze: { bearing: 0, strength: 0 } };\n      rotation.matrix = newResult.face[i].rotation?.matrix as [number, number, number, number, number, number, number, number, number];\n      rotation.angle = {\n        roll: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.roll || 0) + (newResult.face[i].rotation?.angle?.roll || 0)) / bufferedFactor,\n        yaw: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.yaw || 0) + (newResult.face[i].rotation?.angle?.yaw || 0)) / bufferedFactor,\n        pitch: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.angle?.pitch || 0) + (newResult.face[i].rotation?.angle?.pitch || 0)) / bufferedFactor,\n      };\n      rotation.gaze = {\n        // not fully correct due projection on circle, also causes wrap-around draw on jump from negative to positive\n        bearing: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.bearing || 0) + (newResult.face[i].rotation?.gaze?.bearing || 0)) / bufferedFactor,\n        strength: ((bufferedFactor - 1) * (bufferedResult.face[i].rotation?.gaze?.strength || 0) + (newResult.face[i].rotation?.gaze?.strength || 0)) / bufferedFactor,\n      };\n      bufferedResult.face[i] = { ...newResult.face[i], rotation, box, boxRaw }; // shallow clone plus updated values\n    }\n  }\n\n  // interpolate object detection results\n  if (!bufferedResult.object || (newResult.object.length !== bufferedResult.object.length)) {\n    bufferedResult.object = JSON.parse(JSON.stringify(newResult.object as Item[])); // deep clone once\n  } else {\n    for (let i = 0; i < newResult.object.length; i++) {\n      const box = (newResult.object[i].box // update box\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].box[j] + b) / bufferedFactor)) as [number, number, number, number];\n      const boxRaw = (newResult.object[i].boxRaw // update boxRaw\n        .map((b, j) => ((bufferedFactor - 1) * bufferedResult.object[i].boxRaw[j] + b) / bufferedFactor)) as [number, number, number, number];\n      bufferedResult.object[i] = { ...newResult.object[i], box, boxRaw }; // shallow clone plus updated values\n    }\n  }\n\n  // interpolate person results\n  if (newResult.persons) {\n    const newPersons = newResult.persons; // trigger getter function\n    if (!bufferedResult.persons || (newPersons.length !== bufferedResult.persons.length)) {\n      bufferedResult.persons = JSON.parse(JSON.stringify(newPersons as Person[]));\n    } else {\n      for (let i = 0; i < newPersons.length; i++) { // update person box, we don't update the rest as it's updated as reference anyhow\n        bufferedResult.persons[i].box = (newPersons[i].box\n          .map((box, j) => ((bufferedFactor - 1) * bufferedResult.persons[i].box[j] + box) / bufferedFactor)) as [number, number, number, number];\n      }\n    }\n  }\n\n  // just copy latest gestures without interpolation\n  if (newResult.gesture) bufferedResult.gesture = newResult.gesture as Gesture[];\n  if (newResult.performance) bufferedResult.performance = newResult.performance;\n\n  return bufferedResult;\n}\n", "/**\n * Embedded sample images used during warmup in dataURL format\n */\n\n// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\n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\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\nb9a7LfBTfS1vWI2jf12VfQPSW8KX2mas+NC2iv6xMNfJpMnLtEbuuxtMRCtzF55NR5rPps1N/ctP\ny6uHreE6nXZ4pak48X3rT06fB7fNeI33cbX6mI32R/MWu7XF116aDSRhxbRERs8f499bkyZeeKae\nkzE2mdon81/tfxDLGOunwbzlzbx08oaHBvZHJlx48mrvaa94pu04y617576rNGLRRM0397JEd/lu\n9Dw/S3x4qxffo6mm4NjwUiKY4iI9Ib1dHFY6QIaNabbrYrLfrpJtaK1rMzPZb/s+05IpP59OyLeJ\nk7eNfRaOc1ue32I7fGXYpi5Y77M8OGMeOKxHSFsU3Y29deZMzirl6dlVvhLatCjJHeYQv1rXnps1\n8k9/VsW6qLVmZIi1rzitlvFKRvaZ2h6TSaenC9FFY+3brM+sqeG8Prp4+kZ+lvuxPkr1mqm95nfp\nDXM459676a2q1dsV7XietvNno78+CJn1cjX6mOeIm0bR33dfRU5NJjidt9t5afjG/V6JZ7I2QMNh\nnyo2BhsMuVG3wAhMSbbQRAMolnE+iuGUSCyJZRKuGUSCyJZK4llEgyZMYTuCUsYSCQASISAAAlCQ\nAAAAAAEoASCASAAAAAAAAAAAAlACRACQAAAAAAAAAEgCEoASCAAAAAAAAAAAAAAAAAAAAAAABAAA\nAAAAAAAISAIAAAAAAQAAACASgAAAQJAQAAhIDHZhln3do7z0WS18mWsajHjmes7pg3dNi5aRMNqO\nyvDHTpPRaigHZhN4hHRlaVN59JY3zRENLUavaO+yq0iNVlitJ6vNcR1MVi0zO0era1/Ea0rPvbz5\nPM5MWp45qvo2GZrhmfrsnpHpHzTCseEcM/2vrr8Q1Eb4qzy44nziPN63HpYiIiI7LNHoqabBTFii\nIpSNohuVxrKtWMEejPwY9G1FFmHB4mWJn7MdfnIM9JpIx15to5pbUaas/a6rqViI7MxPxqX0UT1r\nO3wVzpbR2hviP5i03Y5s6a879FNtHljydhExCv8AMTPJXBnRZbz0iG5ptFjwe/l96zctMVamTJtE\nyTMibu1VrdTzRMR0j0ed4lr64MVpm0RERvMz5NvX62uOJ69XhOKX1HH9bHDtFvNYnfJeOy0Z2ojX\n6jjnEq6fRUmccTvN/J9H0eKcOnx45neaxEbubwHgOHg+milI3vP2resu3Wu0JQmITsmISDHZHKz2\nJgFc1RMLJhGwK9iIZ7MZgEdgmAEwyiWCdwWRLKJVxKYsC2JTuriWUSDNlEsIlMAySx3SCRCQSIAS\nAAACRACQAAAAAAASIASAAAAAAAAAAAAAAACRACRACQASIAAAAAAAAAAAAAAAAAAAAAAAAQCUAAAA\nAAAAAAIAAAAAAAAQAAAAAACBICBICAAEJAQJQCJcLjuS2ny6fPG/LWdpd1o8T0X07SXx/e7wCdJx\nWa0jmneHQpxPDMdZmJfNtZm49weZrh0/j4o7VtSZ2+Uw0/8A7o49k92vBLc/ntFohFW9PqGXimOI\n6Tu1L8T3eCx6r2t1O3JwvHjifO99v7t/Bwf2l1PXU6rS6eJ8qUm8x+so5TsekzcSjbvs4mt4rzW5\nK2mbT0itesy2cHsvbvqtbmyz5xERWP2jd1tJwrTaONsOKtZ8585+cnDrzmn4Rq+IZObUROHD32n7\nVv8A0ej0uhxaXFGPFSK1j0bkY4jyZRVZVXFGUVWbGwKsk8mObekNrSW3pWf1a2aYjHbm7bNnQ1id\nPW0TvuDdhJEbQABMsLW2R0ZTMQrvfbz2YWzVhpanUxEd0dWkW5c8R5uXxDX1w4pnfr5Q19XxKuOJ\n2neXltVqtVxbV/RdJ715+1bypANfiOu1HENV9C0MTfNeesx2rD1PAeBYuE6aKx72W3W9/WVnBuB4\neF4dqRzZbdb5J72l160WVK02ZxCYhOwI23TsnY2BGxsnYBjsiYZsZBjMMZZSgGEolMsQDdG6NwZ7\npiVe6YkFsSziVMWZRILolMSriWUSCyJTuwhMSDMRCQSI3SAlACRCQAAEoAEoASAAAAAAAAACUACR\nACQAAAAAAAAAAAAASAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAABAAAAAAAAAAAAACBKAAAAAAAQ\nJQAAAhICEbJAYTWJ7wx8KvpC0BV4ceieWGewDHlNmWwCNjZICNhIDmcZredBecdpiY69FXCOLW+i\nUiZidukulmxxlx2paN4mNng+K4+I8Hy2yaTfl37TXetoCPfRxfp1qi3F48ofKMvtvxak8s6LDv61\nrZji9rPaLUf5PC+bfttS0q8q3p9W/wBrRMdpUZuKdN99nzvFqPbTVz7nD8OKs+do2/mW3h4D7Xaq\nZnPrtNpqz35aRaYOHY9Zk4pNt9rR+rl6zi+OnS+WN57Rv1lXp/YrNaYtruL6zNPnGO3hxP6O5w/2\nf0HDuun09Yv55Le9afznqcOvO4tBreMTHu30unnva0bWt8on+70nDuE4OHYYx4Kbesz3tPrMuhGO\nIjpDOKrK9YVpsyiGUQnYGOyUgI2SlAIEmwMWMs9kTAMJYzDOYRMArmGErZhhMArlHmzmGMwDE3Ts\nbAbs4swj5pgFkSziVcM4BZEsolXDKAZwyhjCYBkACQhIAAAAAAAJAAAAAAAAAAAAAAAAAAAShIAA\nAAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA\nBAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2\nSbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T\nlBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/\n2Q==`;\n", "/**\n * Human main module\n */\n\nimport { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result, Gesture } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as models from './models';\nimport * as face from './face';\nimport * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as efficientpose from './efficientpose/efficientpose';\nimport * as movenet from './movenet/movenet';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as segmentation from './segmentation/segmentation';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as persons from './persons';\nimport * as interpolate from './interpolate';\nimport * as sample from './sample';\nimport * as app from '../package.json';\nimport { Tensor, GraphModel } from './tfjs/types';\n\n// export types\nexport type { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture, Person } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection\n * @typedef Input Type\n */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message\n * @typedef Error Type\n */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS\n * @external\n */\nexport type TensorFlow = typeof tf;\n\n/**\n * **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n *\n * @param userConfig: {@link Config}\n */\nexport class Human {\n  /** Current version of Human library in *semver* format */\n  version: string;\n  /** Current configuration\n   * - Details: {@link Config}\n   */\n  config: Config;\n  /** Last known result of detect run\n   * - Can be accessed anytime after initial detection\n   */\n  result: Result;\n  /** Current state of Human library\n   * - Can be polled to determine operations that are currently executed\n   * - Progresses through: 'config', 'check', 'backend', 'load', 'run:<model>', 'idle'\n   */\n  state: string;\n  /** @internal: Instance of current image being processed */\n  image: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement | null };\n  /** @internal: Instance of TensorFlow/JS used by Human\n   * - Can be embedded or externally provided\n   */\n  tf: TensorFlow;\n  /** Draw helper classes that can draw detected objects on canvas using specified draw\n   * - options: {@link DrawOptions} global settings for all draw operations, can be overriden for each draw method\n   * - face: draw detected faces\n   * - body: draw detected people and body parts\n   * - hand: draw detected hands and hand parts\n   * - canvas: draw processed canvas which is a processed copy of the input\n   * - all: meta-function that performs: canvas, face, body, hand\n   */\n  draw: {\n    options: draw.DrawOptions,\n    gesture: typeof draw.gesture,\n    face: typeof draw.face,\n    body: typeof draw.body,\n    hand: typeof draw.hand,\n    canvas: typeof draw.canvas,\n    all: typeof draw.all,\n  };\n  /** @internal: Currently loaded models */\n  models: {\n    face: [unknown, GraphModel | null, GraphModel | null] | null,\n    posenet: GraphModel | null,\n    blazepose: GraphModel | null,\n    efficientpose: GraphModel | null,\n    movenet: GraphModel | null,\n    handpose: [GraphModel | null, GraphModel | null] | null,\n    age: GraphModel | null,\n    gender: GraphModel | null,\n    emotion: GraphModel | null,\n    embedding: GraphModel | null,\n    nanodet: GraphModel | null,\n    centernet: GraphModel | null,\n    faceres: GraphModel | null,\n    segmentation: GraphModel | null,\n  };\n  /** Reference face triangualtion array of 468 points, used for triangle references between points */\n  faceTriangulation: typeof facemesh.triangulation;\n  /** Refernce UV map of 468 values, used for 3D mapping of the face mesh */\n  faceUVMap: typeof facemesh.uvmap;\n  /** Platform and agent information detected by Human */\n  sysinfo: { platform: string, agent: string };\n  /** Performance object that contains values for all recently performed operations */\n  performance: Record<string, number>; // perf members are dynamically defined as needed\n  #numTensors: number;\n  #analyzeMemoryLeaks: boolean;\n  #checkSanity: boolean;\n  #firstRun: boolean;\n  #lastInputSum: number;\n  #lastCacheDiff: number;\n\n  // definition end\n\n  /**\n   * Creates instance of Human library that is futher used for all operations\n   * @param userConfig: {@link Config}\n   */\n  constructor(userConfig?: Config | Record<string, unknown>) {\n    this.config = mergeDeep(defaults, userConfig || {});\n    this.tf = tf;\n    this.draw = draw;\n    this.version = app.version;\n    this.state = 'idle';\n    this.#numTensors = 0;\n    this.#analyzeMemoryLeaks = false;\n    this.#checkSanity = false;\n    this.#firstRun = true;\n    this.#lastCacheDiff = 0;\n    this.performance = { backend: 0, load: 0, image: 0, frames: 0, cached: 0, changed: 0, total: 0, draw: 0 };\n    // object that contains all initialized models\n    this.models = {\n      face: null,\n      posenet: null,\n      blazepose: null,\n      efficientpose: null,\n      movenet: null,\n      handpose: null,\n      age: null,\n      gender: null,\n      emotion: null,\n      embedding: null,\n      nanodet: null,\n      centernet: null,\n      faceres: null,\n      segmentation: null,\n    };\n    // export access to image processing\n    // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n    this.image = (input: Input) => image.process(input, this.config);\n    // export raw access to underlying models\n    this.faceTriangulation = facemesh.triangulation;\n    this.faceUVMap = facemesh.uvmap;\n    // include platform info\n    this.sysinfo = sysinfo.info();\n    this.#lastInputSum = 1;\n  }\n\n  // helper function: measure tensor leak\n  /** @hidden */\n  analyze = (...msg) => {\n    if (!this.#analyzeMemoryLeaks) return;\n    const currentTensors = this.tf.engine().state.numTensors;\n    const previousTensors = this.#numTensors;\n    this.#numTensors = currentTensors;\n    const leaked = currentTensors - previousTensors;\n    if (leaked !== 0) log(...msg, leaked);\n  }\n\n  // quick sanity check on inputs\n  /** @hidden */\n  #sanity = (input): null | string => {\n    if (!this.#checkSanity) return null;\n    if (!input) return 'input is not defined';\n    if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n    try {\n      this.tf.getBackend();\n    } catch {\n      return 'backend not loaded';\n    }\n    return null;\n  }\n\n  /** Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)\n   * - Calculation is based on normalized Minkowski distance between\n   *\n   * @param embedding1: face descriptor as array of numbers\n   * @param embedding2: face descriptor as array of numbers\n   * @returns similarity: number\n  */\n  // eslint-disable-next-line class-methods-use-this\n  similarity(embedding1: Array<number>, embedding2: Array<number>): number {\n    return faceres.similarity(embedding1, embedding2);\n  }\n\n  /**\n   * Segmentation method takes any input and returns processed canvas with body segmentation\n   * Optional parameter background is used to fill the background with specific input\n   * Segmentation is not triggered as part of detect process\n   *\n   * @param input: {@link Input}\n   * @param background?: {@link Input}\n   * @returns Canvas\n   */\n  segmentation(input: Input, background?: Input) {\n    return segmentation.process(input, background, this.config);\n  }\n\n  /** Enhance method performs additional enhacements to face image previously detected for futher processing\n   * @param input: Tensor as provided in human.result.face[n].tensor\n   * @returns Tensor\n   */\n  // eslint-disable-next-line class-methods-use-this\n  enhance(input: Tensor): Tensor | null {\n    // @ts-ignore type mismach for Tensor\n    return faceres.enhance(input);\n  }\n\n  /** Math method find best match between provided face descriptor and predefined database of known descriptors\n   * @param faceEmbedding: face descriptor previsouly calculated on any face\n   * @param db: array of mapping of face descriptors to known values\n   * @param threshold: minimum score for matching to be considered in the result\n   * @returns best match\n   */\n  // eslint-disable-next-line class-methods-use-this\n  match(faceEmbedding: Array<number>, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, similarity: number, embedding: number[] } {\n    return faceres.match(faceEmbedding, db, threshold);\n  }\n\n  /** Load method preloads all configured models on-demand\n   * - Not explicitly required as any required model is load implicitly on it's first run\n   * @param userConfig?: {@link Config}\n  */\n  async load(userConfig?: Config | Record<string, unknown>) {\n    this.state = 'load';\n    const timeStamp = now();\n    if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n\n    if (this.#firstRun) { // print version info on first run and check for correct backend setup\n      if (this.config.debug) log(`version: ${this.version}`);\n      if (this.config.debug) log(`tfjs version: ${this.tf.version_core}`);\n      if (this.config.debug) log('platform:', this.sysinfo.platform);\n      if (this.config.debug) log('agent:', this.sysinfo.agent);\n\n      await this.#checkBackend(true);\n      if (this.tf.ENV.flags.IS_BROWSER) {\n        if (this.config.debug) log('configuration:', this.config);\n        if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n      }\n    }\n\n    await models.load(this); // actually loads models\n\n    if (this.#firstRun) { // print memory stats on first run\n      if (this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors');\n      this.#firstRun = false;\n    }\n\n    const current = Math.trunc(now() - timeStamp);\n    if (current > (this.performance.load as number || 0)) this.performance.load = current;\n  }\n\n  // check if backend needs initialization if it changed\n  /** @hidden */\n  #checkBackend = async (force = false) => {\n    if (this.config.backend && (this.config.backend.length > 0) && force || (this.tf.getBackend() !== this.config.backend)) {\n      const timeStamp = now();\n      this.state = 'backend';\n      /* force backend reload\n      if (this.config.backend in tf.engine().registry) {\n        const backendFactory = tf.findBackendFactory(this.config.backend);\n        tf.removeBackend(this.config.backend);\n        tf.registerBackend(this.config.backend, backendFactory);\n      } else {\n        log('Backend not registred:', this.config.backend);\n      }\n      */\n\n      if (this.config.backend && this.config.backend.length > 0) {\n        // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n        if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) log('running inside web worker');\n\n        // force browser vs node backend\n        if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') this.config.backend = 'webgl';\n        if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) this.config.backend = 'tensorflow';\n\n        if (this.config.debug) log('setting backend:', this.config.backend);\n\n        if (this.config.backend === 'wasm') {\n          if (this.config.debug) log('wasm path:', this.config.wasmPath);\n          if (typeof this.tf?.setWasmPaths !== 'undefined') this.tf.setWasmPaths(this.config.wasmPath);\n          else throw new Error('Human: WASM backend is not loaded');\n          const simd = await this.tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n          const mt = await this.tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n          if (this.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n          if (this.config.debug && !simd) log('warning: wasm simd support is not enabled');\n        }\n\n        if (this.config.backend === 'humangl') backend.register();\n        try {\n          await this.tf.setBackend(this.config.backend);\n        } catch (err) {\n          log('error: cannot set backend:', this.config.backend, err);\n        }\n      }\n      this.tf.enableProdMode();\n      // this.tf.enableDebugMode();\n      if (this.tf.getBackend() === 'webgl' || this.tf.getBackend() === 'humangl') {\n        this.tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n        this.tf.ENV.set('WEBGL_CPU_FORWARD', true);\n        this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', false);\n        this.tf.ENV.set('WEBGL_USE_SHAPES_UNIFORMS', true);\n        // if (!this.config.object.enabled) this.tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); // safe to use 16bit precision\n        if (typeof this.config['deallocate'] !== 'undefined' && this.config['deallocate']) { // hidden param\n          log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n          this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n        }\n        // @ts-ignore getGPGPUContext only exists on WebGL backend\n        const gl = await this.tf.backend().getGPGPUContext().gl;\n        if (this.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n      }\n      await this.tf.ready();\n      this.performance.backend = Math.trunc(now() - timeStamp);\n    }\n  }\n\n  /**\n   * Runs interpolation using last known result and returns smoothened result\n   * Interpolation is based on time since last known result so can be called independently\n   *\n   * @param result?: {@link Result} optional use specific result set to run interpolation on\n   * @returns result: {@link Result}\n   */\n  next = (result?: Result) => interpolate.calc(result || this.result) as Result;\n\n  // check if input changed sufficiently to trigger new detections\n  /** @hidden */\n  #skipFrame = async (input) => {\n    if (this.config.cacheSensitivity === 0) return false;\n    const resizeFact = 32;\n    const reduced: Tensor = tf.image.resizeBilinear(input, [Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n    // use tensor sum\n    /*\n    const sumT = this.tf.sum(reduced);\n    const sum = sumT.dataSync()[0] as number;\n    sumT.dispose();\n    */\n    // use js loop sum, faster than uploading tensor to gpu calculating and downloading back\n    const reducedData = await reduced.data(); // raw image rgb array\n    let sum = 0;\n    for (let i = 0; i < reducedData.length / 3; i++) sum += reducedData[3 * i + 2]; // look only at green value of each pixel\n\n    reduced.dispose();\n    const diff = 100 * (Math.max(sum, this.#lastInputSum) / Math.min(sum, this.#lastInputSum) - 1);\n    this.#lastInputSum = sum;\n    // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n    // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n    const skipFrame = diff < Math.max(this.config.cacheSensitivity, this.#lastCacheDiff);\n    // if difference is above 10x threshold, don't use last value to force reset cache for significant change of scenes or images\n    this.#lastCacheDiff = diff > 10 * this.config.cacheSensitivity ? 0 : diff;\n    return skipFrame;\n  }\n\n  /** Main detection method\n   * - Analyze configuration: {@link Config}\n   * - Pre-process input: {@link Input}\n   * - Run inference for all configured models\n   * - Process and return result: {@link Result}\n   *\n   * @param input: Input\n   * @param userConfig?: {@link Config}\n   * @returns result: {@link Result}\n  */\n  async detect(input: Input, userConfig?: Config | Record<string, unknown>): Promise<Result | Error> {\n    // detection happens inside a promise\n    return new Promise(async (resolve) => {\n      this.state = 'config';\n      let timeStamp;\n      let elapsedTime;\n\n      // update configuration\n      this.config = mergeDeep(this.config, userConfig) as Config;\n\n      // sanity checks\n      this.state = 'check';\n      const error = this.#sanity(input);\n      if (error) {\n        log(error, input);\n        resolve({ error });\n      }\n\n      const timeStart = now();\n\n      // configure backend\n      await this.#checkBackend();\n\n      // load models if enabled\n      await this.load();\n\n      /*\n      // function disabled in favor of inputChanged\n      // disable video optimization for inputs of type image, but skip if inside worker thread\n      let previousVideoOptimized;\n      // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n      if (input && this.config.videoOptimized && (typeof window !== 'undefined') && (typeof WorkerGlobalScope !== 'undefined') && (\n        (typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n        || (typeof Image !== 'undefined' && input instanceof Image)\n        || (typeof ImageData !== 'undefined' && input instanceof ImageData)\n        || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap))\n      ) {\n        log('disabling video optimization');\n        previousVideoOptimized = this.config.videoOptimized;\n        this.config.videoOptimized = false;\n      }\n      */\n\n      timeStamp = now();\n      let process = image.process(input, this.config);\n      this.performance.image = Math.trunc(now() - timeStamp);\n      this.analyze('Get Image:');\n\n      // run segmentation preprocessing\n      if (this.config.segmentation.enabled && process && process.tensor) {\n        this.analyze('Start Segmentation:');\n        this.state = 'run:segmentation';\n        timeStamp = now();\n        await segmentation.predict(process);\n        elapsedTime = Math.trunc(now() - timeStamp);\n        if (elapsedTime > 0) this.performance.segmentation = elapsedTime;\n        if (process.canvas) {\n          // replace input\n          tf.dispose(process.tensor);\n          process = image.process(process.canvas, this.config);\n        }\n        this.analyze('End Segmentation:');\n      }\n\n      if (!process || !process.tensor) {\n        log('could not convert input to tensor');\n        resolve({ error: 'could not convert input to tensor' });\n        return;\n      }\n\n      timeStamp = now();\n      this.config.skipFrame = await this.#skipFrame(process.tensor);\n      if (!this.performance.frames) this.performance.frames = 0;\n      if (!this.performance.cached) this.performance.cached = 0;\n      (this.performance.frames as number)++;\n      if (this.config.skipFrame) this.performance.cached++;\n      this.performance.changed = Math.trunc(now() - timeStamp);\n      this.analyze('Check Changed:');\n\n      // prepare where to store model results\n      // keep them with weak typing as it can be promise or not\n      let faceRes;\n      let bodyRes;\n      let handRes;\n      let objectRes;\n\n      // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n      if (this.config.async) {\n        faceRes = this.config.face.enabled ? face.detectFace(this, process.tensor) : [];\n        if (this.performance.face) delete this.performance.face;\n      } else {\n        this.state = 'run:face';\n        timeStamp = now();\n        faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n        elapsedTime = Math.trunc(now() - timeStamp);\n        if (elapsedTime > 0) this.performance.face = elapsedTime;\n      }\n\n      // run body: can be posenet, blazepose, efficientpose, movenet\n      this.analyze('Start Body:');\n      if (this.config.async) {\n        if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(process.tensor, this.config) : [];\n        else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(process.tensor, this.config) : [];\n        else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? efficientpose.predict(process.tensor, this.config) : [];\n        else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? movenet.predict(process.tensor, this.config) : [];\n        if (this.performance.body) delete this.performance.body;\n      } else {\n        this.state = 'run:body';\n        timeStamp = now();\n        if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(process.tensor, this.config) : [];\n        else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(process.tensor, this.config) : [];\n        else if (this.config.body.modelPath.includes('efficientpose')) bodyRes = this.config.body.enabled ? await efficientpose.predict(process.tensor, this.config) : [];\n        else if (this.config.body.modelPath.includes('movenet')) bodyRes = this.config.body.enabled ? await movenet.predict(process.tensor, this.config) : [];\n        elapsedTime = Math.trunc(now() - timeStamp);\n        if (elapsedTime > 0) this.performance.body = elapsedTime;\n      }\n      this.analyze('End Body:');\n\n      // run handpose\n      this.analyze('Start Hand:');\n      if (this.config.async) {\n        handRes = this.config.hand.enabled ? handpose.predict(process.tensor, this.config) : [];\n        if (this.performance.hand) delete this.performance.hand;\n      } else {\n        this.state = 'run:hand';\n        timeStamp = now();\n        handRes = this.config.hand.enabled ? await handpose.predict(process.tensor, this.config) : [];\n        elapsedTime = Math.trunc(now() - timeStamp);\n        if (elapsedTime > 0) this.performance.hand = elapsedTime;\n      }\n      this.analyze('End Hand:');\n\n      // run nanodet\n      this.analyze('Start Object:');\n      if (this.config.async) {\n        if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(process.tensor, this.config) : [];\n        else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(process.tensor, this.config) : [];\n        if (this.performance.object) delete this.performance.object;\n      } else {\n        this.state = 'run:object';\n        timeStamp = now();\n        if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(process.tensor, this.config) : [];\n        else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(process.tensor, this.config) : [];\n        elapsedTime = Math.trunc(now() - timeStamp);\n        if (elapsedTime > 0) this.performance.object = elapsedTime;\n      }\n      this.analyze('End Object:');\n\n      // if async wait for results\n      if (this.config.async) [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n\n      // run gesture analysis last\n      let gestureRes: Gesture[] = [];\n      if (this.config.gesture.enabled) {\n        timeStamp = now();\n        gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];\n        if (!this.config.async) this.performance.gesture = Math.trunc(now() - timeStamp);\n        else if (this.performance.gesture) delete this.performance.gesture;\n      }\n\n      this.performance.total = Math.trunc(now() - timeStart);\n      this.state = 'idle';\n      this.result = {\n        face: faceRes,\n        body: bodyRes,\n        hand: handRes,\n        gesture: gestureRes,\n        object: objectRes,\n        performance: this.performance,\n        canvas: process.canvas,\n        timestamp: Date.now(),\n        get persons() { return persons.join(faceRes, bodyRes, handRes, gestureRes, process?.tensor?.shape); },\n      };\n\n      // finally dispose input tensor\n      tf.dispose(process.tensor);\n\n      // log('Result:', result);\n      resolve(this.result);\n    });\n  }\n\n  /** @hidden */\n  #warmupBitmap = async () => {\n    const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n    let blob;\n    let res;\n    switch (this.config.warmup) {\n      case 'face': blob = await b64toBlob(sample.face); break;\n      case 'full': blob = await b64toBlob(sample.body); break;\n      default: blob = null;\n    }\n    if (blob) {\n      const bitmap = await createImageBitmap(blob);\n      res = await this.detect(bitmap, this.config);\n      bitmap.close();\n    }\n    return res;\n  }\n\n  /** @hidden */\n  #warmupCanvas = async () => new Promise((resolve) => {\n    let src;\n    let size = 0;\n    switch (this.config.warmup) {\n      case 'face':\n        size = 256;\n        src = 'data:image/jpeg;base64,' + sample.face;\n        break;\n      case 'full':\n      case 'body':\n        size = 1200;\n        src = 'data:image/jpeg;base64,' + sample.body;\n        break;\n      default:\n        src = null;\n    }\n    // src = encodeURI('../assets/human-sample-upper.jpg');\n    const img = new Image();\n    img.onload = async () => {\n      const canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(size, size) : document.createElement('canvas');\n      canvas.width = img.naturalWidth;\n      canvas.height = img.naturalHeight;\n      const ctx = canvas.getContext('2d');\n      ctx?.drawImage(img, 0, 0);\n      // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n      const res = await this.detect(canvas, this.config);\n      resolve(res);\n    };\n    if (src) img.src = src;\n    else resolve(null);\n  });\n\n  /** @hidden */\n  #warmupNode = async () => {\n    const atob = (str) => Buffer.from(str, 'base64');\n    let img;\n    if (this.config.warmup === 'face') img = atob(sample.face);\n    if (this.config.warmup === 'body' || this.config.warmup === 'full') img = atob(sample.body);\n    if (!img) return null;\n    let res;\n    if (typeof tf['node'] !== 'undefined') {\n      const data = tf['node'].decodeJpeg(img);\n      const expanded = data.expandDims(0);\n      this.tf.dispose(data);\n      // log('Input:', expanded);\n      res = await this.detect(expanded, this.config);\n      this.tf.dispose(expanded);\n    } else {\n      if (this.config.debug) log('Warmup tfjs-node not loaded');\n      /*\n      const input = await canvasJS.loadImage(img);\n      const canvas = canvasJS.createCanvas(input.width, input.height);\n      const ctx = canvas.getContext('2d');\n      ctx.drawImage(img, 0, 0, input.width, input.height);\n      res = await this.detect(input, this.config);\n      */\n    }\n    return res;\n  }\n\n  /** Warmup method pre-initializes all configured models for faster inference\n   * - can take significant time on startup\n   * - only used for `webgl` and `humangl` backends\n   * @param userConfig?: Config\n  */\n  async warmup(userConfig?: Config | Record<string, unknown>): Promise<Result | { error }> {\n    const t0 = now();\n    if (userConfig) this.config = mergeDeep(this.config, userConfig) as Config;\n    if (!this.config.warmup || this.config.warmup === 'none') return { error: 'null' };\n    let res;\n    if (typeof createImageBitmap === 'function') res = await this.#warmupBitmap();\n    else if (typeof Image !== 'undefined') res = await this.#warmupCanvas();\n    else res = await this.#warmupNode();\n    const t1 = now();\n    if (this.config.debug) log('Warmup', this.config.warmup, Math.round(t1 - t0), 'ms', res);\n    return res;\n  }\n}\n\n/**\n * Class Human is also available as default export\n */\nexport { Human as default };\n"],
  "mappings": "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mB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,iBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,iBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,cAAgB,kBACjB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,mBAGT,GAAS,CACpB,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,EACtJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GACrJ,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAC7I,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAClJ,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GACrJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GACpJ,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GACjJ,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAC/I,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,GAAI,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GACtJ,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAClJ,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACnJ,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,IAClJ,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GACnJ,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI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,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAC9I,IAAK,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACj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,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,QAAU,EAAG,SAClB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,OAAS,EAAG,QACjB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,OAChB,CAAE,EAAG,MAAQ,EAAG,QC33FX,YAAmB,CAQxB,YAAY,EAAO,CAbrB,MAcI,KAAK,MAAQ,EACb,KAAK,QAAU,AAAQ,GAAQ,IAAI,AAAC,GAAW,CAAC,EAAO,EAAG,EAAO,IACjE,KAAK,cAAgB,AAAG,WAAS,KAAK,SAEtC,KAAK,UAAY,QAAK,QAAL,cAAY,OAAO,GAAG,MAAM,GAC7C,KAAK,gBAAkB,AAAG,WAAS,CAAC,KAAK,UAAW,KAAK,YACzD,KAAK,sBAAwB,AAAG,WAAS,CAAC,KAAK,UAAY,EAAG,KAAK,UAAY,IAGjF,eAAe,EAAO,CACpB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAa,AAAG,QAAM,EAAO,CAAC,EAAG,GAAI,CAAC,GAAI,IAC1C,EAAW,AAAG,QAAM,EAAO,CAAC,EAAG,GAAI,CAAC,GAAI,IACxC,EAAkB,AAAG,MAAI,AAAG,MAAI,EAAY,KAAK,iBAAkB,KAAK,eACxE,EAAe,AAAG,MAAI,EAAU,KAAK,uBACrC,EAAc,AAAG,MAAI,AAAG,MAAI,EAAiB,GAAe,KAAK,iBACjE,EAAY,AAAG,MAAI,AAAG,MAAI,EAAiB,GAAe,KAAK,iBACrE,MAAO,AAAG,YAAS,CAAC,EAAa,GAAY,KAIjD,mBAAmB,EAAkB,EAAO,CAC1C,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAY,AAAG,MAAI,AAAG,MAAI,AAAG,UAAQ,EAAkB,CAAC,GAAI,EAAG,IAAK,KAAK,iBAAkB,KAAK,QAAQ,IAC9G,MAAO,AAAG,OAAI,EAAW,KAAK,wBAI5B,UAAS,EAAO,EAAQ,CAC5B,GAAM,GAAU,KAAK,MAAM,QAAQ,GAC7B,EAAc,AAAG,UAAQ,GAC/B,AAAG,UAAQ,GACX,GAAM,GAAU,AAAG,OAAK,IAAM,AAAG,UAAQ,AAAG,UAAQ,AAAG,QAAM,EAAa,CAAC,EAAG,GAAI,CAAC,GAAI,OACjF,EAAS,KAAM,GAAQ,OACvB,EAAW,AAAG,QAAM,EAAa,CAAC,EAAG,GAAI,CAAC,GAAI,IAC9C,EAAQ,KAAK,eAAe,GAClC,AAAG,UAAQ,GACX,GAAM,GAAY,KAAM,AAAG,SAAM,uBAAuB,EAAO,EAAQ,EAAO,KAAK,YAAa,EAAO,KAAK,aAAc,EAAO,KAAK,eAChI,EAAW,KAAM,GAAU,QAEjC,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,GAAM,GAA2E,GACjF,OAAW,KAAS,GAClB,GAAI,EAAO,IAAU,EAAO,KAAK,cAAe,CAC9C,GAAM,GAAc,AAAG,QAAM,EAAO,CAAC,EAAO,GAAI,CAAC,EAAG,KAC9C,EAAmB,AAAG,QAAM,EAAa,CAAC,EAAO,GAAI,CAAC,EAAG,KACzD,EAAgB,AAAG,OAAK,IAAM,AAAG,UAAQ,KAAK,mBAAmB,EAAkB,GAAQ,CAAC,GAAI,KACtG,AAAG,UAAQ,GACX,EAAM,KAAK,CAAE,IAAK,EAAa,gBAAe,WAAY,EAAO,KAGrE,MAAG,WAAQ,GACX,AAAG,UAAQ,GACJ,OAGH,oBAAmB,EAAO,EAA8G,CAC5I,GAAM,GAAc,EAAM,MAAM,GAC1B,EAAa,EAAM,MAAM,GACzB,EAAQ,AAAG,OAAK,IAAM,AAAG,MAAI,AAAG,MAAI,AAAG,QAAM,eAAe,EAAO,CAAC,KAAK,UAAW,KAAK,YAAa,OAAQ,IAC9G,EAAc,KAAM,MAAK,SAAS,EAAO,GAC/C,AAAG,UAAQ,GACX,GAAM,GAA0G,GAChH,GAAI,CAAC,GAAe,EAAY,SAAW,EAAG,MAAO,GACrD,OAAW,KAAc,GAAa,CACpC,GAAM,GAAQ,KAAM,GAAW,IAAI,OAC7B,EAAa,EAAM,MAAM,EAAG,GAC5B,EAAW,EAAM,MAAM,EAAG,GAC1B,EAAgB,KAAM,GAAW,cAAc,QACrD,AAAG,UAAQ,EAAW,KACtB,AAAG,UAAQ,EAAW,eACtB,EAAM,KAAK,AAAI,GAAoB,CAAE,aAAY,WAAU,gBAAe,WAAY,EAAW,YAAc,CAAC,EAAa,KAAK,UAAW,EAAc,KAAK,aAElK,MAAO,KCxFJ,YAA0B,EAAO,CACtC,MAAO,GAAQ,EAAI,KAAK,GAAK,KAAK,MAAO,GAAQ,KAAK,IAAO,GAAI,KAAK,KAGjE,YAAyB,EAAQ,EAAQ,CAC9C,GAAM,GAAU,KAAK,GAAK,EAAI,KAAK,MAAM,CAAE,GAAO,GAAK,EAAO,IAAK,EAAO,GAAK,EAAO,IACtF,MAAO,IAAiB,GAGnB,GAAM,IAAyB,CAAC,EAAG,IAAM,CAAC,CAAC,EAAG,EAAG,GAAI,CAAC,EAAG,EAAG,GAAI,CAAC,EAAG,EAAG,IAEvE,YAAa,EAAI,EAAI,CAC1B,GAAI,GAAU,EACd,OAAS,GAAI,EAAG,EAAI,EAAG,OAAQ,IAC7B,GAAW,EAAG,GAAK,EAAG,GAExB,MAAO,GAGF,YAA4B,EAAK,EAAa,CACnD,GAAM,GAAwB,GAC9B,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAC9B,EAAO,KAAK,EAAI,GAAG,IAErB,MAAO,GAGF,YAAmC,EAAM,EAAM,CACpD,GAAM,GAA2B,GAC3B,EAAO,EAAK,OAClB,OAAS,GAAM,EAAG,EAAM,EAAM,IAAO,CACnC,EAAQ,KAAK,IACb,OAAS,GAAM,EAAG,EAAM,EAAM,IAC5B,EAAQ,GAAK,KAAK,GAAI,EAAK,GAAM,GAAmB,EAAM,KAG9D,MAAO,GAGF,YAA6B,EAAU,EAAQ,CACpD,GAAM,GAAO,KAAK,IAAI,GAChB,EAAO,KAAK,IAAI,GAChB,EAAiB,CAAC,CAAC,EAAM,CAAC,EAAM,GAAI,CAAC,EAAM,EAAM,GAAI,CAAC,EAAG,EAAG,IAC5D,EAAoB,GAAuB,EAAO,GAAI,EAAO,IAC7D,EAA2B,GAA0B,EAAmB,GACxE,EAA4B,GAAuB,CAAC,EAAO,GAAI,CAAC,EAAO,IAC7E,MAAO,IAA0B,EAA0B,GAGtD,YAA+B,EAAQ,CAC5C,GAAM,GAAoB,CAAC,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,IAAK,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,KAC5E,EAAuB,CAAC,EAAO,GAAG,GAAI,EAAO,GAAG,IAChD,EAAsB,CAC1B,CAAC,GAAI,EAAkB,GAAI,GAC3B,CAAC,GAAI,EAAkB,GAAI,IAE7B,MAAO,CACL,EAAkB,GAAG,OAAO,EAAoB,IAChD,EAAkB,GAAG,OAAO,EAAoB,IAChD,CAAC,EAAG,EAAG,IAIJ,YAAqB,EAAuB,EAAgB,CACjE,MAAO,CACL,GAAI,EAAuB,EAAe,IAC1C,GAAI,EAAuB,EAAe,KC5D9C,GAAM,IAAuB,EACvB,GAAuB,KACvB,GAAkB,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GACvC,GAAwB,EACxB,GAAgC,EAE/B,QAAmB,CAQxB,YAAY,EAAc,EAAe,CApB3C,MAqBI,KAAK,aAAe,EACpB,KAAK,cAAgB,EAErB,KAAK,UAAY,QAAK,gBAAL,cAAoB,OAAO,GAAG,MAAM,GACrD,KAAK,YAAc,GACnB,KAAK,QAAU,EACf,KAAK,cAAgB,EAIvB,8BAA8B,EAAW,CACvC,GAAM,GAAK,EAAU,IAAI,AAAC,GAAM,EAAE,IAC5B,EAAK,EAAU,IAAI,AAAC,GAAM,EAAE,IAC5B,EAAa,CAAC,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,IAC3C,EAAW,CAAC,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,IAC/C,MAAO,CAAE,aAAY,YAGvB,uBAAuB,EAAe,EAAgB,CACpD,GAAM,GAAuB,EAAc,IAAI,AAAC,GAAU,AAAK,GAAY,CAAC,GAAG,EAAO,GAAI,IACpF,EAAgB,KAAK,8BAA8B,GACzD,MAAO,AAAI,IAAW,AAAI,GAAY,GAAgB,IAGxD,uBAAuB,EAAW,CAChC,GAAM,GAAc,KAAK,8BAA8B,GACjD,EAAgB,AAAI,GAAW,AAAI,GAAY,GAAc,IACnE,EAAc,cAAgB,GAC9B,OAAS,GAAI,EAAG,EAAI,GAAgB,OAAQ,IAC1C,EAAc,cAAc,KAAK,EAAU,GAAgB,IAAI,MAAM,EAAG,IAE1E,MAAO,GAGT,mBAAmB,EAAW,EAAM,EAAO,EAAgB,CACzD,GAAM,GAAU,AAAI,GAAW,GACzB,EAAc,CAAC,EAAQ,GAAK,KAAK,UAAW,EAAQ,GAAK,KAAK,UAAY,GAAQ,GAAK,EAAQ,IAAM,KAAK,UAAY,GACtH,EAAe,EAAU,IAAI,AAAC,GAAU,CAC5C,EAAY,GAAM,GAAM,GAAK,KAAK,UAAY,GAC9C,EAAY,GAAM,GAAM,GAAK,KAAK,UAAY,GAC9C,EAAY,GAAK,EAAM,KAEnB,EAAuB,AAAK,GAAoB,EAAO,CAAC,EAAG,IAC3D,EAAgB,EAAa,IAAI,AAAC,GAE/B,CAAC,GADQ,AAAK,GAAY,EAAO,GACpB,EAAM,KAEtB,EAAwB,AAAK,GAAsB,GACnD,EAAY,CAAC,GAAG,AAAI,GAAa,GAAO,GACxC,EAAoB,CACxB,AAAK,GAAI,EAAW,EAAsB,IAC1C,AAAK,GAAI,EAAW,EAAsB,KAE5C,MAAO,GAAc,IAAI,AAAC,GAAU,CAClC,KAAK,MAAM,EAAM,GAAK,EAAkB,IACxC,KAAK,MAAM,EAAM,GAAK,EAAkB,IACxC,KAAK,MAAM,EAAM,WAIf,eAAc,EAAO,EAAQ,CACjC,GAAI,GAAc,GAGd,EAGJ,AAAK,MAAK,UAAY,GAAO,KAAK,QAAU,EAAO,KAAK,YAAe,CAAC,EAAO,KAAK,WAAa,CAAC,EAAO,YACvG,GAAQ,KAAM,MAAK,aAAa,mBAAmB,EAAO,GAC1D,KAAK,QAAU,GAEb,EAAO,WAAW,KAAK,UAGvB,GAAU,EAAM,OAAS,GAAQ,GAAM,SAAW,KAAK,eAAmB,KAAK,gBAAkB,EAAO,KAAK,aAAgB,CAAC,EAAO,KAAK,YAC5I,MAAK,cAAgB,EACrB,KAAK,YAAc,CAAC,GAAG,GAEnB,KAAK,YAAY,OAAS,GAAG,GAAc,KAEjD,GAAM,GAAgH,GAGtH,OAAS,GAAI,EAAG,EAAI,KAAK,YAAY,OAAQ,IAAK,CAChD,GAAM,GAAa,KAAK,YAAY,GACpC,GAAI,EAAC,EACL,GAAI,EAAO,KAAK,UAAW,CACzB,GAAM,GAAQ,EAAO,KAAK,SAAW,AAAK,GAAgB,EAAW,cAAc,IAAwB,EAAW,cAAc,KAAkC,EAChK,EAAa,AAAI,GAAa,GAC9B,EAAuB,CAAC,EAAW,GAAK,EAAM,MAAM,GAAI,EAAW,GAAK,EAAM,MAAM,IACpF,EAAe,EAAO,KAAK,UAAY,AAAG,MAAI,MAAM,WAAa,AAAG,QAAM,iBAAiB,EAAO,EAAO,EAAG,GAAwB,EAAM,QAC1I,EAAiB,AAAK,GAAoB,CAAC,EAAO,GAClD,EAAS,EAAc,KAAK,uBAAuB,EAAW,cAAe,GAAkB,EAC/F,EAAe,AAAI,GAAyB,EAAQ,EAAc,CAAC,KAAK,UAAW,KAAK,YACxF,EAAY,AAAG,MAAI,EAAc,KACvC,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,GAAM,CAAC,EAAa,GAAa,KAAM,MAAK,cAAc,QAAQ,GAClE,AAAG,UAAQ,GACX,GAAM,GAAa,EAAY,WAAW,GAE1C,GADA,AAAG,UAAQ,GACP,GAAc,EAAO,KAAK,cAAe,CAC3C,GAAM,GAAoB,AAAG,UAAQ,EAAW,CAAC,GAAI,IAC/C,EAAY,KAAM,GAAkB,QAC1C,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,GAAM,GAAS,KAAK,mBAAmB,EAAW,EAAQ,EAAO,GAC3D,EAAkB,KAAK,uBAAuB,GACpD,KAAK,YAAY,GAAK,IAAK,EAAiB,cAC5C,GAAM,GAAS,CACb,UAAW,EACX,aACA,IAAK,CAAE,QAAS,EAAgB,WAAY,YAAa,EAAgB,WAE3E,EAAM,KAAK,OAEX,MAAK,YAAY,GAAK,KAExB,AAAG,UAAQ,OACN,CAEL,GAAM,GAAW,AAAI,GAAW,AAAI,GAAY,GAAa,IACvD,EAAS,CACb,WAAY,EAAW,WACvB,IAAK,CAAE,QAAS,EAAS,WAAY,YAAa,EAAS,WAE7D,EAAM,KAAK,IAGf,YAAK,YAAc,KAAK,YAAY,OAAO,AAAC,GAAM,IAAM,MACxD,KAAK,cAAgB,EAAM,OACpB,IC5IX,GAAM,IAAkB,CACtB,MAAO,CAAC,EAAG,EAAG,EAAG,GACjB,YAAa,CAAC,EAAG,EAAG,EAAG,GACvB,aAAc,CAAC,EAAG,GAAI,GAAI,IAC1B,WAAY,CAAC,GAAI,GAAI,GAAI,IACzB,MAAO,CAAC,GAAI,GAAI,GAAI,IACpB,SAAU,CAAC,IAGT,GACA,GACA,GAEJ,kBAA8B,EAAe,EAAiC,CAC5E,GAAM,GAAc,KAAM,IAAa,cAAc,EAAO,GAC5D,GAAI,CAAC,EAAa,MAAO,GACzB,GAAM,GAAqB,GAC3B,OAAS,GAAI,EAAG,EAAI,EAAY,OAAQ,IAAK,CAC3C,GAAM,GAAc,GACpB,GAAI,EAAY,GAAG,UACjB,OAAW,KAAO,QAAO,KAAK,IAE5B,EAAY,GAAO,GAAgB,GAAK,IAAI,AAAC,GAAU,EAAY,GAAG,UAAU,IAIpF,GAAM,GAAY,EAAY,GAAG,UAE7B,EAAwC,CAAC,OAAO,iBAAkB,OAAO,iBAAkB,EAAG,GAC9F,EAA2C,CAAC,EAAG,EAAG,EAAG,GACzD,GAAI,GAAa,EAAU,OAAS,EAAG,CACrC,OAAW,KAAM,GACf,AAAI,EAAG,GAAK,EAAI,IAAI,GAAI,GAAK,EAAG,IAC5B,EAAG,GAAK,EAAI,IAAI,GAAI,GAAK,EAAG,IAC5B,EAAG,GAAK,EAAI,IAAI,GAAI,GAAK,EAAG,IAC5B,EAAG,GAAK,EAAI,IAAI,GAAI,GAAK,EAAG,IAElC,EAAI,IAAM,EAAI,GACd,EAAI,IAAM,EAAI,GACd,EAAS,CAAC,EAAI,GAAM,GAAM,MAAM,IAAM,GAAI,EAAI,GAAM,GAAM,MAAM,IAAM,GAAI,EAAI,GAAM,GAAM,MAAM,IAAM,GAAI,EAAI,GAAM,GAAM,MAAM,IAAM,QAEtI,GAAM,EAAY,GAAG,IAAM,CACzB,KAAK,MAAM,KAAK,IAAI,EAAG,EAAY,GAAG,IAAI,QAAQ,KAClD,KAAK,MAAM,KAAK,IAAI,EAAG,EAAY,GAAG,IAAI,QAAQ,KAClD,KAAK,MAAM,KAAK,IAAK,EAAM,MAAM,IAAM,EAAI,EAAY,GAAG,IAAI,YAAY,IAAM,KAAK,IAAI,EAAG,EAAY,GAAG,IAAI,QAAQ,KACvH,KAAK,MAAM,KAAK,IAAK,EAAM,MAAM,IAAM,EAAI,EAAY,GAAG,IAAI,YAAY,IAAM,KAAK,IAAI,EAAG,EAAY,GAAG,IAAI,QAAQ,MACrH,CAAC,EAAG,EAAG,EAAG,GACd,EAAS,CACN,EAAY,GAAG,IAAI,QAAQ,GAAO,GAAM,MAAM,IAAM,GACpD,EAAY,GAAG,IAAI,QAAQ,GAAO,GAAM,MAAM,IAAM,GACpD,GAAY,GAAG,IAAI,YAAY,GAAK,EAAY,GAAG,IAAI,QAAQ,IAAO,GAAM,MAAM,IAAM,GACxF,GAAY,GAAG,IAAI,YAAY,GAAK,EAAY,GAAG,IAAI,QAAQ,IAAO,GAAM,MAAM,IAAM,IAG7F,EAAM,KAAK,CAAE,GAAI,EAAG,MAAO,KAAK,MAAM,IAAM,EAAY,GAAG,YAAc,IAAK,MAAK,SAAQ,YAAW,gBAExG,MAAO,GAGT,kBAA2B,EAAiE,CAC1F,AAAI,CAAC,IAAqB,CAAC,GAEzB,EAAC,GAAmB,IAAiB,KAAM,SAAQ,IAAI,CACrD,EAAO,KAAK,QAAU,AAAG,iBAAe,EAAK,EAAO,cAAe,EAAO,KAAK,SAAS,WAAY,CAAE,UAAW,EAAO,KAAK,SAAS,UAAU,SAAS,eAAkB,KAC3K,EAAO,KAAK,UAAY,AAAG,iBAAe,EAAK,EAAO,cAAe,EAAO,KAAK,SAAS,WAAY,CAAE,UAAW,EAAO,KAAK,SAAS,UAAU,SAAS,eAAkB,OAE3K,EAAO,KAAK,SACd,CAAI,CAAC,IAAqB,CAAC,GAAkB,SAAa,EAAI,qBAAsB,EAAO,KAAK,SAAS,WAChG,EAAO,OAAO,EAAI,cAAe,GAAkB,UAC5D,AAAI,CAAC,IAAiB,CAAC,GAAc,SAAa,EAAI,qBAAsB,EAAO,KAAK,SAAS,WACxF,EAAO,OAAO,EAAI,cAAe,GAAc,YAGtD,GAAO,OAAO,EAAI,gBAAiB,GAAkB,UACrD,EAAO,OAAO,EAAI,gBAAiB,GAAc,WAEvD,GAAM,GAAe,GAAiB,IAAa,IACnD,UAAe,GAAiB,IAAa,EAAc,IACpD,CAAC,GAAmB,IC1FtB,GAAM,IAAO,CAClB,OACA,gBACA,UACA,iBACA,iBACA,WACA,kBACA,UACA,WACA,YACA,aACA,eACA,gBACA,YACA,aACA,YACA,aACA,WACA,YACA,YACA,aACA,YACA,aACA,UACA,WACA,WACA,YACA,YACA,aACA,WACA,YACA,WACA,YACA,SACA,WACA,YACA,WACA,aACA,aAGW,GAAQ,CACnB,OACA,gBACA,UACA,iBACA,iBACA,WACA,kBACA,UACA,WACA,YACA,aACA,eACA,gBACA,YACA,aACA,UACA,WACA,UACA,WACA,UACA,WACA,UACA,WACA,YACA,aACA,OACA,WACA,UACA,WACA,UACA,YC5DF,GAAI,GAEJ,kBAA2B,EAAqC,CAC9D,MAAK,GAOM,EAAO,OAAO,EAAI,gBAAiB,EAAM,UALlD,GAAQ,KAAM,AAAG,kBAAe,EAAK,EAAO,cAAe,EAAO,KAAK,YACvE,EAAM,MAAW,SAAS,EAAM,UAAa,OAAO,aAAa,YAAY,IAAI,GAAG,MACpF,EAAM,OAAY,SAAS,EAAM,UAAa,OAAO,aAAa,YAAY,IAAI,GAAG,MACrF,AAAI,CAAC,GAAS,CAAC,EAAM,SAAa,EAAI,qBAAsB,EAAO,KAAK,WAC/D,EAAO,OAAO,EAAI,cAAe,EAAM,WAE3C,EAGT,kBAA8B,EAAe,EAAiC,CAC5E,GAAI,CAAC,EAAO,MAAO,GACnB,GAAI,CAAC,EAAO,KAAK,QAAS,MAAO,GACjC,GAAM,GAAU,CAAE,MAAQ,EAAM,MAAM,IAAM,EAAI,OAAS,EAAM,MAAM,IAAM,GACrE,EAAS,AAAG,QAAM,eAAe,EAAO,CAAC,EAAM,MAAU,EAAM,QAAY,IAC3E,EAAY,AAAG,MAAI,EAAQ,CAAC,MAClC,AAAG,UAAQ,GACX,GAAM,GAAO,KAAM,GAAM,QAAQ,GAC3B,EAAQ,EAAK,KAAK,AAAC,GAAO,EAAE,OAAS,KAAO,EAAE,OAAS,KACvD,EAAS,KAAM,kBAAO,SAAU,GACtC,EAAK,QAAQ,AAAC,GAAM,AAAG,UAAQ,IAC/B,AAAG,UAAQ,GACX,GAAM,GAA6H,GAC7H,EAAS,kBAAQ,UAAW,IAAkB,GAAmB,GACjE,EAAQ,EACd,OAAS,GAAI,EAAG,EAAI,EAAO,OAAS,EAAO,IACzC,EAAU,KAAK,CACb,GAAI,EACJ,KAAM,EAAO,GACb,SAAU,CACR,KAAK,MAAM,EAAQ,MAAQ,EAAO,EAAQ,EAAI,GAAK,KACnD,KAAK,MAAM,EAAQ,OAAS,EAAO,EAAQ,EAAI,GAAK,KACpD,KAAK,MAAM,EAAO,EAAQ,EAAI,IAAM,GAEtC,YAAa,CACX,EAAO,EAAQ,EAAI,GAAK,IACxB,EAAO,EAAQ,EAAI,GAAK,IACxB,EAAO,EAAQ,EAAI,GAAK,GAE1B,MAAQ,KAAM,KAAK,MAAM,IAAO,GAAI,KAAK,IAAI,EAAO,EAAQ,EAAI,OAAS,IACzE,SAAW,KAAM,KAAK,MAAM,IAAO,GAAI,KAAK,IAAI,EAAO,EAAQ,EAAI,OAAS,MAGhF,GAAM,GAAI,EAAU,IAAI,AAAC,GAAM,EAAE,SAAS,IACpC,EAAI,EAAU,IAAI,AAAC,GAAM,EAAE,SAAS,IACpC,EAAwC,CAC5C,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,GAC7B,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,IAEzB,EAA2C,CAAC,EAAG,EAAG,EAAG,GACrD,EAAQ,EAAU,OAAO,CAAC,EAAM,IAAU,EAAK,MAAQ,EAAO,EAAK,MAAQ,EAAO,GACxF,MAAO,CAAC,CAAE,GAAI,EAAG,QAAO,MAAK,SAAQ,cC5DvC,GAAI,GAIE,GAA8B,GAChC,GAAwC,CAAC,EAAG,EAAG,EAAG,GAClD,GAA2C,CAAC,EAAG,EAAG,EAAG,GACrD,GAAQ,EACR,GAAU,OAAO,iBAEf,GAAY,CAAC,OAAQ,OAAQ,gBAAiB,aAAc,aAAc,QAAS,eAAgB,YAAa,YAAa,SAAU,WAAY,YAAa,aAAc,UAAW,WAAY,aAE3M,kBAA2B,EAAqC,CAC9D,MAAK,GAKM,EAAO,OAAO,EAAI,gBAAiB,EAAM,UAHlD,GAAQ,KAAM,AAAG,kBAAe,EAAK,EAAO,cAAe,EAAO,KAAK,YACvE,AAAI,CAAC,GAAS,CAAC,EAAM,SAAa,EAAI,qBAAsB,EAAO,KAAK,WAC/D,EAAO,OAAO,EAAI,cAAe,EAAM,WAE3C,EAIT,YAAe,EAAQ,EAAU,CAC/B,GAAM,CAAC,EAAO,GAAU,EAAO,MAC/B,MAAO,AAAG,QAAK,IAAM,CAEnB,GAAM,GAAM,CAAC,EAAG,IAAM,AAAG,MAAI,EAAG,AAAG,MAAI,AAAG,MAAI,EAAG,AAAG,SAAO,EAAG,UAAW,AAAG,SAAO,EAAG,WAEhF,EAAW,AAAG,UAAQ,EAAQ,CAAC,EAAS,IAExC,EAAW,AAAG,MAAI,EAAU,GAAG,WAAW,GAChD,GAAI,EAAW,EAAU,CAEvB,GAAM,GAAS,AAAG,SAAO,EAAU,GAC7B,EAAI,EAAI,EAAQ,GAAO,WAAW,GAClC,EAAI,AAAG,MAAI,EAAQ,AAAG,SAAO,EAAO,UAAU,WAAW,GAC/D,MAAO,CAAC,EAAG,EAAG,GAEhB,MAAO,CAAC,EAAG,EAAG,KAIlB,kBAA8B,EAAe,EAAiC,CAC5E,MAAK,IAAU,EAAO,KAAK,YAAe,EAAO,WAAa,OAAO,KAAK,IAAW,OAAS,EAC5F,MACO,CAAC,CAAE,GAAI,EAAG,SAAO,OAAK,UAAQ,gBAEvC,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAM,GAAS,AAAG,OAAK,IAAM,CAC3B,GAAI,CAAC,EAAM,OAAO,GAAG,MAAO,MAAO,MACnC,GAAM,GAAS,AAAG,QAAM,eAAe,EAAO,CAAC,EAAM,OAAO,GAAG,MAAM,GAAI,EAAM,OAAO,GAAG,MAAM,IAAK,IAGpG,MADa,AADG,AAAG,OAAI,EAAQ,GACV,IAAI,KAIvB,EAIJ,GAHI,EAAO,KAAK,SAAS,GAAO,KAAM,GAAM,QAAQ,IACpD,AAAG,UAAQ,GAEP,EAAM,CACR,GAAU,OAAS,EACnB,GAAM,GAAU,EAAK,UACrB,AAAG,UAAQ,GAEX,GAAM,GAAQ,EAAQ,QAAQ,GAC9B,AAAG,UAAQ,GAEX,OAAS,GAAK,EAAG,EAAK,EAAM,OAAQ,IAAM,CAExC,GAAM,CAAC,EAAG,EAAG,GAAa,GAAM,EAAM,GAAK,EAAO,KAAK,eACvD,AAAI,GAAQ,EAAO,KAAK,eACtB,GAAU,KAAK,CACb,MAAO,KAAK,MAAM,IAAM,GAAa,IACrC,KAAM,GAAU,GAChB,YAAa,CAEX,EAAI,EAAM,OAAO,GAAG,MAAM,GAAI,EAAI,EAAM,OAAO,GAAG,MAAM,IAE1D,SAAU,CAER,KAAK,MAAM,EAAM,MAAM,GAAK,EAAI,EAAM,OAAO,GAAG,MAAM,IAAK,KAAK,MAAM,EAAM,MAAM,GAAK,EAAI,EAAM,OAAO,GAAG,MAAM,OAKzH,EAAM,QAAQ,AAAC,GAAM,AAAG,UAAQ,IAElC,GAAQ,GAAU,OAAO,CAAC,EAAM,IAAU,EAAK,MAAQ,EAAO,EAAK,MAAQ,EAAO,GAClF,GAAM,GAAI,GAAU,IAAI,AAAC,GAAM,EAAE,SAAS,IACpC,EAAI,GAAU,IAAI,AAAC,GAAM,EAAE,SAAS,IAC1C,GAAM,CACJ,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,GAC7B,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,IAE/B,GAAM,GAAO,GAAU,IAAI,AAAC,GAAM,EAAE,YAAY,IAC1C,EAAO,GAAU,IAAI,AAAC,GAAM,EAAE,YAAY,IAChD,GAAS,CACP,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GAAQ,KAAK,IAAI,GAAG,GAChC,KAAK,IAAI,GAAG,GAAQ,KAAK,IAAI,GAAG,IAElC,EAAQ,CAAC,CAAE,GAAI,EAAG,SAAO,OAAK,UAAQ,mBC3G1C,GAAI,IAIE,GAA8B,GAChC,GAAwC,CAAC,EAAG,EAAG,EAAG,GAClD,GAA2C,CAAC,EAAG,EAAG,EAAG,GACrD,GAAQ,EACR,GAAU,OAAO,iBAEf,GAAY,CAAC,OAAQ,UAAW,WAAY,UAAW,WAAY,eAAgB,gBAAiB,YAAa,aAAc,YAAa,aAAc,UAAW,WAAY,WAAY,YAAa,YAAa,cAE7N,kBAA2B,EAAqC,CAC9D,MAAK,IAKM,EAAO,OAAO,EAAI,gBAAiB,GAAM,UAHlD,IAAQ,KAAM,AAAG,kBAAe,EAAK,EAAO,cAAe,EAAO,KAAK,YACvE,AAAI,CAAC,IAAS,CAAC,GAAM,SAAa,EAAI,qBAAsB,EAAO,KAAK,WAC/D,EAAO,OAAO,EAAI,cAAe,GAAM,WAE3C,GAGT,kBAA8B,EAAe,EAAiC,CAC5E,MAAK,IAAU,EAAO,KAAK,YAAe,EAAO,WAAa,OAAO,KAAK,IAAW,OAAS,EAC5F,MACO,CAAC,CAAE,GAAI,EAAG,SAAO,OAAK,UAAQ,gBAEvC,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAM,GAAS,AAAG,OAAK,IAAM,CAC3B,GAAI,CAAC,GAAM,OAAO,GAAG,MAAO,MAAO,MACnC,GAAM,GAAS,AAAG,QAAM,eAAe,EAAO,CAAC,GAAM,OAAO,GAAG,MAAM,GAAI,GAAM,OAAO,GAAG,MAAM,IAAK,IAEpG,MADa,AAAG,QAAK,EAAQ,WAI3B,EAIJ,GAHI,EAAO,KAAK,SAAS,GAAO,KAAM,IAAM,QAAQ,IACpD,AAAG,UAAQ,GAEP,EAAM,CACR,GAAU,OAAS,EACnB,GAAM,GAAM,KAAM,GAAK,QACvB,AAAG,UAAQ,GACX,GAAM,GAAM,EAAI,GAAG,GACnB,OAAS,GAAK,EAAG,EAAK,EAAI,OAAQ,IAChC,GAAQ,EAAI,GAAI,GACZ,GAAQ,EAAO,KAAK,eACtB,GAAU,KAAK,CACb,MAAO,KAAK,MAAM,IAAM,IAAS,IACjC,KAAM,GAAU,GAChB,YAAa,CACX,EAAI,GAAI,GACR,EAAI,GAAI,IAEV,SAAU,CACR,KAAK,MAAO,GAAM,MAAM,IAAM,GAAK,EAAI,GAAI,IAC3C,KAAK,MAAO,GAAM,MAAM,IAAM,GAAK,EAAI,GAAI,OAMrD,GAAQ,GAAU,OAAO,CAAC,EAAM,IAAU,EAAK,MAAQ,EAAO,EAAK,MAAQ,EAAO,GAClF,GAAM,GAAI,GAAU,IAAI,AAAC,GAAM,EAAE,SAAS,IACpC,EAAI,GAAU,IAAI,AAAC,GAAM,EAAE,SAAS,IAC1C,GAAM,CACJ,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,GAC7B,KAAK,IAAI,GAAG,GAAK,KAAK,IAAI,GAAG,IAE/B,GAAM,GAAO,GAAU,IAAI,AAAC,GAAM,EAAE,YAAY,IAC1C,EAAO,GAAU,IAAI,AAAC,GAAM,EAAE,YAAY,IAChD,GAAS,CACP,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GACZ,KAAK,IAAI,GAAG,GAAQ,KAAK,IAAI,GAAG,GAChC,KAAK,IAAI,GAAG,GAAQ,KAAK,IAAI,GAAG,IAElC,EAAQ,CAAC,CAAE,GAAI,EAAG,SAAO,OAAK,UAAQ,mBCvFnC,GAAM,IAAS,CACpB,CAAE,MAAO,EAAG,MAAO,UACnB,CAAE,MAAO,EAAG,MAAO,WACnB,CAAE,MAAO,EAAG,MAAO,OACnB,CAAE,MAAO,EAAG,MAAO,cACnB,CAAE,MAAO,EAAG,MAAO,YACnB,CAAE,MAAO,EAAG,MAAO,OACnB,CAAE,MAAO,EAAG,MAAO,SACnB,CAAE,MAAO,EAAG,MAAO,SACnB,CAAE,MAAO,EAAG,MAAO,QACnB,CAAE,MAAO,GAAI,MAAO,iBACpB,CAAE,MAAO,GAAI,MAAO,gBACpB,CAAE,MAAO,GAAI,MAAO,aACpB,CAAE,MAAO,GAAI,MAAO,iBACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,OACpB,CAAE,MAAO,GAAI,MAAO,OACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,OACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,WACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,WACpB,CAAE,MAAO,GAAI,MAAO,OACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,WACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,aACpB,CAAE,MAAO,GAAI,MAAO,eACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,gBACpB,CAAE,MAAO,GAAI,MAAO,kBACpB,CAAE,MAAO,GAAI,MAAO,cACpB,CAAE,MAAO,GAAI,MAAO,aACpB,CAAE,MAAO,GAAI,MAAO,iBACpB,CAAE,MAAO,GAAI,MAAO,UACpB,CAAE,MAAO,GAAI,MAAO,cACpB,CAAE,MAAO,GAAI,MAAO,OACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,UACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,UACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,UACpB,CAAE,MAAO,GAAI,MAAO,WACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,gBACpB,CAAE,MAAO,GAAI,MAAO,OACpB,CAAE,MAAO,GAAI,MAAO,gBACpB,CAAE,MAAO,GAAI,MAAO,UACpB,CAAE,MAAO,GAAI,MAAO,MACpB,CAAE,MAAO,GAAI,MAAO,UACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,UACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,cACpB,CAAE,MAAO,GAAI,MAAO,aACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,WACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,gBACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,SACpB,CAAE,MAAO,GAAI,MAAO,QACpB,CAAE,MAAO,GAAI,MAAO,YACpB,CAAE,MAAO,GAAI,MAAO,cACpB,CAAE,MAAO,GAAI,MAAO,cACpB,CAAE,MAAO,GAAI,MAAO,eCxEtB,GAAI,GACA,GAAoB,GACpB,GAAU,OAAO,iBAEf,GAAW,IAEjB,kBAA2B,EAAqC,CAC9D,GAAK,EAOE,AAAI,EAAO,OAAO,EAAI,gBAAiB,EAAM,cAPxC,CACV,EAAQ,KAAM,AAAG,kBAAe,EAAK,EAAO,cAAe,EAAO,OAAO,YACzE,GAAM,GAAS,OAAO,OAAO,EAAM,eAAe,QAElD,GADA,EAAM,UAAY,MAAM,QAAQ,GAAU,SAAS,EAAO,GAAG,YAAY,IAAI,GAAG,MAAQ,KACpF,CAAC,EAAM,UAAW,KAAM,IAAI,OAAM,4CAA4C,EAAO,OAAO,aAChG,AAAI,CAAC,GAAS,CAAC,EAAM,SAAU,EAAI,qBAAsB,EAAO,OAAO,WAC9D,EAAO,OAAO,EAAI,cAAe,EAAM,UAElD,MAAO,GAGT,kBAAuB,EAAK,EAAW,EAAa,EAAQ,CAC1D,GAAI,GAAK,EACL,EAAuB,GAC3B,OAAW,KAAc,CAAC,EAAG,EAAG,GAE9B,AAAG,OAAK,SAAY,CAlCxB,QAmCM,GAAM,GAAW,EAAa,GAExB,EAAU,KAAI,KAAK,AAAC,GAAO,EAAE,MAAM,KAAQ,GAAY,GAAM,EAAE,MAAM,KAAO,GAAO,UAAzE,cAAmF,UAC7F,EAAY,KAAI,KAAK,AAAC,GAAO,EAAE,MAAM,KAAQ,GAAY,GAAM,EAAE,MAAM,GAAK,GAAO,UAAvE,cAAiF,UAE7F,EAAS,KAAM,AADJ,GAAU,QAAQ,CAAC,GAAI,EAAG,EAAU,MAAM,GAAK,IAClC,OAAO,GAAG,QAClC,EAAS,KAAM,GAAQ,QAC7B,OAAS,GAAI,EAAG,EAAI,EAAQ,MAAM,GAAI,IACpC,OAAS,GAAI,EAAG,EAAI,EAAQ,MAAM,GAAI,IAAK,CACzC,GAAM,GAAQ,EAAO,GAAG,GACxB,GAAI,EAAQ,EAAO,OAAO,eAAiB,IAAM,GAAI,CACnD,GAAM,GAAM,IAAM,KAAK,MAAM,EAAI,IAAa,EACxC,EAAM,IAAM,KAAK,MAAM,EAAI,IAAa,EACxC,EAAY,EAAO,GAAG,IAAI,AAAC,GAAM,EAAK,GAAW,EAAa,IAC9D,CAAC,EAAG,GAAK,CACb,EAAM,GAAW,EAAa,EAAU,GACxC,EAAM,GAAW,EAAa,EAAU,IAEpC,CAAC,EAAG,GAAK,CACb,EAAM,GAAW,EAAa,EAAU,GAAM,EAC9C,EAAM,GAAW,EAAa,EAAU,GAAM,GAE5C,EAAS,CAAC,EAAG,EAAG,EAAG,GACvB,EAAS,EAAO,IAAI,AAAC,GAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KACnD,GAAM,GAAM,CACV,EAAO,GAAK,EAAY,GACxB,EAAO,GAAK,EAAY,GACxB,EAAO,GAAK,EAAY,GACxB,EAAO,GAAK,EAAY,IAEpB,EAAS,CACb,GAAI,IAEJ,MAAO,KAAK,MAAM,IAAM,GAAS,IACjC,MAAO,EAAI,EACX,MAAO,GAAO,GAAG,MAGjB,IAAM,EAAI,IAAI,AAAC,GAAM,KAAK,MAAM,IAChC,OAAQ,GAEV,EAAQ,KAAK,OAOvB,EAAI,QAAQ,AAAC,GAAM,AAAG,UAAQ,IAI9B,GAAM,GAAW,EAAQ,IAAI,AAAC,GAAM,CAAC,EAAE,OAAO,GAAI,EAAE,OAAO,GAAI,EAAE,OAAO,GAAI,EAAE,OAAO,KAC/E,EAAY,EAAQ,IAAI,AAAC,GAAM,EAAE,OACnC,EAAwB,GAC5B,GAAI,GAAY,EAAS,OAAS,EAAG,CACnC,GAAM,GAAM,KAAM,AAAG,SAAM,uBAAuB,EAAU,EAAW,EAAO,OAAO,YAAa,EAAO,OAAO,aAAc,EAAO,OAAO,eAC5I,EAAS,KAAM,GAAI,OACnB,AAAG,UAAQ,GAIb,SAAU,EACP,OAAO,CAAC,EAAM,IAAQ,EAAO,SAAS,IACtC,KAAK,CAAC,EAAG,IAAO,EAAE,MAAQ,EAAE,OAExB,EAGT,kBAA8B,EAAe,EAAiC,CAC5E,MAAK,IAAU,EAAO,OAAO,YAAe,EAAO,WAAc,GAAK,OAAS,EAC7E,MACO,IAET,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAM,GAAa,CAAC,EAAM,MAAM,GAAI,EAAM,MAAM,IAC1C,EAAS,AAAG,QAAM,eAAe,EAAO,CAAC,EAAM,UAAW,EAAM,WAAY,IAC5E,EAAO,AAAG,MAAI,EAAQ,KACtB,EAAY,EAAK,UAAU,CAAC,EAAG,EAAG,EAAG,IAC3C,AAAG,UAAQ,GACX,AAAG,UAAQ,GAEX,GAAI,GACJ,AAAI,EAAO,OAAO,SAAS,GAAU,KAAM,GAAM,QAAQ,IACzD,AAAG,UAAQ,GAEX,GAAM,GAAM,KAAM,IAAQ,EAAS,EAAM,UAAW,EAAY,GAChE,GAAO,EACP,EAAQ,MCjHZ,GAAI,GACA,GAAe,GACf,GAAU,OAAO,iBAErB,kBAA2B,EAAqC,CAC9D,GAAK,EAOE,AAAI,EAAO,OAAO,EAAI,gBAAiB,EAAM,cAPxC,CACV,EAAQ,KAAM,AAAG,kBAAe,EAAK,EAAO,cAAe,EAAO,OAAO,YACzE,GAAM,GAAS,OAAO,OAAO,EAAM,eAAe,QAElD,GADA,EAAM,UAAY,MAAM,QAAQ,GAAU,SAAS,EAAO,GAAG,YAAY,IAAI,GAAG,MAAQ,KACpF,CAAC,EAAM,UAAW,KAAM,IAAI,OAAM,4CAA4C,EAAO,OAAO,aAChG,AAAI,CAAC,GAAS,CAAC,EAAM,SAAU,EAAI,qBAAsB,EAAO,OAAO,WAC9D,EAAO,OAAO,EAAI,cAAe,EAAM,UAElD,MAAO,GAGT,kBAAuB,EAAa,EAAW,EAAa,EAAgB,CAC1E,GAAI,CAAC,EAAK,MAAO,GACjB,GAAM,GAAuB,GACvB,EAAa,KAAM,GAAI,QACvB,EAAW,AAAG,UAAQ,GAC5B,AAAG,UAAQ,GACX,GAAM,GAAM,AAAG,QAAM,EAAU,EAAG,GAClC,AAAG,UAAQ,GACX,GAAM,GAAS,AAAG,QAAM,CAAC,EAAI,GAAI,EAAI,GAAI,EAAI,GAAI,EAAI,IAAK,GACpD,EAAS,AAAG,UAAQ,GACpB,EAAU,AAAG,UAAQ,EAAI,IACzB,EAAW,AAAG,UAAQ,EAAI,IAChC,EAAI,QAAQ,AAAC,GAAM,AAAG,UAAQ,IAC9B,GAAM,GAAO,KAAM,AAAG,SAAM,uBAAuB,EAAQ,EAAS,EAAO,OAAO,YAAa,EAAO,OAAO,aAAc,EAAO,OAAO,eACzI,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,GAAM,GAAM,KAAM,GAAK,OACvB,AAAG,UAAQ,GACX,GAAI,GAAI,EACR,OAAW,KAAM,GAAK,CACpB,GAAM,GAAQ,KAAK,MAAM,IAAM,EAAW,GAAG,GAAI,IAAM,IACjD,EAAW,EAAW,GAAG,GAAI,GAC7B,EAAQ,GAAO,GAAU,MACzB,CAAC,EAAG,GAAK,CACb,EAAW,GAAG,GAAI,GAAK,EACvB,EAAW,GAAG,GAAI,GAAK,GAEnB,EAAS,CACb,EACA,EACA,EAAW,GAAG,GAAI,GAAK,EAAY,EACnC,EAAW,GAAG,GAAI,GAAK,EAAY,GAE/B,EAAM,CACV,KAAK,MAAM,EAAO,GAAK,EAAY,IACnC,KAAK,MAAM,EAAO,GAAK,EAAY,IACnC,KAAK,MAAM,EAAO,GAAK,EAAY,IACnC,KAAK,MAAM,EAAO,GAAK,EAAY,KAErC,EAAQ,KAAK,CAAE,GAAI,IAAK,QAAO,MAAO,EAAU,QAAO,MAAK,WAE9D,MAAO,GAGT,kBAA8B,EAAe,EAAiC,CAC5E,MAAK,IAAU,EAAO,OAAO,YAAe,EAAO,WAAc,GAAK,OAAS,EAC7E,MACO,IAET,IAAU,EACH,GAAI,SAAQ,KAAO,IAAY,CACpC,GAAM,GAAa,CAAC,EAAM,MAAM,GAAI,EAAM,MAAM,IAC1C,EAAS,AAAG,QAAM,eAAe,EAAO,CAAC,EAAM,UAAW,EAAM,YAChE,EAAU,EAAO,OAAO,QAAU,EAAM,QAAQ,EAAQ,CAAC,uBAAyB,KACxF,AAAG,UAAQ,GAEX,GAAM,GAAM,KAAM,IAAQ,EAAS,EAAM,UAAW,EAAY,GAChE,GAAO,EACP,EAAQ,MClFZ,YAAmB,EAAI,EAAc,EAAgB,CACnD,GAAM,GAAW,SAAU,EAAQ,EAAQ,EAAY,CACrD,GAAM,GAAI,GAAI,QAAO,MAAQ,EAAS,eAAgB,MACtD,EAAO,QAAQ,EAAG,CAAC,EAAO,IACxB,GAAW,GAAQ,EACZ,KAIL,EAAW,SAAU,EAAQ,EAAM,CACvC,GAAM,GAAS,EAAG,aAAa,GAG/B,GAFA,EAAG,aAAa,EAAQ,GACxB,EAAG,cAAc,GACb,CAAC,EAAG,mBAAmB,EAAQ,EAAG,gBAAiB,KAAM,IAAI,OAAM,4BAA6B,EAAG,iBAAiB,IACxH,MAAO,IAGT,KAAK,QAAU,GACf,KAAK,UAAY,GACjB,GAAM,GAAO,EAAS,EAAc,EAAG,eACjC,EAAO,EAAS,EAAgB,EAAG,iBAMzC,GALA,KAAK,GAAK,EAAG,gBACb,EAAG,aAAa,KAAK,GAAI,GACzB,EAAG,aAAa,KAAK,GAAI,GACzB,EAAG,YAAY,KAAK,IAEhB,CAAC,EAAG,oBAAoB,KAAK,GAAI,EAAG,aAAc,KAAM,IAAI,OAAM,yBAA0B,EAAG,kBAAkB,KAAK,KAE1H,EAAG,WAAW,KAAK,IAEnB,EAAS,EAAc,YAAa,KAAK,WACzC,OAAW,KAAK,MAAK,UAAW,KAAK,UAAU,GAAK,EAAG,kBAAkB,KAAK,GAAI,GAElF,EAAS,EAAc,UAAW,KAAK,SACvC,EAAS,EAAgB,UAAW,KAAK,SACzC,OAAW,KAAK,MAAK,QAAS,KAAK,QAAQ,GAAK,EAAG,mBAAmB,KAAK,GAAI,GAI1E,YAAuB,EAAQ,CACpC,AAAK,GAAQ,GAAS,IACtB,GAAI,GAAa,EACb,EAAiB,KACjB,EAAe,GACf,EAA2B,GAC3B,EAAoB,CAAC,KAAM,MAC3B,EAAe,GACf,EAAS,GACT,EAAU,GACV,EAAgB,KAChB,EAAkB,KAChB,EAAU,GACV,EAAU,EAAO,QAAU,SAAS,cAAc,UAElD,EAAsB,GACtB,EAAO,CAAE,aAAc,GACvB,EAAK,EAAQ,WAAW,SAC9B,GAAI,CAAC,EAAI,KAAM,IAAI,OAAM,+BAEzB,KAAK,UAAY,SAAU,EAAM,CAE/B,GAAM,GAAO,MAAM,UAAU,MAAM,KAAK,UAAW,GAC7C,EAAS,EAAQ,GACvB,EAAa,KAAK,CAAE,KAAM,EAAQ,UAGpC,KAAK,MAAQ,UAAY,CACvB,EAAe,IAGjB,GAAM,GAAU,SAAU,EAAO,EAAQ,CAEvC,GAAI,MAAU,GAAU,IAAW,GAMnC,IALA,EAAQ,MAAQ,EAChB,EAAS,EACT,EAAQ,OAAS,EACjB,EAAU,EAEN,CAAC,EAAe,CAElB,GAAM,GAAW,GAAI,cAAa,CAChC,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EACrC,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,IAGrC,AAAC,EAAgB,EAAG,eAAgB,EAAG,WAAW,EAAG,aAAc,GACnE,EAAG,WAAW,EAAG,aAAc,EAAU,EAAG,aAC5C,EAAG,YAAY,EAAG,+BAAgC,IAEpD,EAAG,SAAS,EAAG,EAAG,EAAQ,GAE1B,EAAoB,CAAC,KAAM,QAGvB,EAA4B,SAAU,EAAO,EAAQ,CACzD,GAAM,GAAM,EAAG,oBACf,EAAG,gBAAgB,EAAG,YAAa,GACnC,GAAM,GAAe,EAAG,qBACxB,EAAG,iBAAiB,EAAG,aAAc,GACrC,GAAM,GAAU,EAAG,gBACnB,SAAG,YAAY,EAAG,WAAY,GAC9B,EAAG,WAAW,EAAG,WAAY,EAAG,EAAG,KAAM,EAAO,EAAQ,EAAG,EAAG,KAAM,EAAG,cAAe,MACtF,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,QAC1D,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,QAC1D,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,eACtD,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,eACtD,EAAG,qBAAqB,EAAG,YAAa,EAAG,kBAAmB,EAAG,WAAY,EAAS,GACtF,EAAG,YAAY,EAAG,WAAY,MAC9B,EAAG,gBAAgB,EAAG,YAAa,MAC5B,CAAE,MAAK,YAGV,EAAsB,SAAU,EAAO,CAC3C,SAAkB,GAAS,EAAkB,IAAU,EAA0B,EAAQ,GAClF,EAAkB,IAGrB,EAAQ,SAAU,EAAQ,KAAM,CAzHxC,QA0HI,GAAI,GAAS,KACT,EAAS,KACT,EAAQ,GAEZ,AAAI,IAAe,EAEjB,EAAS,EAGT,EAAS,KAAoB,KAApB,cAA+C,QAE1D,IAEA,AAAI,GAAgB,CAAE,GAAQ,EAAK,cAGjC,GAAS,KACT,EAAQ,EAAa,GAAM,GAG3B,GAA4B,GAA2B,GAAK,EAC5D,EAAS,KAAoB,KAApB,cAA+C,KAG1D,EAAG,YAAY,EAAG,WAAY,GAC9B,EAAG,gBAAgB,EAAG,YAAa,GACnC,EAAG,UAAU,EAAgB,QAAQ,MAAQ,EAAQ,GAAK,GAC1D,EAAG,WAAW,EAAG,UAAW,EAAG,IAGjC,KAAK,MAAQ,SAAU,EAAO,CAY5B,GAXA,EAAQ,EAAM,MAAO,EAAM,QAC3B,EAAa,EAER,GAAgB,GAAiB,EAAG,iBACzC,EAAG,YAAY,EAAG,WAAY,GAC9B,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,eACtD,EAAG,cAAc,EAAG,WAAY,EAAG,eAAgB,EAAG,eACtD,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,SAC1D,EAAG,cAAc,EAAG,WAAY,EAAG,mBAAoB,EAAG,SAC1D,EAAG,WAAW,EAAG,WAAY,EAAG,EAAG,KAAM,EAAG,KAAM,EAAG,cAAe,GAEhE,EAAa,SAAW,EAE1B,WACO,EAET,OAAS,GAAI,EAAG,EAAI,EAAa,OAAQ,IAAK,CAC5C,EAAgB,IAAM,EAAa,OAAS,EAC5C,GAAM,GAAI,EAAa,GACvB,EAAE,KAAK,MAAM,KAAM,EAAE,MAAQ,IAE/B,MAAO,IAGT,GAAM,GAAiB,SAAU,EAAgB,CAC/C,GAAI,EAAoB,GACtB,SAAkB,EAAoB,GACtC,EAAG,WAAW,EAAgB,IACvB,EAGT,GAAM,GAAS,GACf,EAAO,gBAAkB,CACvB,yBACA,sBACA,qBACA,oBACA,uBACA,oBACA,YACA,mDACA,KACA,KAAK;AAAA,GACP,EAAO,kBAAoB,CACzB,yBACA,oBACA,6BACA,oBACA,0CACA,KACA,KAAK;AAAA,GACP,EAAkB,GAAI,IAAU,EAAI,EAAO,gBAAiB,GAC5D,GAAM,GAAY,aAAa,kBACzB,EAAW,EAAI,EACrB,SAAG,wBAAwB,EAAgB,UAAU,KACrD,EAAG,oBAAoB,EAAgB,UAAU,IAAK,EAAG,EAAG,MAAO,GAAO,EAAU,EAAI,GACxF,EAAG,wBAAwB,EAAgB,UAAU,IACrD,EAAG,oBAAoB,EAAgB,UAAU,GAAI,EAAG,EAAG,MAAO,GAAO,EAAU,EAAI,GACvF,EAAoB,GAAkB,EAC/B,GAKT,EAAQ,YAAc,SAAU,EAAQ,CAEtC,GAAM,GAAI,GAAI,cAAa,GAC3B,EAAE,IAAM,IACR,EAAE,IAAM,IACR,EAAE,KAAO,IACT,EAAE,KAAO,IAET,GAAM,GAAU,EAAE,MAAQ,GAAK,EAAE,KAAO,GAAK,EAAE,KAAO,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,EAC7H,EAAQ,YAAY,OAAO,cAC3B,EAAQ,YAAY,OAAO,WACzB,EAAU,EAAe,GAC/B,EAAG,WAAW,EAAQ,QAAQ,EAAG,GACjC,KAEF,EAAQ,YAAY,OAAS,GAC7B,EAAQ,YAAY,OAAO,WAAa,CACtC,yBACA,oBACA,6BACA,uBACA,oBACA,oCACA,6EACA,6EACA,kFACA,kFACA,KACA,KAAK;AAAA,GACP,EAAQ,YAAY,OAAO,cAAgB,CACzC,yBACA,oBACA,6BACA,uBACA,oBACA,oCACA,gEACA,gEACA,oEACA,wBACA,KACA,KAAK;AAAA,GAEP,EAAQ,WAAa,SAAU,EAAY,CACzC,GAAM,GAAK,IAAc,GAAK,EAC9B,EAAQ,YAAY,CAClB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,WAAa,SAAU,EAAQ,CACrC,GAAM,GAAK,IAAU,GAAK,EAAI,EAAI,EAC5B,EAAM,GAAI,GAAK,IACrB,EAAQ,YAAY,CAClB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,WAAa,UAAY,CAC/B,EAAQ,WAAW,KAGrB,EAAQ,SAAW,SAAU,EAAQ,CACnC,GAAM,GAAK,IAAU,GAAK,EACpB,EAAI,KAAQ,GAAI,GAEtB,EAAQ,YAAY,CAClB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,SAAW,UAAY,CAC7B,EAAQ,SAAS,KAGnB,EAAQ,IAAM,SAAU,EAAU,CAChC,EAAY,IAAY,GAAK,IAAM,KAAK,GACxC,GAAM,GAAM,KAAK,IAAI,GACf,EAAM,KAAK,IAAI,GACf,EAAO,KACP,EAAO,KACP,EAAO,KAEb,EAAQ,YAAY,CAClB,EAAO,EAAO,GAAI,GAAQ,EAAO,CAAC,EAAO,EAAO,EAAO,CAAC,EAAQ,EAAO,CAAC,EAAO,EAAO,EAAO,CAAC,EAAQ,EAAO,GAAI,GAAO,EAAG,EAC3H,EAAO,EAAO,CAAC,EAAQ,EAAO,KAAQ,EAAO,EAAO,GAAI,GAAQ,EAAO,IAAQ,EAAO,EAAO,CAAC,EAAQ,EAAO,MAAS,EAAG,EACzH,EAAO,EAAO,CAAC,EAAQ,EAAO,CAAE,GAAI,GAAQ,EAAO,EAAO,CAAC,EAAQ,EAAO,EAAO,EAAO,EAAO,GAAI,GAAQ,EAAO,EAAO,EAAG,EAC5H,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,oBAAsB,UAAY,CACxC,EAAQ,YAAY,CAClB,SAAW,QAAW,SAAW,EAAG,MACpC,SAAW,QAAW,SAAW,EAAG,MACpC,SAAW,QAAW,SAAW,EAAG,MACpC,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,MAAQ,UAAY,CAC1B,EAAQ,YAAY,CAClB,KAAO,SAAW,UAAY,EAAG,EACjC,KAAO,SAAW,UAAY,EAAG,EACjC,KAAO,SAAW,UAAY,EAAG,EACjC,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,QAAU,UAAY,CAC5B,EAAQ,YAAY,CAClB,kBAAoB,mBAAqB,mBAAqB,EAAG,kBACjE,qBAAuB,kBAAoB,mBAAqB,EAAG,mBACnE,mBAAqB,oBAAsB,mBAAqB,EAAG,mBACnE,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,eAAiB,UAAY,CACnC,EAAQ,YAAY,CAClB,kBAAoB,kBAAoB,oBAAsB,EAAG,kBACjE,mBAAqB,kBAAoB,mBAAqB,EAAG,kBACjE,kBAAoB,mBAAqB,kBAAoB,EAAG,kBAChE,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,WAAa,UAAY,CAC/B,EAAQ,YAAY,CAClB,mBAAoB,mBAAqB,oBAAsB,EAAG,kBAClE,oBAAsB,mBAAoB,oBAAsB,EAAG,mBACnE,oBAAsB,mBAAqB,mBAAoB,EAAG,kBAClE,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,YAAc,UAAY,CAChC,EAAQ,YAAY,CAClB,mBAAoB,mBAAqB,oBAAsB,EAAG,mBAClE,mBAAqB,mBAAoB,oBAAsB,EAAG,mBAClE,kBAAoB,mBAAqB,kBAAmB,EAAG,mBAC/D,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,SAAW,UAAY,CAC7B,EAAQ,YAAY,CAClB,MAAO,MAAQ,MAAQ,EAAG,EAC1B,MAAQ,MAAO,MAAQ,EAAG,EAC1B,MAAQ,MAAQ,MAAO,EAAG,EAC1B,EAAG,EAAG,EAAG,EAAG,KAIhB,EAAQ,WAAa,UAAY,CAC/B,EAAQ,YAAY,CAClB,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,EACZ,EAAG,EAAG,EAAG,EAAG,KAMhB,EAAQ,YAAc,SAAU,EAAQ,CACtC,GAAM,GAAI,GAAI,cAAa,GACrB,EAAa,EAAI,EACjB,EAAa,EAAI,EACjB,EAAU,EAAe,EAAQ,YAAY,QACnD,EAAG,WAAW,EAAQ,QAAQ,EAAG,GACjC,EAAG,UAAU,EAAQ,QAAQ,GAAI,EAAY,GAC7C,KAGF,EAAQ,YAAY,OAAS,CAC3B,yBACA,oBACA,6BACA,mBACA,sBACA,oBACA,2CACA,4DACA,mEACA,6DACA,sCACA,6DACA,oEACA,6DACA,4CACA,kBACA,yCACA,yCACA,wCACA,0BACA,KACA,KAAK;AAAA,GAEP,EAAQ,YAAc,UAAY,CAChC,EAAQ,YAAY,KAAK,KAAM,CAC7B,EAAG,EAAG,EACN,EAAG,GAAI,EACP,EAAG,EAAG,KAIV,EAAQ,OAAS,UAAY,CAC3B,EAAQ,YAAY,KAAK,KAAM,CAC7B,GAAI,EAAG,EACP,GAAI,EAAG,EACP,GAAI,EAAG,KAIX,EAAQ,OAAS,UAAY,CAC3B,EAAQ,YAAY,KAAK,KAAM,CAC7B,GAAI,GAAI,GACR,EAAG,EAAG,EACN,EAAG,EAAG,KAIV,EAAQ,QAAU,SAAU,EAAQ,CAClC,GAAM,GAAI,GAAU,EACpB,EAAQ,YAAY,KAAK,KAAM,CAC7B,EAAG,GAAK,EAAG,EACX,GAAK,EAAG,EAAI,EAAI,EAAG,GAAK,EACxB,EAAG,GAAK,EAAG,KAIf,EAAQ,OAAS,SAAU,EAAM,CAC/B,GAAM,GAAI,GAAQ,EAClB,EAAQ,YAAY,KAAK,KAAM,CAC7B,GAAK,EAAG,GAAK,EAAG,EAChB,GAAK,EAAG,EAAG,EAAI,EACf,EAAG,EAAI,EAAG,EAAI,KAMlB,EAAQ,KAAO,SAAU,EAAM,CAC7B,GAAM,GAAa,EAAO,EAAK,EACzB,EAAa,EAAO,EAAK,EACzB,EAAU,EAAe,EAAQ,KAAK,QAE5C,EAAG,UAAU,EAAQ,QAAQ,GAAI,EAAG,GACpC,EAAM,EAAK,cAEX,EAAG,UAAU,EAAQ,QAAQ,GAAI,EAAW,GAC5C,KAGF,EAAQ,KAAK,OAAS,CACpB,yBACA,oBACA,6BACA,mBACA,oBACA,4BACA,8FACA,yFACA,wFACA,wFACA,wFACA,uFACA,uFACA,uFACA,uFACA,uFACA,wFACA,wFACA,wFACA,yFACA,8FACA,KACA,KAAK;AAAA,GAIP,EAAQ,SAAW,SAAU,EAAM,CACjC,GAAM,GAAa,EAAQ,EACrB,EAAa,EAAQ,EACrB,EAAU,EAAe,EAAQ,SAAS,QAEhD,EAAG,UAAU,EAAQ,QAAQ,KAAM,EAAW,GAC9C,KAGF,EAAQ,SAAS,OAAS,CACxB,yBACA,oBACA,qBACA,6BACA,yCACA,uCACA,IACA,oBACA,4BACA,oCACA,6CACA,KACA,KAAK;GCvgBT,GAAM,IAAU,KAEZ,EACA,EAEA,EAKG,YAAiB,EAAc,EAAwF,CAC5H,GAAI,GACJ,GAAI,CAAC,EAAO,KAAM,IAAI,OAAM,2BAE5B,GACE,CAAE,aAAoB,YACnB,CAAE,OAAO,QAAU,aAAe,YAAiB,SACnD,CAAE,OAAO,YAAc,aAAe,YAAiB,aACvD,CAAE,OAAO,cAAgB,aAAe,YAAiB,eACzD,CAAE,OAAO,mBAAqB,aAAe,YAAiB,oBAC9D,CAAE,OAAO,mBAAqB,aAAe,YAAiB,oBAC9D,CAAE,OAAO,mBAAqB,aAAe,YAAiB,oBAC9D,CAAE,OAAO,oBAAsB,aAAe,YAAiB,qBAC/D,CAAE,OAAO,kBAAoB,aAAe,YAAiB,kBAEhE,KAAM,IAAI,OAAM,uCAElB,GAAI,YAAoB,UAEtB,GAAI,EAAM,OAAS,EAAM,MAAM,SAAW,GAAK,EAAM,MAAM,KAAO,GAAK,EAAM,MAAM,KAAO,EAAG,EAAS,AAAG,QAAM,OAC1G,MAAM,IAAI,OAAM,2EAA2E,EAAM,aACjG,CAEL,GAAM,GAAgB,EAAM,cAAmB,EAAM,YAAiB,EAAM,OAAa,EAAM,OAAa,EAAM,MAAS,GAAK,EAC1H,EAAiB,EAAM,eAAoB,EAAM,aAAkB,EAAM,QAAc,EAAM,OAAa,EAAM,MAAS,GAAK,EACpI,GAAI,CAAC,GAAiB,CAAC,EAAgB,MAAO,CAAE,OAAQ,KAAM,OAAQ,GACtE,GAAI,GAAc,EACd,EAAe,EAenB,GAdI,EAAc,IAChB,GAAc,GACd,EAAe,EAAc,EAAiB,GAE5C,EAAe,IACjB,GAAe,GACf,EAAc,EAAe,EAAgB,GAI/C,AAAI,EAAO,OAAO,MAAQ,EAAG,EAAc,EAAO,OAAO,MAChD,EAAO,OAAO,OAAS,GAAG,GAAc,EAAiB,GAAO,OAAO,OAAS,IACzF,AAAI,EAAO,OAAO,OAAS,EAAG,EAAe,EAAO,OAAO,OAClD,EAAO,OAAO,MAAQ,GAAG,GAAe,EAAkB,GAAO,OAAO,MAAQ,IACrF,CAAC,GAAe,CAAC,EAAc,KAAM,IAAI,OAAM,2CACnD,AAAI,EAAC,GAAa,kBAAU,SAAU,GAAiB,kBAAU,UAAW,IAC1E,GAAY,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,EAAa,GAAgB,SAAS,cAAc,UAC1H,kBAAU,SAAU,GAAa,GAAS,MAAQ,GAClD,kBAAU,UAAW,GAAc,GAAS,OAAS,IAI3D,GAAM,GAAM,EAAS,WAAW,MAehC,GAdA,AAAI,YAAiB,WACnB,EAAI,aAAa,EAAO,EAAG,GAE3B,AAAI,EAAO,OAAO,MAAQ,MAAO,GAAI,WAAc,YACjD,GAAI,UAAU,EAAe,GAC7B,EAAI,MAAM,GAAI,GACd,EAAI,UAAU,EAAO,EAAG,EAAG,EAAe,EAAgB,EAAG,EAAG,iBAAU,MAAO,iBAAU,QAC3F,EAAI,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,IAEhC,EAAI,UAAU,EAAO,EAAG,EAAG,EAAe,EAAgB,EAAG,EAAG,iBAAU,MAAO,iBAAU,QAK3F,EAAO,OAAO,QAAS,CAQzB,GAPI,EAAC,GAAM,CAAC,GAAc,EAAS,QAAU,EAAU,OAAW,kBAAU,UAAW,kBAAW,UAChG,GAAa,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,iBAAU,MAAO,iBAAU,QAAU,SAAS,cAAc,UACnI,kBAAW,SAAU,kBAAU,QAAO,GAAU,MAAQ,iBAAU,OAClE,kBAAW,UAAW,kBAAU,SAAQ,GAAU,OAAS,iBAAU,QAEzE,EAAK,AAAG,MAAI,MAAM,WAAa,GAAY,IAAc,CAAE,OAAQ,IAAe,MAEhF,CAAC,EAAI,MAAO,CAAE,OAAQ,KAAM,OAAQ,GACxC,EAAG,QACH,EAAG,UAAU,aAAc,EAAO,OAAO,YACrC,EAAO,OAAO,WAAa,GAAG,EAAG,UAAU,WAAY,EAAO,OAAO,UACrE,EAAO,OAAO,YAAc,GAAG,EAAG,UAAU,UAAW,EAAO,OAAO,WACrE,EAAO,OAAO,OAAS,GAAG,EAAG,UAAU,OAAQ,EAAO,OAAO,MAC7D,EAAO,OAAO,aAAe,GAAG,EAAG,UAAU,aAAc,EAAO,OAAO,YACzE,EAAO,OAAO,MAAQ,GAAG,EAAG,UAAU,MAAO,EAAO,OAAO,KAC3D,EAAO,OAAO,UAAU,EAAG,UAAU,YACrC,EAAO,OAAO,OAAO,EAAG,UAAU,SAClC,EAAO,OAAO,SAAS,EAAG,UAAU,WACpC,EAAO,OAAO,OAAO,EAAG,UAAU,SAClC,EAAO,OAAO,YAAY,EAAG,UAAU,cACvC,EAAO,OAAO,aAAa,EAAG,UAAU,eACxC,EAAO,OAAO,UAAU,EAAG,UAAU,YACrC,EAAO,OAAO,WAAa,GAAG,EAAG,UAAU,WAAY,EAAO,OAAO,UACzE,EAAG,MAAM,OA2BT,GAAY,EACR,GAAI,GAAK,MAIf,GAAI,CAAC,EAAQ,CACX,GAAI,GACJ,GAAI,EAAU,KAAM,CAClB,GAAM,GAAQ,CAAC,EAAU,OAAQ,EAAU,MAAO,GAClD,EAAS,AAAG,WAAS,EAAU,KAAM,EAAO,iBACnC,YAAqB,WAC9B,EAAS,AAAG,UAAU,AAAG,UAAQ,WAAW,GAAa,aAChD,EAAO,UAAY,SAAW,EAAO,UAAY,UAAW,CAErE,GAAM,GAAc,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,EAAa,GAAgB,SAAS,cAAc,UACtI,EAAW,MAAQ,EACnB,EAAW,OAAS,EACpB,GAAM,GAAU,EAAW,WAAW,MACtC,WAAS,UAAU,EAAW,EAAG,GACjC,EAAS,AAAG,UAAU,AAAG,UAAQ,WAAW,GAAc,SACrD,CAEL,GAAM,GAAc,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,EAAa,GAAgB,SAAS,cAAc,UACtI,EAAW,MAAQ,EACnB,EAAW,OAAS,EACpB,GAAM,GAAU,EAAW,WAAW,MACtC,WAAS,UAAU,EAAW,EAAG,GACjC,GAAM,GAAO,iBAAS,aAAa,EAAG,EAAG,EAAa,GACtD,EAAS,AAAG,UAAU,AAAG,UAAQ,WAAW,GAAQ,KAEtD,GAAI,EAAQ,CACV,GAAM,GAAS,AAAG,OAAK,EAAQ,WAC/B,EAAS,AAAG,aAAW,EAAQ,GAC/B,AAAG,UAAQ,GACX,AAAG,UAAQ,KAIjB,GAAM,GAAS,EAAO,OAAO,OAAS,EAAY,KAClD,MAAO,CAAE,SAAQ,UCpKnB,GAAI,GACA,GAAO,GAEX,kBAA2B,EAAqC,CAC9D,MAAK,GAKM,EAAO,OAAO,EAAI,gBAAiB,EAAM,UAHlD,GAAQ,KAAM,AAAG,kBAAe,EAAK,EAAO,cAAe,EAAO,aAAa,YAC/E,AAAI,CAAC,GAAS,CAAC,EAAM,SAAa,EAAI,qBAAsB,EAAO,aAAa,WACvE,EAAO,OAAO,EAAI,cAAe,EAAM,WAE3C,EAGT,kBAA8B,EAAkH,CAzBhJ,QA0BE,GAAM,GAAQ,MAAM,SAAN,cAAc,MAAM,KAAM,EAClC,EAAS,MAAM,SAAN,cAAc,MAAM,KAAM,EAEzC,GADI,CAAC,EAAM,QACP,CAAC,GAAS,CAAC,EAAM,OAAO,GAAG,MAAO,MAAO,MAC7C,GAAM,GAAc,AAAG,QAAM,eAAe,EAAM,OAAQ,CAAC,EAAM,OAAO,GAAG,MAAM,GAAI,EAAM,OAAO,GAAG,MAAM,IAAK,IAC1G,EAAO,AAAG,MAAI,EAAa,KAC3B,EAAM,EAAM,QAAQ,GAG1B,AAAG,UAAQ,GACX,AAAG,UAAQ,GAEX,GAAM,GAAU,AAAG,UAAQ,EAAK,GAC5B,EACJ,GAAI,EAAQ,MAAM,KAAO,EAAG,CAE1B,GAAM,GAAU,EAAQ,UAClB,CAAC,EAAI,GAAM,AAAG,UAAQ,EAAS,GAC/B,EAAS,AAAG,aAAW,EAAI,GAC3B,EAAM,AAAG,aAAW,EAAQ,GAClC,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,AAAG,UAAQ,GAEX,GAAM,GAAO,AAAG,QAAM,cAAc,EAAK,CAAC,CAAC,EAAG,EAAG,GAAK,KAAO,CAAC,GAAI,CAAC,EAAO,IAG1E,EAAe,AAAG,UAAQ,EAAM,GAChC,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,AAAG,UAAQ,OAEX,GAAe,AAAG,QAAM,eAAe,EAAS,CAAC,EAAO,IAG1D,GAAI,MAAO,WAAa,YAAa,MAAO,GAAa,OAEzD,GAAM,GAAW,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,EAAO,GAAU,SAAS,cAAc,UACvH,EAAQ,MAAQ,EAChB,EAAQ,OAAS,EACV,WAAS,KAAM,AAAG,WAAQ,SAAS,EAAc,GACxD,AAAG,UAAQ,GACX,AAAG,UAAQ,GACX,AAAG,UAAQ,GAGX,GAAM,GAAe,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,EAAO,GAAU,SAAS,cAAc,UAC3H,EAAY,MAAQ,EACpB,EAAY,OAAS,EACrB,GAAM,GAAW,EAAY,WAAW,MACxC,EAAS,OAAS,WAClB,KAAM,GAAS,UAAU,EAAS,EAAG,GACrC,GAAM,GAAQ,EAAS,aAAa,EAAG,EAAG,EAAO,GAAQ,KAGnD,EAAY,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,EAAO,GAAU,SAAS,cAAc,UACxH,EAAS,MAAQ,EACjB,EAAS,OAAS,EAClB,GAAM,GAAM,EAAS,WAAW,MAChC,MAAI,GAAM,QAAQ,KAAM,GAAI,UAAU,EAAM,OAAQ,EAAG,GAEvD,EAAI,yBAA2B,SAC/B,EAAI,OAAS,YACb,KAAM,GAAI,UAAU,EAAS,EAAG,GAChC,EAAI,yBAA2B,cAC/B,EAAI,OAAS,OAEb,EAAM,OAAS,EAER,EAGT,kBAA8B,EAAc,EAA+B,EAAqE,CAlGhJ,MAmGE,GAAI,GAAM,MAAO,MACjB,GAAO,GACF,GAAO,KAAM,IAAK,GACvB,GAAM,GAAM,AAAM,GAAQ,EAAO,GAC3B,EAAQ,KAAM,IAAQ,GAG5B,GAFA,AAAG,UAAQ,EAAI,QAEX,GAAc,EAAO,CACvB,GAAM,GAAM,AAAM,GAAQ,EAAY,GAChC,EAAK,EAAI,OACf,AAAG,UAAQ,EAAI,QACf,GAAM,GAAK,EAAI,OACT,EAAS,KAAG,WAAW,QAAd,cAAqB,aAAa,EAAG,EAAG,EAAG,MAAO,EAAG,QAAQ,KAEtE,EAAK,MAAO,kBAAoB,YAAe,GAAI,iBAAgB,EAAG,MAAO,EAAG,QAAU,SAAS,cAAc,UACvH,EAAE,MAAQ,EAAG,MACb,EAAE,OAAS,EAAG,OACd,GAAM,GAAM,EAAE,WAAW,MAEzB,EAAI,yBAA2B,OAC/B,EAAI,UAAU,EAAI,EAAG,EAAG,EAAE,MAAO,EAAE,QACnC,GAAM,GAAQ,EAAI,aAAa,EAAG,EAAG,EAAE,MAAO,EAAE,QAChD,OAAS,GAAI,EAAG,EAAI,EAAE,MAAQ,EAAE,OAAQ,IACtC,EAAM,KAAK,EAAI,EAAI,GAAO,KAAM,EAAM,EAAI,EAAI,IAAM,IAAQ,EAAM,KAAK,EAAI,EAAI,GAAO,EAAM,EAAI,EAAI,GAAK,IAAQ,EAAO,EAAI,EAAI,GAChI,EAAM,KAAK,EAAI,EAAI,GAAO,KAAM,EAAM,EAAI,EAAI,IAAM,IAAQ,EAAM,KAAK,EAAI,EAAI,GAAO,EAAM,EAAI,EAAI,GAAK,IAAQ,EAAO,EAAI,EAAI,GAChI,EAAM,KAAK,EAAI,EAAI,GAAO,KAAM,EAAM,EAAI,EAAI,IAAM,IAAQ,EAAM,KAAK,EAAI,EAAI,GAAO,EAAM,EAAI,EAAI,GAAK,IAAQ,EAAO,EAAI,EAAI,GAChI,EAAM,KAAK,EAAI,EAAI,GAAO,KAAM,EAAM,EAAI,EAAI,IAAM,IAAQ,EAAM,KAAK,EAAI,EAAI,GAAO,EAAM,EAAI,EAAI,GAAK,IAAQ,EAAO,EAAI,EAAI,GAElI,EAAI,aAAa,EAAO,EAAG,GAC3B,EAAI,OAAS,EAEf,UAAO,GACA,EAAI,OClHb,kBAA2B,EAAU,CACnC,AAAI,EAAS,OAAO,MAClB,CAEE,EAAS,OAAO,KAEhB,EAAS,OAAO,QAEhB,EAAS,OAAO,SAEhB,EAAS,OAAO,QAEhB,EAAS,OAAO,UAEhB,EAAS,OAAO,cAEhB,EAAS,OAAO,QAEhB,EAAS,OAAO,QAEhB,EAAS,OAAO,UAEhB,EAAS,OAAO,QAEhB,EAAS,OAAO,cAGd,KAAM,SAAQ,IAAI,CACpB,EAAS,OAAO,MAAS,GAAS,OAAO,KAAK,QAAU,AAAS,GAAK,EAAS,QAAU,MACzF,EAAS,OAAO,SAAa,GAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,QAAQ,QAAW,AAAQ,GAAK,EAAS,QAAU,MACrI,EAAS,OAAO,UAAa,GAAS,OAAO,KAAK,QAAU,AAAS,GAAK,EAAS,QAAU,MAC7F,EAAS,OAAO,SAAY,GAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,UAAU,SAAS,WAAa,AAAQ,GAAK,EAAS,QAAU,MACjJ,EAAS,OAAO,WAAc,GAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,UAAU,SAAS,aAAe,AAAU,GAAK,EAAS,QAAU,MACvJ,EAAS,OAAO,eAAkB,GAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,UAAU,SAAS,iBAAmB,AAAc,GAAK,EAAS,QAAU,MACnK,EAAS,OAAO,SAAY,GAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,UAAU,SAAS,WAAa,AAAQ,GAAK,EAAS,QAAU,MACjJ,EAAS,OAAO,SAAY,GAAS,OAAO,OAAO,SAAW,EAAS,OAAO,OAAO,UAAU,SAAS,WAAa,AAAQ,GAAK,EAAS,QAAU,MACrJ,EAAS,OAAO,WAAc,GAAS,OAAO,OAAO,SAAW,EAAS,OAAO,OAAO,UAAU,SAAS,aAAe,AAAU,GAAK,EAAS,QAAU,MAC3J,EAAS,OAAO,SAAa,GAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,YAAY,QAAW,AAAQ,GAAK,EAAS,QAAU,MACzI,EAAS,OAAO,cAAiB,GAAS,OAAO,aAAa,QAAU,AAAa,GAAK,EAAS,QAAU,QAI3G,GAAS,OAAO,KAAK,SAAW,CAAC,EAAS,OAAO,MAAM,GAAS,OAAO,KAAO,KAAM,AAAS,IAAK,EAAS,SAC3G,EAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,QAAQ,SAAW,CAAC,EAAS,OAAO,SAAS,GAAS,OAAO,QAAU,KAAM,AAAQ,IAAK,EAAS,SACxJ,EAAS,OAAO,KAAK,SAAW,CAAC,EAAS,OAAO,UAAU,GAAS,OAAO,SAAW,KAAM,AAAS,IAAK,EAAS,SACnH,EAAS,OAAO,KAAK,SAAW,CAAC,EAAS,OAAO,SAAW,EAAS,OAAO,KAAK,UAAU,SAAS,YAAY,GAAS,OAAO,QAAU,KAAM,AAAQ,IAAK,EAAS,SACtK,EAAS,OAAO,KAAK,SAAW,CAAC,EAAS,OAAO,WAAa,EAAS,OAAO,KAAK,UAAU,SAAS,cAAc,GAAS,OAAO,UAAY,KAAM,AAAU,IAAK,EAAS,SAC9K,EAAS,OAAO,KAAK,SAAW,CAAC,EAAS,OAAO,eAAiB,EAAS,OAAO,KAAK,UAAU,SAAS,kBAAkB,GAAS,OAAO,cAAgB,KAAM,AAAU,IAAK,EAAS,SAC1L,EAAS,OAAO,KAAK,SAAW,CAAC,EAAS,OAAO,SAAW,EAAS,OAAO,KAAK,UAAU,SAAS,YAAY,GAAS,OAAO,QAAU,KAAM,AAAQ,IAAK,EAAS,SACtK,EAAS,OAAO,OAAO,SAAW,CAAC,EAAS,OAAO,SAAW,EAAS,OAAO,OAAO,UAAU,SAAS,YAAY,GAAS,OAAO,QAAU,KAAM,AAAQ,IAAK,EAAS,SAC1K,EAAS,OAAO,OAAO,SAAW,CAAC,EAAS,OAAO,WAAa,EAAS,OAAO,OAAO,UAAU,SAAS,cAAc,GAAS,OAAO,UAAY,KAAM,AAAU,IAAK,EAAS,SAClL,EAAS,OAAO,KAAK,SAAW,EAAS,OAAO,KAAK,YAAY,SAAW,CAAC,EAAS,OAAO,SAAS,GAAS,OAAO,QAAU,KAAM,AAAQ,IAAK,EAAS,SAC5J,EAAS,OAAO,aAAa,SAAW,CAAC,EAAS,OAAO,cAAc,GAAS,OAAO,aAAe,KAAM,AAAa,IAAK,EAAS,UCrD/I,GAAM,IAAgB,AAAC,GAAgD,CACrE,GAAM,GAAU,CAAC,EAAK,IAAQ,KAAK,MAAM,EAAI,GAAK,EAAI,GAAI,EAAI,GAAK,EAAI,IACvE,GAAI,CAAC,EAAK,YAAY,cAAmB,CAAC,EAAK,YAAY,YAAgB,MAAO,CAAE,QAAS,EAAG,SAAU,GAE1G,GAAM,GAAa,CAAC,EAAG,KACjB,EAAW,EAEX,EAAO,EAAK,KAAK,IAAI,GAAK,EAAK,KAAK,KAAK,GACzC,EAAa,EAAO,EAAK,KAAK,KAAO,EAAK,KAAK,KAC/C,EAAY,EACd,CAAE,GAAK,KAAK,KAAK,GAAK,EAAK,KAAK,IAAI,IAAM,EAAI,GAAK,KAAK,KAAK,GAAK,EAAK,KAAK,IAAI,IAAM,GACtF,CAAE,GAAK,KAAK,KAAK,GAAK,EAAK,KAAK,KAAK,IAAM,EAAI,GAAK,KAAK,KAAK,GAAK,EAAK,KAAK,KAAK,IAAM,GACtF,EAAU,EACZ,CAAC,EAAK,KAAK,KAAK,GAAK,EAAK,KAAK,IAAI,GAAI,EAAK,KAAK,IAAI,GAAK,EAAK,KAAK,IAAI,IACxE,CAAC,EAAK,KAAK,KAAK,GAAK,EAAK,KAAK,KAAK,GAAI,EAAK,KAAK,KAAK,GAAK,EAAK,KAAK,KAAK,IAEzE,EAAU,CACb,GAAU,GAAK,EAAW,IAAM,EAAQ,GAAK,EAAW,GACzD,EAAY,GAAW,GAAK,EAAU,IAAM,EAAQ,GAAK,EAAW,IAElE,EAAW,KAAK,KAAM,EAAQ,IAAM,EAAM,EAAQ,IAAM,GAC5D,SAAW,KAAK,IAAI,EAAU,EAAK,OAAO,GAAK,EAAG,EAAK,OAAO,GAAK,GAG5D,CAAE,QAFQ,GAAQ,CAAC,EAAG,GAAI,GAAY,KAAK,GAAK,GAAM,KAAK,GAEhD,aAGd,GAAqB,CAAC,EAAM,IAI7B,CAEH,GAAM,GAAY,AAAC,GAAM,CACvB,GAAM,GAAS,KAAK,KAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,IAC9D,SAAE,IAAM,EACR,EAAE,IAAM,EACR,EAAE,IAAM,EACD,GAEH,EAAa,CAAC,EAAG,IAAM,CAC3B,GAAM,GAAI,EAAE,GAAK,EAAE,GACb,EAAI,EAAE,GAAK,EAAE,GACb,EAAI,EAAE,GAAK,EAAE,GACnB,MAAO,CAAC,EAAG,EAAG,IAEV,EAAe,CAAC,EAAG,IAAM,CAC7B,GAAM,GAAI,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GAC3B,EAAI,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GAC3B,EAAI,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GACjC,MAAO,CAAC,EAAG,EAAG,IAGV,EAA6B,AAAC,GAAM,CAExC,GAAM,CAAC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GAAO,EAClD,EAAY,EAAY,EAC5B,MAAI,GAAM,EACR,AAAI,EAAM,GACR,GAAS,KAAK,KAAK,GACnB,EAAS,KAAK,MAAM,CAAC,EAAK,GAC1B,EAAS,KAAK,MAAM,CAAC,EAAK,IAE1B,GAAS,CAAC,KAAK,GAAK,EACpB,EAAS,CAAC,KAAK,MAAM,EAAK,GAC1B,EAAS,GAGX,GAAS,KAAK,GAAK,EACnB,EAAS,KAAK,MAAM,EAAK,GACzB,EAAS,GAEJ,CAAE,MAAO,EAAI,CAAC,EAAQ,IAAK,EAAI,CAAC,EAAQ,KAAM,EAAI,CAAC,IAItD,EAAmB,AAAC,GAAS,CACjC,GAAM,GAAU,CAAC,EAAI,EAAI,EAAI,IAAO,KAAK,MAAM,EAAK,EAAI,EAAK,GAW7D,MATc,CAGZ,MAAO,EAAQ,EAAK,IAAI,GAAI,EAAK,IAAI,GAAI,EAAK,KAAK,GAAI,EAAK,KAAK,IAEjE,IAAK,EAAQ,EAAK,IAAI,GAAI,EAAK,IAAI,GAAI,EAAK,KAAK,GAAI,EAAK,KAAK,IAE/D,KAAM,EAAQ,EAAK,IAAI,GAAI,EAAK,IAAI,GAAI,EAAK,KAAK,GAAI,EAAK,KAAK,MAM9D,EAAO,EAAK,QAClB,GAAI,CAAC,GAAQ,EAAK,OAAS,IAAK,MAAO,CAAE,MAAO,CAAE,MAAO,EAAG,IAAK,EAAG,KAAM,GAAK,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,KAAM,CAAE,QAAS,EAAG,SAAU,IAElJ,GAAM,GAAO,KAAK,IAAI,EAAK,OAAO,GAAK,EAAU,GAAI,EAAK,OAAO,GAAK,EAAU,IAAM,IAEhF,EAAM,CAAC,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,MAAM,IAAI,AAAC,GAAO,CAElE,EAAG,GAAK,EAAU,GAAK,EACvB,EAAG,GAAK,EAAU,GAAK,EACvB,EAAG,KAGC,EAAS,EAAU,EAAW,EAAI,GAAI,EAAI,KAC5C,EAAS,EAAU,EAAW,EAAI,GAAI,EAAI,KACxC,EAAS,EAAU,EAAa,EAAQ,IAE9C,EAAS,EAAa,EAAQ,GAI9B,GAAM,GAAmF,CACvF,EAAO,GAAI,EAAO,GAAI,EAAO,GAC7B,EAAO,GAAI,EAAO,GAAI,EAAO,GAC7B,EAAO,GAAI,EAAO,GAAI,EAAO,IAEzB,EAAQ,EAA2B,GAInC,EAAO,EAAK,SAAW,IAAM,GAAc,GAAQ,CAAE,QAAS,EAAG,SAAU,GAEjF,MAAO,CAAE,QAAO,SAAQ,SAGb,GAAa,MAAO,EAAgC,IAAmC,CA9IpG,gBAiJE,GAAI,GACA,EACA,EACA,EACA,EACA,EACA,EACE,EAAuB,GAC7B,EAAO,MAAQ,WACf,EAAY,IACZ,GAAM,GAAQ,KAAM,AAAS,IAAQ,EAAO,EAAO,QAEnD,GADA,EAAO,YAAY,KAAO,KAAK,MAAM,IAAQ,GACzC,CAAC,EAAM,OAAS,EAAM,MAAM,SAAW,EAAG,MAAO,GACrD,GAAI,CAAC,EAAO,MAAO,GAEnB,OAAS,GAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CAKrC,GAJA,EAAO,QAAQ,YAIX,CAAC,EAAM,GAAG,QAAU,EAAM,GAAG,OAAO,mBAAuB,CAC7D,EAAI,2BAA4B,EAAM,GAAG,QACzC,SAGF,GAAM,GAAW,GAAmB,EAAM,GAAI,CAAC,EAAM,MAAM,GAAI,EAAM,MAAM,KAG3E,EAAO,QAAQ,kBACf,AAAI,EAAO,OAAO,MAChB,EAAa,EAAO,OAAO,KAAK,QAAQ,QAAU,AAAQ,GAAQ,EAAM,GAAG,QAAU,AAAG,SAAO,IAAK,EAAO,OAAQ,EAAG,EAAM,QAAU,GAEtI,GAAO,MAAQ,cACf,EAAY,IACZ,EAAa,EAAO,OAAO,KAAK,QAAQ,QAAU,KAAM,AAAQ,IAAQ,EAAM,GAAG,QAAU,AAAG,SAAO,IAAK,EAAO,OAAQ,EAAG,EAAM,QAAU,GAC5I,EAAO,YAAY,QAAU,KAAK,MAAM,IAAQ,IAElD,EAAO,QAAQ,gBAiBf,EAAO,QAAQ,sBACf,AAAI,EAAO,OAAO,MAChB,EAAU,EAAO,OAAO,KAAK,YAAY,QAAU,AAAQ,GAAQ,EAAM,GAAG,QAAU,AAAG,SAAO,IAAK,EAAO,OAAQ,EAAG,EAAM,QAAU,GAEvI,GAAO,MAAQ,kBACf,EAAY,IACZ,EAAU,EAAO,OAAO,KAAK,YAAY,QAAU,KAAM,AAAQ,IAAQ,EAAM,GAAG,QAAU,AAAG,SAAO,IAAK,EAAO,OAAQ,EAAG,EAAM,QAAU,GAC7I,EAAO,YAAY,UAAY,KAAK,MAAM,IAAQ,IAEpD,EAAO,QAAQ,oBAGX,EAAO,OAAO,OAChB,EAAC,EAAQ,EAAW,EAAY,EAAc,EAAS,GAAW,KAAM,SAAQ,IAAI,CAAC,EAAQ,EAAW,EAAY,EAAc,EAAS,KAG7I,EAAO,QAAQ,gBAIX,CAAC,EAAO,OAAO,KAAK,KAAK,SAAW,SAAM,KAAN,cAAU,cAAV,cAAuB,cAAe,SAAM,KAAN,cAAU,cAAV,cAAuB,eACnG,OAAO,GAAM,GAAG,YAAY,YAC5B,MAAO,GAAM,GAAG,YAAY,cAE9B,GAAM,GAAY,MAAM,GAAG,cAAT,cAAsB,cAAe,MAAM,GAAG,cAAT,cAAsB,cAEzE,KAAK,IAAI,KAAK,IAAI,EAAM,GAAG,YAAY,YAAY,GAAG,GAAK,EAAM,GAAG,YAAY,YAAY,GAAG,IAAK,KAAK,IAAI,EAAM,GAAG,YAAY,aAAa,GAAG,GAAK,EAAM,GAAG,YAAY,aAAa,GAAG,KAAO,EAAM,MAAM,GAC/M,EAGE,EAAS,EAAO,OAAO,KAAK,SAAS,OAAS,AAAG,UAAQ,EAAM,GAAG,QAAU,KAElF,AAAG,UAAQ,EAAM,GAAG,QAEhB,EAAM,GAAG,QAAQ,MAAO,GAAM,GAAG,OAErC,EAAQ,KAAK,IACR,EAAM,GACT,GAAI,EACJ,IAAK,EAAQ,IACb,OAAQ,EAAQ,OAChB,YAAa,EAAQ,YACrB,UAAW,EAAQ,WACnB,QAAS,EACT,KAAM,IAAa,EAAI,KAAK,MAAM,IAAM,EAAW,MAAQ,IAAM,EACjE,WACA,WAGF,EAAO,QAAQ,YAEjB,SAAO,QAAQ,iBACX,EAAO,OAAO,OACZ,GAAO,YAAY,MAAM,MAAO,GAAO,YAAY,KACnD,EAAO,YAAY,KAAK,MAAO,GAAO,YAAY,IAClD,EAAO,YAAY,QAAQ,MAAO,GAAO,YAAY,OACrD,EAAO,YAAY,SAAS,MAAO,GAAO,YAAY,SAErD,GC3NF,GAAM,IAAO,AAAC,GAAmB,CACtC,GAAI,CAAC,EAAK,MAAO,GACjB,GAAM,GAA0D,GAChE,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAAK,CAEnC,GAAM,GAAY,EAAI,GAAG,UAAU,KAAK,AAAC,GAAO,EAAE,OAAS,aACrD,EAAa,EAAI,GAAG,UAAU,KAAK,AAAC,GAAO,EAAE,OAAS,cACtD,EAAO,EAAI,GAAG,UAAU,KAAK,AAAC,GAAO,EAAE,OAAS,QACtD,AAAI,GAAQ,GAAa,GAAe,EAAU,SAAS,EAAI,EAAK,SAAS,GAAO,EAAW,SAAS,EAAI,EAAK,SAAS,EAAI,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,cAC3J,AAAI,GAAQ,GAAc,EAAU,SAAS,EAAI,EAAK,SAAS,EAAI,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,oBACjG,GAAQ,GAAe,EAAW,SAAS,EAAI,EAAK,SAAS,GAAI,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,qBAG5G,GAAM,GAAe,EAAI,GAAG,UAAU,KAAK,AAAC,GAAO,EAAE,OAAS,gBACxD,EAAgB,EAAI,GAAG,UAAU,KAAK,AAAC,GAAO,EAAE,OAAS,iBAC/D,AAAI,GAAgB,GAAe,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,WAAY,EAAa,SAAS,EAAI,EAAc,SAAS,EAAK,OAAS,YAElJ,MAAO,IAGI,GAAO,AAAC,GAAmB,CACtC,GAAI,CAAC,EAAK,MAAO,GACjB,GAAM,GAA0D,GAChE,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAC9B,GAAI,EAAI,GAAG,MAAQ,EAAI,GAAG,KAAK,OAAS,EAAG,CACzC,GAAM,GAAY,EAAI,GAAG,KAAK,IAAI,GAAK,EAAI,GAAG,KAAK,KAAK,GACxD,AAAI,KAAK,IAAI,GAAa,GAAI,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,kBAC3D,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,UAAU,EAAY,EAAI,OAAS,YAEtE,AADa,KAAK,IAAI,EAAI,GAAG,KAAK,KAAK,GAAK,EAAI,GAAG,KAAK,KAAK,IAAM,KAAK,IAAI,EAAI,GAAG,KAAK,KAAK,GAAK,EAAI,GAAG,KAAK,KAAK,IACxG,IAAK,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,mBAElD,AADc,KAAK,IAAI,EAAI,GAAG,KAAK,KAAK,GAAK,EAAI,GAAG,KAAK,KAAK,IAAM,KAAK,IAAI,EAAI,GAAG,KAAK,KAAK,GAAK,EAAI,GAAG,KAAK,KAAK,IACxG,IAAK,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,oBACvD,GAAM,GAAY,KAAK,IAAI,IAAK,IAAM,KAAK,IAAI,EAAI,GAAG,KAAK,IAAI,GAAK,EAAI,GAAG,KAAK,IAAI,IAAM,KAAK,IAAI,EAAI,GAAG,KAAK,IAAI,GAAK,EAAI,GAAG,KAAK,KAAK,KACzI,AAAI,EAAY,IAAI,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,SAAS,KAAK,MAAM,aAC1E,GAAM,GAAY,EAAI,GAAG,KAAK,KAAK,GACnC,AAAI,KAAK,IAAI,GAAa,IAAI,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,QAAQ,EAAY,EAAI,KAAO,WAGnG,MAAO,IAGI,GAAO,AAAC,GAAmB,CACtC,GAAI,CAAC,EAAK,MAAO,GACjB,GAAM,GAA0D,GAChE,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAAK,CACnC,GAAI,CAAC,EAAI,GAAG,aAAe,CAAC,EAAI,GAAG,YAAY,aAAe,CAAC,EAAI,GAAG,YAAY,aAAc,SAChG,GAAM,GAAY,EAAI,GAAG,YAAY,YAAY,GAAG,GAAK,EAAI,GAAG,YAAY,YAAY,GAAG,GACrF,EAAY,EAAI,GAAG,YAAY,YAAY,GAAG,GAAK,EAAI,GAAG,YAAY,YAAY,GAAG,GACrF,EAAW,KAAK,IAAI,EAAY,GAEhC,EAAa,EAAI,GAAG,YAAY,aAAa,GAAG,GAAK,EAAI,GAAG,YAAY,aAAa,GAAG,GACxF,EAAa,EAAI,GAAG,YAAY,aAAa,GAAG,GAAK,EAAI,GAAG,YAAY,aAAa,GAAG,GACxF,EAAY,KAAK,IAAI,EAAa,GAEpC,EAAS,GAEb,AAAI,AADe,KAAK,IAAI,EAAW,GAAa,KAAK,IAAI,EAAU,GACtD,KACf,GAAS,GACT,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,mBAGpC,GAAM,GAAmB,KAAK,IAAI,EAAI,GAAG,KAAK,IAAI,GAAK,EAAI,GAAG,YAAY,aAAa,GAAG,IAAM,EAAI,GAAG,IAAI,GACrG,EAAkB,KAAK,IAAI,EAAI,GAAG,KAAK,KAAK,GAAK,EAAI,GAAG,YAAY,YAAY,GAAG,IAAM,EAAI,GAAG,IAAI,GAC1G,AAAI,GAAkB,KAAQ,EAAmB,MAAM,GAAS,IAC5D,EAAkB,KAAM,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,kBAC1D,EAAmB,KAAM,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,iBAE/D,GAAM,GAAmB,KAAK,IAAI,EAAI,GAAG,KAAK,KAAK,GAAK,EAAI,GAAG,YAAY,aAAa,GAAG,IAAM,EAAI,GAAG,IAAI,GACtG,EAAkB,KAAK,IAAI,EAAI,GAAG,KAAK,KAAK,GAAK,EAAI,GAAG,YAAY,YAAY,GAAG,IAAM,EAAI,GAAG,IAAI,GAC1G,AAAI,GAAkB,KAAQ,EAAmB,KAAQ,EAAkB,MAAS,EAAmB,OAAO,GAAS,IACnH,GAAkB,KAAQ,EAAmB,MAAM,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,iBACrF,GAAkB,MAAS,EAAmB,OAAO,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,eAGvF,GAAQ,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,mBAEhD,MAAO,IAGI,GAAO,AAAC,GAAmB,CACtC,GAAI,CAAC,EAAK,MAAO,GACjB,GAAM,GAA0D,GAChE,OAAS,GAAI,EAAG,EAAI,EAAI,OAAQ,IAAK,CACnC,GAAM,GAAqD,GAC3D,OAAW,CAAC,EAAQ,IAAQ,QAAO,QAAQ,EAAI,GAAG,aAChD,AAAI,IAAW,YAAc,MAAM,QAAQ,IAAM,EAAQ,KAAK,CAAE,KAAM,EAAO,cAAe,SAAU,EAAI,KAE5G,GAAI,GAAW,EAAQ,OAAS,EAAG,CACjC,GAAM,GAAU,EAAQ,OAAO,CAAC,EAAM,IAAO,EAAK,SAAS,GAAK,EAAE,SAAS,GAAK,EAAO,GACvF,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,GAAG,EAAQ,iBAC7C,GAAM,GAAU,EAAQ,OAAO,CAAC,EAAM,IAAO,EAAK,SAAS,GAAK,EAAE,SAAS,GAAK,EAAO,GACvF,EAAS,KAAK,CAAE,KAAM,EAAG,QAAS,GAAG,EAAQ,aAGjD,MAAO,ICpIT,0IAgDO,GAAM,IAAuB,CAClC,MAAe,2BACf,WAAoB,yBACpB,YAAqB,QACrB,KAAc,6BACd,WAAoB,GACpB,UAAmB,EACnB,UAAmB,EACnB,UAAmB,EACnB,WAAqB,GACrB,WAAqB,GACrB,UAAoB,GACpB,aAAuB,GACvB,SAAmB,GACnB,aAAuB,GACvB,SAAmB,GACnB,UAAoB,GACpB,eAAyB,IAGrB,GAAU,AAAC,GAAU,KAAK,MAAO,EAAQ,IAAO,KAAK,IAE3D,YAAe,EAAK,EAAG,EAAG,EAAI,EAAG,EAAc,CAC7C,EAAI,UAAY,EAAa,UAAY,EAAI,QAAQ,MAAS,EAAI,MAAO,MAAS,EAAI,eAAkB,EAAa,MACrH,EAAI,YACJ,EAAI,IAAI,EAAG,EAAG,EAAa,UAAW,EAAG,EAAI,KAAK,IAClD,EAAI,OAGN,YAAc,EAAK,EAAG,EAAG,EAAO,EAAQ,EAAc,CAEpD,GADA,EAAI,YACA,EAAa,UAAW,CAC1B,GAAM,GAAM,GAAI,EAAI,GAAS,EACvB,EAAM,GAAI,EAAI,GAAU,EAC9B,EAAI,QAAQ,EAAI,EAAI,EAAQ,EAAG,EAAS,EAAG,EAAG,EAAG,EAAI,KAAK,QAE1D,GAAI,UAAY,EAAa,UAC7B,EAAI,OAAO,EAAI,EAAa,UAAW,GACvC,EAAI,OAAO,EAAI,EAAQ,EAAa,UAAW,GAC/C,EAAI,iBAAiB,EAAI,EAAO,EAAG,EAAI,EAAO,EAAI,EAAa,WAC/D,EAAI,OAAO,EAAI,EAAO,EAAI,EAAS,EAAa,WAChD,EAAI,iBAAiB,EAAI,EAAO,EAAI,EAAQ,EAAI,EAAQ,EAAa,UAAW,EAAI,GACpF,EAAI,OAAO,EAAI,EAAa,UAAW,EAAI,GAC3C,EAAI,iBAAiB,EAAG,EAAI,EAAQ,EAAG,EAAI,EAAS,EAAa,WACjE,EAAI,OAAO,EAAG,EAAI,EAAa,WAC/B,EAAI,iBAAiB,EAAG,EAAG,EAAI,EAAa,UAAW,GACvD,EAAI,YAEN,EAAI,SAGN,YAAe,EAAK,EAAsC,GAAI,EAAc,CAC1E,GAAI,MAAW,QAAa,EAAO,SAAW,GAC9C,GAAI,YACJ,EAAI,OAAO,EAAO,GAAG,GAAI,EAAO,GAAG,IACnC,OAAW,KAAM,GAAQ,CACvB,GAAM,GAAI,EAAG,IAAM,EACnB,EAAI,YAAc,EAAa,UAAY,EAAI,QAAQ,MAAS,EAAI,MAAO,MAAS,EAAI,eAAkB,EAAa,MACvH,EAAI,UAAY,EAAa,UAAY,EAAI,QAAQ,MAAS,EAAI,MAAO,MAAS,EAAI,eAAkB,EAAa,MACrH,EAAI,OAAO,EAAG,GAAI,KAAK,MAAM,EAAG,KAElC,EAAI,SACA,EAAa,cACf,GAAI,YACJ,EAAI,SAIR,YAAgB,EAAK,EAAsC,GAAI,EAAc,CAC3E,GAAI,MAAW,QAAa,EAAO,SAAW,GAC9C,IAAI,CAAC,EAAa,WAAa,EAAO,QAAU,EAAG,CACjD,GAAM,EAAK,EAAQ,GACnB,OAEF,EAAI,OAAO,EAAO,GAAG,GAAI,EAAO,GAAG,IACnC,OAAS,GAAI,EAAG,EAAI,EAAO,OAAS,EAAG,IAAK,CAC1C,GAAM,GAAM,GAAO,GAAG,GAAK,EAAO,EAAI,GAAG,IAAM,EACzC,EAAM,GAAO,GAAG,GAAK,EAAO,EAAI,GAAG,IAAM,EAC/C,EAAI,iBAAiB,EAAO,GAAG,GAAI,EAAO,GAAG,GAAI,EAAI,GAEvD,EAAI,iBAAiB,EAAO,EAAO,OAAS,GAAG,GAAI,EAAO,EAAO,OAAS,GAAG,GAAI,EAAO,EAAO,OAAS,GAAG,GAAI,EAAO,EAAO,OAAS,GAAG,IACzI,EAAI,SACA,EAAa,cACf,GAAI,YACJ,EAAI,SAIR,kBAA8B,EAA6B,EAAwB,EAA2B,CAC5G,GAAM,GAAe,EAAU,GAAS,GAExC,GADI,CAAC,GAAU,CAAC,GACZ,CAAE,aAAoB,oBAAoB,OAC9C,GAAM,GAAM,EAAS,WAAW,MAChC,GAAI,CAAC,EAAK,OACV,EAAI,KAAO,EAAa,KACxB,EAAI,UAAY,EAAa,MAC7B,GAAI,GAAI,EACR,OAAS,GAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CACtC,GAAI,GAAmB,GACnB,EAAkB,GAEtB,GADA,CAAC,EAAO,GAAQ,OAAO,QAAQ,EAAO,IACjC,EAAK,OAAS,GAAQ,EAAK,GAAc,OAAS,EAAI,CACzD,GAAM,GAAM,EAAM,GAAe,EAAI,IAAI,EAAM,KAAO,GAChD,EAAQ,GAAG,EAAM,MAAM,MAAQ,EAAK,KAC1C,AAAI,EAAa,aAAe,EAAa,cAAgB,IAC3D,GAAI,UAAY,EAAa,YAC7B,EAAI,SAAS,EAAO,EAAG,EAAK,EAAI,EAAa,aAE/C,EAAI,UAAY,EAAa,WAC7B,EAAI,SAAS,EAAO,EAAG,EAAK,EAAI,EAAa,YAC7C,GAAK,IAKX,kBAA2B,EAA6B,EAAqB,EAA2B,CAnKxG,YAoKE,GAAM,GAAe,EAAU,GAAS,GAExC,GADI,CAAC,GAAU,CAAC,GACZ,CAAE,aAAoB,oBAAoB,OAC9C,GAAM,GAAM,EAAS,WAAW,MAChC,GAAI,EAAC,EACL,OAAW,KAAK,GAAQ,CACtB,EAAI,KAAO,EAAa,KACxB,EAAI,YAAc,EAAa,MAC/B,EAAI,UAAY,EAAa,MACzB,EAAa,WAAW,GAAK,EAAK,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,GAE9E,GAAM,GAAkB,GAKxB,GAJA,EAAO,KAAK,SAAS,KAAK,MAAM,IAAM,EAAE,WACpC,EAAE,aAAa,EAAO,KAAK,GAAG,EAAE,QAAU,MAAM,KAAK,MAAM,IAAM,EAAE,iBACnE,EAAE,KAAK,EAAO,KAAK,QAAQ,EAAE,KAAO,MACpC,EAAE,MAAM,EAAO,KAAK,aAAa,EAAE,QACnC,EAAE,SAAW,EAAE,QAAQ,OAAS,EAAG,CACrC,GAAM,GAAU,EAAE,QAAQ,IAAI,AAAC,GAAM,GAAG,KAAK,MAAM,IAAM,EAAE,WAAW,EAAE,WACxE,AAAI,EAAQ,OAAS,GAAG,GAAQ,OAAS,GACzC,EAAO,KAAK,EAAQ,KAAK,MAE3B,AAAI,EAAE,UAAY,EAAE,SAAS,OAAS,EAAE,SAAS,MAC3C,GAAE,SAAS,MAAM,MAAM,EAAO,KAAK,SAAS,GAAQ,EAAE,SAAS,MAAM,iBAAc,GAAQ,EAAE,SAAS,MAAM,kBAAe,GAAQ,EAAE,SAAS,MAAM,cACpJ,EAAE,SAAS,KAAK,SAAS,EAAO,KAAK,SAAS,GAAQ,EAAE,SAAS,KAAK,iBAExE,EAAO,SAAW,GAAG,EAAO,KAAK,QACrC,EAAI,UAAY,EAAa,MAC7B,OAAS,GAAI,EAAO,OAAS,EAAG,GAAK,EAAG,IAAK,CAC3C,GAAM,GAAI,KAAK,IAAI,EAAE,IAAI,GAAI,GACvB,EAAI,EAAI,EAAa,WAAa,EAAE,IAAI,GAC9C,AAAI,EAAa,aAAe,EAAa,cAAgB,IAC3D,GAAI,UAAY,EAAa,YAC7B,EAAI,SAAS,EAAO,GAAI,EAAI,EAAG,EAAI,KAErC,EAAI,UAAY,EAAa,WAC7B,EAAI,SAAS,EAAO,GAAI,EAAI,EAAG,EAAI,IAGrC,GADA,EAAI,UAAY,EACZ,EAAE,MAAQ,EAAE,KAAK,OAAS,EAAG,CAC/B,GAAI,EAAa,WACf,OAAW,KAAM,GAAE,KAAM,GAAM,EAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAG3D,GAAI,EAAa,aAAc,CAC7B,EAAI,UAAY,EAChB,OAAS,GAAI,EAAG,EAAI,GAAc,OAAS,EAAG,IAAK,CACjD,GAAM,GAAS,CACb,GAAc,EAAI,EAAI,GACtB,GAAc,EAAI,EAAI,GACtB,GAAc,EAAI,EAAI,IACtB,IAAI,AAAC,GAAU,EAAE,KAAK,IACxB,GAAM,EAAK,EAAQ,GAGrB,GAAI,EAAE,aAAe,EAAE,YAAY,YAAgB,CACjD,EAAI,YAAc,EAAa,SAAW,2BAA6B,EAAa,MACpF,EAAI,YACJ,GAAM,GAAQ,KAAK,IAAI,EAAE,YAAY,YAAe,GAAG,GAAK,EAAE,YAAY,YAAe,GAAG,IAAM,EAC5F,EAAQ,KAAK,IAAI,EAAE,YAAY,YAAe,GAAG,GAAK,EAAE,YAAY,YAAe,GAAG,IAAM,EAClG,EAAI,QAAQ,EAAE,YAAY,YAAe,GAAG,GAAI,EAAE,YAAY,YAAe,GAAG,GAAI,EAAO,EAAO,EAAG,EAAG,EAAI,KAAK,IACjH,EAAI,SACA,EAAa,cACf,GAAI,UAAY,EAAa,SAAW,2BAA6B,EAAa,MAClF,EAAI,QAGR,GAAI,EAAE,aAAe,EAAE,YAAY,aAAiB,CAClD,EAAI,YAAc,EAAa,SAAW,2BAA6B,EAAa,MACpF,EAAI,YACJ,GAAM,GAAQ,KAAK,IAAI,EAAE,YAAY,aAAgB,GAAG,GAAK,EAAE,YAAY,aAAgB,GAAG,IAAM,EAC9F,EAAQ,KAAK,IAAI,EAAE,YAAY,aAAgB,GAAG,GAAK,EAAE,YAAY,aAAgB,GAAG,IAAM,EACpG,EAAI,QAAQ,EAAE,YAAY,aAAgB,GAAG,GAAI,EAAE,YAAY,aAAgB,GAAG,GAAI,EAAO,EAAO,EAAG,EAAG,EAAI,KAAK,IACnH,EAAI,SACA,EAAa,cACf,GAAI,UAAY,EAAa,SAAW,2BAA6B,EAAa,MAClF,EAAI,QAGR,GAAI,EAAa,UAAY,SAAE,WAAF,cAAY,OAAZ,cAAkB,WAAY,SAAE,WAAF,cAAY,OAAZ,cAAkB,UAAW,EAAE,YAAY,aAAkB,EAAE,YAAY,cAAmB,EAAE,YAAY,YAAe,IAAM,EAAE,YAAY,aAAgB,GAAI,CAC5N,EAAI,YAAc,OAClB,EAAI,YAEJ,GAAM,GAAW,CACf,EAAE,YAAY,YAAe,GAAG,GAAM,KAAK,IAAI,EAAE,SAAS,KAAK,SAAW,EAAE,SAAS,KAAK,SAAW,EAAE,IAAI,GAC3G,EAAE,YAAY,YAAe,GAAG,GAAM,KAAK,IAAI,EAAE,SAAS,KAAK,SAAW,EAAE,SAAS,KAAK,SAAW,EAAE,IAAI,IAE7G,EAAI,OAAO,EAAE,YAAY,YAAe,GAAG,GAAI,EAAE,YAAY,YAAe,GAAG,IAC/E,EAAI,OAAO,EAAS,GAAI,EAAS,IAEjC,GAAM,GAAY,CAChB,EAAE,YAAY,aAAgB,GAAG,GAAM,KAAK,IAAI,EAAE,SAAS,KAAK,SAAW,EAAE,SAAS,KAAK,SAAW,EAAE,IAAI,GAC5G,EAAE,YAAY,aAAgB,GAAG,GAAM,KAAK,IAAI,EAAE,SAAS,KAAK,SAAW,EAAE,SAAS,KAAK,SAAW,EAAE,IAAI,IAE9G,EAAI,OAAO,EAAE,YAAY,aAAgB,GAAG,GAAI,EAAE,YAAY,aAAgB,GAAG,IACjF,EAAI,OAAO,EAAU,GAAI,EAAU,IAEnC,EAAI,aAOd,kBAA2B,EAA6B,EAAqB,EAA2B,CA3QxG,MA4QE,GAAM,GAAe,EAAU,GAAS,GAExC,GADI,CAAC,GAAU,CAAC,GACZ,CAAE,aAAoB,oBAAoB,OAC9C,GAAM,GAAM,EAAS,WAAW,MAChC,GAAI,EAAC,EACL,GAAI,SAAW,QACf,OAAS,GAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CAmBtC,GAlBA,EAAI,YAAc,EAAa,MAC/B,EAAI,UAAY,EAAa,MAC7B,EAAI,UAAY,EAAa,UAC7B,EAAI,KAAO,EAAa,KACpB,EAAa,WAAa,EAAO,GAAG,KAAO,MAAO,GAAG,MAAV,cAAe,UAAW,GAEvE,IAAK,EAAK,EAAO,GAAG,IAAI,GAAI,EAAO,GAAG,IAAI,GAAI,EAAO,GAAG,IAAI,GAAI,EAAO,GAAG,IAAI,GAAI,GAC9E,EAAa,YACX,GAAa,aAAe,EAAa,cAAgB,IAC3D,GAAI,UAAY,EAAa,YAE7B,EAAI,SAAS,QAAQ,IAAM,EAAO,GAAG,SAAU,EAAO,GAAG,IAAI,GAAK,EAAG,EAAI,EAAO,GAAG,IAAI,GAAK,EAAa,WAAY,EAAO,GAAG,IAAI,KAErI,EAAI,UAAY,EAAa,WAE7B,EAAI,SAAS,QAAQ,IAAM,EAAO,GAAG,SAAU,EAAO,GAAG,IAAI,GAAK,EAAG,EAAI,EAAO,GAAG,IAAI,GAAK,EAAa,WAAY,EAAO,GAAG,IAAI,MAGnI,EAAa,WACf,OAAS,GAAK,EAAG,EAAK,EAAO,GAAG,UAAU,OAAQ,IAChD,EAAI,UAAY,EAAa,UAAY,EAAO,GAAG,UAAU,GAAI,SAAS,GAAK,QAAQ,MAAS,EAAK,GAAO,GAAG,UAAU,GAAI,SAAS,IAAM,OAAQ,MAAS,EAAK,GAAO,GAAG,UAAU,GAAI,SAAS,IAAM,gBAAmB,EAAa,MACzO,GAAM,EAAK,EAAO,GAAG,UAAU,GAAI,SAAS,GAAI,EAAO,GAAG,UAAU,GAAI,SAAS,GAAI,EAAG,GAG5F,GAAI,EAAa,YACf,GAAI,KAAO,EAAa,KACpB,EAAO,GAAG,WACZ,OAAW,KAAM,GAAO,GAAG,UACzB,EAAI,UAAY,EAAa,UAAY,EAAG,SAAS,GAAK,QAAQ,MAAS,EAAI,EAAG,SAAS,OAAQ,MAAS,EAAI,EAAG,SAAS,gBAAmB,EAAa,MAC5J,EAAI,SAAS,GAAG,EAAG,QAAQ,KAAK,MAAM,IAAM,EAAG,UAAW,EAAG,SAAS,GAAK,EAAG,EAAG,SAAS,GAAK,GAIrG,GAAI,EAAa,cAAgB,EAAO,GAAG,UAAW,CACpD,GAAI,GACE,EAAsC,GAE5C,EAAO,OAAS,EAChB,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,gBAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,iBAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,GAAO,EAAK,EAAQ,GAEpB,EAAO,OAAS,EAChB,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,iBAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,WAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,gBAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACnD,EAAO,SAAW,GAAG,GAAM,EAAK,EAAQ,GAE5C,EAAO,OAAS,EAChB,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,WAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,aAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,GAAO,EAAK,EAAQ,GAEpB,EAAO,OAAS,EAChB,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,aAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,cAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,aAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,aAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,GAAO,EAAK,EAAQ,GAEpB,EAAO,OAAS,EAChB,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,gBAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,aAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,aAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,YAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,GAAO,EAAK,EAAQ,GAEpB,EAAO,OAAS,EAChB,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,iBAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,cAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,cAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,EAAO,EAAO,GAAG,UAAU,KAAK,AAAC,GAAM,EAAE,OAAS,aAC9C,GAAM,EAAO,KAAK,CAAC,EAAK,SAAS,GAAI,EAAK,SAAS,KACvD,GAAO,EAAK,EAAQ,MAM1B,kBAA2B,EAA6B,EAAqB,EAA2B,CACtG,GAAM,GAAe,EAAU,GAAS,GAExC,GADI,CAAC,GAAU,CAAC,GACZ,CAAE,aAAoB,oBAAoB,OAC9C,GAAM,GAAM,EAAS,WAAW,MAChC,GAAI,EAAC,EACL,GAAI,SAAW,QACf,EAAI,KAAO,EAAa,KACxB,OAAW,KAAK,GAAQ,CAetB,GAdI,EAAa,WACf,GAAI,YAAc,EAAa,MAC/B,EAAI,UAAY,EAAa,MAC7B,GAAK,EAAK,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,GAC9C,EAAa,YACX,GAAa,aAAe,EAAa,cAAgB,IAC3D,GAAI,UAAY,EAAa,YAC7B,EAAI,SAAS,OAAQ,EAAE,IAAI,GAAK,EAAG,EAAI,EAAE,IAAI,GAAK,EAAa,WAAY,EAAE,IAAI,KAEnF,EAAI,UAAY,EAAa,WAC7B,EAAI,SAAS,OAAQ,EAAE,IAAI,GAAK,EAAG,EAAI,EAAE,IAAI,GAAK,EAAa,WAAY,EAAE,IAAI,KAEnF,EAAI,UAEF,EAAa,YACX,EAAE,WAAa,EAAE,UAAU,OAAS,EACtC,OAAW,KAAM,GAAE,UACjB,EAAI,UAAY,EAAa,SAAW,QAAQ,MAAS,EAAI,EAAG,OAAQ,MAAS,EAAI,EAAG,gBAAmB,EAAa,MACxH,GAAM,EAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAIlC,GAAI,EAAa,WAAY,CAC3B,GAAM,GAAe,CAAC,EAAM,IAAU,CACpC,EAAI,UAAY,EAAa,SAAW,QAAQ,MAAS,EAAI,EAAK,EAAK,OAAS,GAAG,OAAQ,MAAS,EAAI,EAAK,EAAK,OAAS,GAAG,gBAAmB,EAAa,MAC9J,EAAI,SAAS,EAAO,EAAK,EAAK,OAAS,GAAG,GAAK,EAAG,EAAK,EAAK,OAAS,GAAG,GAAK,IAE/E,EAAI,KAAO,EAAa,KACxB,EAAa,EAAE,YAAY,YAAgB,SAC3C,EAAa,EAAE,YAAY,aAAiB,UAC5C,EAAa,EAAE,YAAY,WAAe,QAC1C,EAAa,EAAE,YAAY,MAAU,SACrC,EAAa,EAAE,YAAY,MAAU,SACrC,EAAa,EAAE,YAAY,SAAa,QAE1C,GAAI,EAAa,aAAc,CAC7B,GAAM,GAAc,AAAC,GAAS,CAC5B,GAAI,EAAC,EACL,OAAS,GAAI,EAAG,EAAI,EAAK,OAAQ,IAC/B,EAAI,YACJ,EAAI,YAAc,EAAa,SAAW,QAAQ,MAAS,EAAI,EAAK,GAAG,OAAQ,MAAS,EAAI,EAAK,GAAG,gBAAmB,EAAa,MACpI,EAAI,OAAO,EAAK,EAAI,EAAI,EAAI,EAAI,GAAG,GAAI,EAAK,EAAI,EAAI,EAAI,EAAI,GAAG,IAC/D,EAAI,OAAO,EAAK,GAAG,GAAI,EAAK,GAAG,IAC/B,EAAI,UAGR,EAAI,UAAY,EAAa,UAC7B,EAAY,EAAE,YAAY,aAC1B,EAAY,EAAE,YAAY,cAC1B,EAAY,EAAE,YAAY,YAC1B,EAAY,EAAE,YAAY,OAC1B,EAAY,EAAE,YAAY,UAMhC,kBAA6B,EAA6B,EAAqB,EAA2B,CACxG,GAAM,GAAe,EAAU,GAAS,GAExC,GADI,CAAC,GAAU,CAAC,GACZ,CAAE,aAAoB,oBAAoB,OAC9C,GAAM,GAAM,EAAS,WAAW,MAChC,GAAI,EAAC,EACL,GAAI,SAAW,QACf,EAAI,KAAO,EAAa,KACxB,OAAW,KAAK,GACd,GAAI,EAAa,UAAW,CAI1B,GAHA,EAAI,YAAc,EAAa,MAC/B,EAAI,UAAY,EAAa,MAC7B,GAAK,EAAK,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,EAAE,IAAI,GAAI,GAC9C,EAAa,WAAY,CAC3B,GAAM,GAAQ,GAAG,EAAE,SAAS,KAAK,MAAM,IAAM,EAAE,UAC/C,AAAI,EAAa,aAAe,EAAa,cAAgB,IAC3D,GAAI,UAAY,EAAa,YAC7B,EAAI,SAAS,EAAO,EAAE,IAAI,GAAK,EAAG,EAAI,EAAE,IAAI,GAAK,EAAa,WAAY,EAAE,IAAI,KAElF,EAAI,UAAY,EAAa,WAC7B,EAAI,SAAS,EAAO,EAAE,IAAI,GAAK,EAAG,EAAI,EAAE,IAAI,GAAK,EAAa,WAAY,EAAE,IAAI,IAElF,EAAI,WAKV,kBAA6B,EAA6B,EAAuB,EAA2B,CAC1G,GAAM,GAAe,EAAU,GAAS,GAExC,GADI,CAAC,GAAU,CAAC,GACZ,CAAE,aAAoB,oBAAoB,OAC9C,GAAM,GAAM,EAAS,WAAW,MAChC,GAAI,EAAC,EACL,GAAI,SAAW,QACf,EAAI,KAAO,EAAa,KAExB,OAAS,GAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,GAAI,EAAa,UAAW,CAI1B,GAHA,EAAI,YAAc,EAAa,MAC/B,EAAI,UAAY,EAAa,MAC7B,GAAK,EAAK,EAAO,GAAG,IAAI,GAAI,EAAO,GAAG,IAAI,GAAI,EAAO,GAAG,IAAI,GAAI,EAAO,GAAG,IAAI,GAAI,GAC9E,EAAa,WAAY,CAC3B,GAAM,GAAQ,WAAW,IACzB,AAAI,EAAa,aAAe,EAAa,cAAgB,IAC3D,GAAI,UAAY,EAAa,YAC7B,EAAI,SAAS,EAAO,EAAO,GAAG,IAAI,GAAK,EAAG,EAAI,EAAO,GAAG,IAAI,GAAK,EAAa,WAAY,EAAO,GAAG,IAAI,KAE1G,EAAI,UAAY,EAAa,WAC7B,EAAI,SAAS,EAAO,EAAO,GAAG,IAAI,GAAK,EAAG,EAAI,EAAO,GAAG,IAAI,GAAK,EAAa,WAAY,EAAO,GAAG,IAAI,IAE1G,EAAI,WAKV,kBAA6B,EAA6B,EAA8B,CAEtF,GADI,CAAC,GAAY,CAAC,GACd,CAAE,aAAoB,qBAAsB,CAAE,aAAqB,oBAAoB,OAC3F,GAAM,GAAS,EAAS,WAAW,MACnC,WAAQ,UAAU,EAAU,EAAG,GAGjC,kBAA0B,EAA6B,EAAgB,EAA2B,CAChG,GAAM,GAAY,IACZ,EAAe,EAAU,GAAS,GACxC,AAAI,CAAC,GAAU,CAAC,GACV,YAAoB,oBAE1B,IAAK,EAAU,EAAO,KAAM,GAC5B,GAAK,EAAU,EAAO,KAAM,GAC5B,GAAK,EAAU,EAAO,KAAM,GAC5B,GAAO,EAAU,EAAO,OAAQ,GAEhC,GAAQ,EAAU,EAAO,QAAS,GAelC,EAAO,YAAY,KAAO,KAAK,MAAM,IAAQ,IClhBxC,YAAc,EAAoB,EAAqB,EAAoB,EAA0B,EAAiD,CAN7J,oCAOE,GAAI,GAAK,EACH,EAAyB,GAC/B,OAAW,KAAQ,GAAO,CACxB,GAAM,GAAiB,CAAE,GAAI,IAAM,OAAM,KAAM,KAAM,MAAO,CAAE,KAAM,KAAM,MAAO,MAAQ,SAAU,GAAI,IAAK,CAAC,EAAG,EAAG,EAAG,IACtH,OAAW,KAAQ,GACjB,AAAI,EAAK,IAAI,GAAK,EAAK,IAAI,IACtB,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAK,IAAI,IACrC,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAK,IAAI,IACrC,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAK,IAAI,IACtD,GAAO,KAAO,GAGlB,GAAI,EAAO,KACT,OAAW,KAAQ,GACjB,AAAI,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IAC3C,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IACjE,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IAC5C,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IAChE,EAAO,OAAO,GAAO,MAAM,KAAO,GAEpC,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IAClD,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IAC9B,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IAC5C,EAAK,IAAI,GAAK,EAAK,IAAI,GAAK,EAAO,KAAK,IAAI,GAAK,EAAO,KAAK,IAAI,IAChE,EAAO,OAAO,GAAO,MAAM,MAAQ,GAI7C,OAAW,KAAW,GACpB,AAAI,EAAQ,OAAY,QAAa,EAAQ,OAAY,EAAK,GAAI,KAAO,WAAP,QAAiB,KAAK,GACnF,AAAI,EAAQ,OAAY,QAAa,EAAQ,OAAY,EAAK,GAAI,KAAO,WAAP,QAAiB,KAAK,GACxF,AAAI,EAAQ,OAAY,QAAa,EAAQ,OAAY,MAAO,OAAP,cAAa,IAAI,KAAO,WAAP,QAAiB,KAAK,GAChG,AAAI,EAAQ,OAAY,QAAa,EAAQ,OAAY,SAAO,QAAP,cAAc,OAAd,cAAoB,IAAI,KAAO,WAAP,QAAiB,KAAK,GACnG,EAAQ,OAAY,QAAa,EAAQ,OAAY,SAAO,QAAP,cAAc,QAAd,cAAqB,KAAI,MAAO,WAAP,QAAiB,KAAK,IAI/G,GAAM,GAAc,GACd,EAAc,GACd,EAAY,AAAC,GAAQ,CACzB,AAAI,GAAO,EAAI,SAAW,GACxB,GAAE,KAAK,EAAI,GAAI,EAAI,GAAK,EAAI,IAC5B,EAAE,KAAK,EAAI,GAAI,EAAI,GAAK,EAAI,MAGhC,EAAU,KAAO,OAAP,cAAa,KACvB,EAAU,KAAO,OAAP,cAAa,KACvB,EAAU,QAAO,QAAP,cAAc,OAAd,cAAoB,KAC9B,EAAU,QAAO,QAAP,cAAc,QAAd,cAAqB,KAC/B,GAAM,GAAO,KAAK,IAAI,GAAG,GACnB,EAAO,KAAK,IAAI,GAAG,GACzB,EAAO,IAAM,CAAC,EAAM,EAAM,KAAK,IAAI,GAAG,GAAK,EAAM,KAAK,IAAI,GAAG,GAAK,GAG9D,GAAS,EAAM,SAAW,GAAG,GAAO,OAAS,CAAC,EAAO,IAAI,GAAK,EAAM,GAAI,EAAO,IAAI,GAAK,EAAM,GAAI,EAAO,IAAI,GAAK,EAAM,GAAI,EAAO,IAAI,GAAK,EAAM,KAEtJ,EAAQ,KAAK,GAEf,MAAO,GC3DT,GAAM,GAAyB,CAAE,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,QAAS,GAAI,OAAQ,GAAI,QAAS,GAAI,YAAa,GAAI,UAAW,GAE1H,YAAc,EAA2B,CARhD,8CAaE,GAAM,GAAU,KAAK,MAAQ,EAAU,UAQjC,EAAiB,EAAU,IAAO,EAAI,KAAK,IAAI,GAAW,EAKhE,GAHA,EAAe,OAAS,EAAU,OAG9B,CAAC,EAAe,MAAS,EAAU,KAAK,SAAW,EAAe,KAAK,OACzE,EAAe,KAAO,KAAK,MAAM,KAAK,UAAU,EAAU,WAE1D,QAAS,GAAI,EAAG,EAAI,EAAU,KAAK,OAAQ,IAAK,CAC9C,GAAM,GAAM,EAAU,KAAK,GAAG,IAC3B,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,KAAK,GAAG,IAAI,GAAK,GAAK,GACxE,EAAS,EAAU,KAAK,GAAG,OAC9B,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,KAAK,GAAG,OAAO,GAAK,GAAK,GAC3E,EAAa,EAAU,KAAK,GAAG,UAClC,IAAI,CAAC,EAAU,IAAO,EACrB,MAAO,EAAS,MAChB,KAAM,EAAS,KACf,SAAU,CACR,EAAe,KAAK,GAAG,UAAU,GAAO,IAAiB,GAAK,EAAe,KAAK,GAAG,UAAU,GAAG,SAAS,GAAK,EAAS,SAAS,IAAM,EAAiB,EAAS,SAAS,GAC3K,EAAe,KAAK,GAAG,UAAU,GAAO,IAAiB,GAAK,EAAe,KAAK,GAAG,UAAU,GAAG,SAAS,GAAK,EAAS,SAAS,IAAM,EAAiB,EAAS,SAAS,IAE7K,YAAa,CACX,EAAe,KAAK,GAAG,UAAU,GAAO,IAAiB,GAAK,EAAe,KAAK,GAAG,UAAU,GAAG,YAAY,GAAK,EAAS,YAAY,IAAM,EAAiB,EAAS,SAAS,GACjL,EAAe,KAAK,GAAG,UAAU,GAAO,IAAiB,GAAK,EAAe,KAAK,GAAG,UAAU,GAAG,YAAY,GAAK,EAAS,YAAY,IAAM,EAAiB,EAAS,SAAS,OAGvL,EAAe,KAAK,GAAK,IAAK,EAAU,KAAK,GAAI,MAAK,SAAQ,aAKlE,GAAI,CAAC,EAAe,MAAS,EAAU,KAAK,SAAW,EAAe,KAAK,OACzE,EAAe,KAAO,KAAK,MAAM,KAAK,UAAU,EAAU,WAE1D,QAAS,GAAI,EAAG,EAAI,EAAU,KAAK,OAAQ,IAAK,CAC9C,GAAM,GAAO,EAAU,KAAK,GAAG,IAC5B,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,KAAK,GAAG,IAAI,GAAK,GAAK,GACxE,EAAU,EAAU,KAAK,GAAG,OAC/B,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,KAAK,GAAG,OAAO,GAAK,GAAK,GAC3E,EAAY,EAAU,KAAK,GAAG,UACjC,IAAI,CAAC,EAAU,IAAM,EACnB,IAAI,CAAC,GAAO,KAAS,IAAiB,GAAK,EAAe,KAAK,GAAG,UAAU,GAAG,IAAK,IAAS,IAC5F,EAAO,OAAO,KAAK,EAAU,KAAK,GAAG,aACrC,EAAc,GACpB,OAAW,KAAO,GAChB,EAAY,GAAO,EAAU,KAAK,GAAG,YAAY,GAC9C,IAAI,CAAC,EAAK,KAAM,EAAI,IAAI,CAAC,GAAO,KAAQ,IAAiB,GAAK,EAAe,KAAK,GAAG,YAAY,GAAK,IAAG,IAAK,IAAS,IAE5H,EAAe,KAAK,GAAK,IAAK,EAAU,KAAK,GAAI,MAAK,SAAQ,YAAW,eAK7E,GAAI,CAAC,EAAe,MAAS,EAAU,KAAK,SAAW,EAAe,KAAK,OACzE,EAAe,KAAO,KAAK,MAAM,KAAK,UAAU,EAAU,WAE1D,QAAS,GAAI,EAAG,EAAI,EAAU,KAAK,OAAQ,IAAK,CAC9C,GAAM,GAAO,EAAU,KAAK,GAAG,IAC5B,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,KAAK,GAAG,IAAI,GAAK,GAAK,GACxE,EAAU,EAAU,KAAK,GAAG,OAC/B,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,KAAK,GAAG,OAAO,GAAK,GAAK,GAC3E,EAIF,CAAE,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,MAAO,CAAE,KAAM,EAAG,IAAK,EAAG,MAAO,GAAK,KAAM,CAAE,QAAS,EAAG,SAAU,IAC/G,EAAS,OAAS,KAAU,KAAK,GAAG,WAAlB,cAA4B,OAC9C,EAAS,MAAQ,CACf,KAAQ,IAAiB,GAAM,UAAe,KAAK,GAAG,WAAvB,cAAiC,QAAjC,cAAwC,OAAQ,GAAM,UAAU,KAAK,GAAG,WAAlB,cAA4B,QAA5B,cAAmC,OAAQ,IAAM,EACtI,IAAO,IAAiB,GAAM,UAAe,KAAK,GAAG,WAAvB,cAAiC,QAAjC,cAAwC,MAAO,GAAM,UAAU,KAAK,GAAG,WAAlB,cAA4B,QAA5B,cAAmC,MAAO,IAAM,EACnI,MAAS,IAAiB,GAAM,UAAe,KAAK,GAAG,WAAvB,cAAiC,QAAjC,cAAwC,QAAS,GAAM,UAAU,KAAK,GAAG,WAAlB,cAA4B,QAA5B,cAAmC,QAAS,IAAM,GAE3I,EAAS,KAAO,CAEd,QAAW,IAAiB,GAAM,UAAe,KAAK,GAAG,WAAvB,cAAiC,OAAjC,cAAuC,UAAW,GAAM,UAAU,KAAK,GAAG,WAAlB,cAA4B,OAA5B,cAAkC,UAAW,IAAM,EAC7I,SAAY,IAAiB,GAAM,UAAe,KAAK,GAAG,WAAvB,cAAiC,OAAjC,cAAuC,WAAY,GAAM,UAAU,KAAK,GAAG,WAAlB,cAA4B,OAA5B,cAAkC,WAAY,IAAM,GAElJ,EAAe,KAAK,GAAK,IAAK,EAAU,KAAK,GAAI,WAAU,MAAK,UAKpE,GAAI,CAAC,EAAe,QAAW,EAAU,OAAO,SAAW,EAAe,OAAO,OAC/E,EAAe,OAAS,KAAK,MAAM,KAAK,UAAU,EAAU,aAE5D,QAAS,GAAI,EAAG,EAAI,EAAU,OAAO,OAAQ,IAAK,CAChD,GAAM,GAAO,EAAU,OAAO,GAAG,IAC9B,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,OAAO,GAAG,IAAI,GAAK,GAAK,GAC1E,EAAU,EAAU,OAAO,GAAG,OACjC,IAAI,CAAC,EAAG,IAAQ,IAAiB,GAAK,EAAe,OAAO,GAAG,OAAO,GAAK,GAAK,GACnF,EAAe,OAAO,GAAK,IAAK,EAAU,OAAO,GAAI,MAAK,UAK9D,GAAI,EAAU,QAAS,CACrB,GAAM,GAAa,EAAU,QAC7B,GAAI,CAAC,EAAe,SAAY,EAAW,SAAW,EAAe,QAAQ,OAC3E,EAAe,QAAU,KAAK,MAAM,KAAK,UAAU,QAEnD,QAAS,GAAI,EAAG,EAAI,EAAW,OAAQ,IACrC,EAAe,QAAQ,GAAG,IAAO,EAAW,GAAG,IAC5C,IAAI,CAAC,EAAK,IAAQ,IAAiB,GAAK,EAAe,QAAQ,GAAG,IAAI,GAAK,GAAO,GAM3F,MAAI,GAAU,SAAS,GAAe,QAAU,EAAU,SACtD,EAAU,aAAa,GAAe,YAAc,EAAU,aAE3D,EC/HF,GAAM,IAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kEA0JP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
  "names": []
}