1{"version":3,"file":"codeMod.js","names":["addObjcImports","source","imports","lines","split","lineIndexWithFirstImport","findIndex","line","match","importElement","includes","importStatement","splice","join","findObjcInterfaceCodeBlock","contents","declaration","start","search","RegExp","end","indexOf","code","substring","findObjcFunctionCodeBlock","selector","symbols","argsCount","length","pattern","i","argSymbol","findMatchingBracketPosition","insertContentsInsideObjcFunctionBlock","srcContents","insertion","options","insertContentsInsideFunctionBlock","insertContentsInsideObjcInterfaceBlock","codeBlock","position","firstNewLineIndex","insertContentsAtOffset","endLen","findSwiftFunctionCodeBlock","parenthesesIndex","funcName","argLabels","searchOffset","funcCandidateRegExp","funcCandidateOffset","searchFromOffset","paramsStartOffset","paramsEndOffset","paramsString","params","map","parseSwiftFunctionParam","argumentLabel","codeBlockStart","codeBlockEnd","paramTuple","semiIndex","parameterName","typeString","trim","insertContentsInsideSwiftClassBlock","Error","firstBracketIndex","endBracketIndex","insertContentsInsideSwiftFunctionBlock","language","indent","repeat","lastReturnIndex","lastIndexOf"],"sources":["../../src/ios/codeMod.ts"],"sourcesContent":["import { CodeBlock, insertContentsAtOffset, searchFromOffset } from '../utils/commonCodeMod';\nimport { findMatchingBracketPosition } from '../utils/matchBrackets';\n\ninterface SwiftFunctionParam {\n  argumentLabel: string;\n  parameterName: string;\n  typeString: string;\n}\n\ninterface InsertContentFunctionOptions {\n  position: 'head' | 'tail' | 'tailBeforeLastReturn';\n  indent?: number;\n}\n\n/**\n * Add Objective-C import\n * @param source source contents\n * @param imports array of imports, e.g. ['<Foundation/Foundation.h>']\n * @returns updated contents\n */\nexport function addObjcImports(source: string, imports: string[]): string {\n  const lines = source.split('\\n');\n  // Try to insert statements after first #import where would probably not in #if block\n  const lineIndexWithFirstImport = lines.findIndex((line) => line.match(/^#import .*$/));\n  for (const importElement of imports) {\n    if (!source.includes(importElement)) {\n      const importStatement = `#import ${importElement}`;\n      lines.splice(lineIndexWithFirstImport + 1, 0, importStatement);\n    }\n  }\n  return lines.join('\\n');\n}\n\n/**\n * Find code block of Objective-C interface or implementation\n *\n * @param contents source contents\n * @param declaration interface/implementation, e.g. '@interface Foo'\n * @returns found CodeBlock, or null if not found\n */\nexport function findObjcInterfaceCodeBlock(\n  contents: string,\n  declaration: string\n): CodeBlock | null {\n  const start = contents.search(new RegExp(`^${declaration}\\\\W`, 'm'));\n  if (start < 0) {\n    return null;\n  }\n\n  let end = contents.indexOf('\\n@end', start);\n  end += 5; // '\\n@end'.length === 5\n\n  return {\n    start,\n    end,\n    code: contents.substring(start, end),\n  };\n}\n\n/**\n * Find code block of Objective-C function without declaration, will return only {} block\n *\n * @param contents source contents\n * @param selector function selector, e.g. 'doSomething:withSomeValue:'\n * @returns found CodeBlock, or null if not found.\n */\nexport function findObjcFunctionCodeBlock(contents: string, selector: string): CodeBlock | null {\n  const symbols = selector.split(':');\n  const argsCount = symbols.length - 1;\n  let pattern = '^[\\\\-+]\\\\s*\\\\(.+?\\\\)';\n  if (argsCount === 0) {\n    pattern += `${symbols[0]}\\\\s+`;\n  } else {\n    for (let i = 0; i < argsCount; ++i) {\n      const argSymbol = `${symbols[i]}:\\\\(.+\\\\)\\\\w+`;\n      pattern += `${argSymbol}\\\\s+`;\n    }\n  }\n  pattern += '{';\n  let start = contents.search(new RegExp(pattern, 'm'));\n  if (start < 0) {\n    return null;\n  }\n  start = contents.indexOf('{', start);\n\n  const end = findMatchingBracketPosition(contents, '{', start);\n  return {\n    start,\n    end,\n    code: contents.substring(start, end + 1),\n  };\n}\n\n/**\n * Insert contents to the Objective-C function block\n *\n * @param srcContents source contents\n * @param selector function selector, e.g. 'doSomething:withSomeValue:'\n * @param insertion code to insert\n * @param options insertion options\n * @returns updated contents\n */\nexport function insertContentsInsideObjcFunctionBlock(\n  srcContents: string,\n  selector: string,\n  insertion: string,\n  options: InsertContentFunctionOptions\n): string {\n  return insertContentsInsideFunctionBlock(srcContents, selector, insertion, options, 'objc');\n}\n\n/**\n * Insert contents to the Objective-C interface/implementation block\n *\n * @param srcContents source contents\n * @param declaration interface/implementation, e.g. '@interface Foo'\n * @param insertion code to insert\n * @param options insertion options\n * @returns updated contents\n */\nexport function insertContentsInsideObjcInterfaceBlock(\n  srcContents: string,\n  declaration: string,\n  insertion: string,\n  options: {\n    position: 'head' | 'tail';\n  }\n): string {\n  const codeBlock = findObjcInterfaceCodeBlock(srcContents, declaration);\n  if (!codeBlock) {\n    return srcContents;\n  }\n\n  const { position } = options;\n  if (position === 'head') {\n    const firstNewLineIndex = srcContents.indexOf('\\n', codeBlock.start);\n    srcContents = insertContentsAtOffset(srcContents, insertion, firstNewLineIndex);\n  } else if (position === 'tail') {\n    const endLen = '@end'.length;\n    srcContents = insertContentsAtOffset(srcContents, insertion, codeBlock.end - endLen);\n  }\n  return srcContents;\n}\n\n/**\n * Find code block of Swift function without declaration, will return only {} block\n *\n * @param contents source contents\n * @param selector function selector, e.g. 'doSomething(_:withSomeValue:)'\n * @returns found CodeBlock, or null if not found.\n */\nexport function findSwiftFunctionCodeBlock(contents: string, selector: string): CodeBlock | null {\n  const parenthesesIndex = selector.indexOf('(');\n  // `functName` === 'doSomething' of 'doSomething(_:withSomeValue:)'\n  const funcName = selector.substring(0, parenthesesIndex);\n  // `argLabels` === ['_', 'withSomeValue'] 'doSomething(_:withSomeValue:)'\n  const argLabels = selector.substring(parenthesesIndex + 1, selector.length - 2).split(':');\n\n  let searchOffset = 0;\n  const funcCandidateRegExp = new RegExp(`\\\\sfunc\\\\s+${funcName}\\\\(`, 'm');\n  let funcCandidateOffset = searchFromOffset(contents, funcCandidateRegExp, searchOffset);\n  while (funcCandidateOffset >= 0) {\n    // Parse function parameters\n    const paramsStartOffset = contents.indexOf('(', funcCandidateOffset);\n    const paramsEndOffset = findMatchingBracketPosition(contents, '(', paramsStartOffset);\n    const paramsString = contents.substring(paramsStartOffset + 1, paramsEndOffset);\n    const params = paramsString.split(',').map(parseSwiftFunctionParam);\n\n    // Prepare offset for next round\n    searchOffset = paramsEndOffset + 1;\n    funcCandidateOffset = searchFromOffset(contents, funcCandidateRegExp, searchOffset);\n\n    // Try to match function parameters\n    if (argLabels.length !== params.length) {\n      continue;\n    }\n    for (let i = 0; i < argLabels.length; ++i) {\n      if (argLabels[i] !== params[i].argumentLabel) {\n        continue;\n      }\n    }\n\n    // This function is matched one, get the code block.\n    const codeBlockStart = contents.indexOf('{', paramsEndOffset);\n    const codeBlockEnd = findMatchingBracketPosition(contents, '{', paramsEndOffset);\n    const codeBlock = contents.substring(codeBlockStart, codeBlockEnd + 1);\n    return {\n      start: codeBlockStart,\n      end: codeBlockEnd,\n      code: codeBlock,\n    };\n  }\n\n  return null;\n}\n\nfunction parseSwiftFunctionParam(paramTuple: string): SwiftFunctionParam {\n  const semiIndex = paramTuple.indexOf(':');\n  const [argumentLabel, parameterName] = paramTuple.substring(0, semiIndex).split(/\\s+/);\n  const typeString = paramTuple.substring(semiIndex + 1).trim();\n  return {\n    argumentLabel,\n    parameterName,\n    typeString,\n  };\n}\n\n/**\n * Insert contents to the swift class block\n *\n * @param srcContents source contents\n * @param declaration class/extension declaration, e.g. 'class AppDelegate'\n * @param insertion code to append\n * @param options insertion options\n * @returns updated contents\n */\nexport function insertContentsInsideSwiftClassBlock(\n  srcContents: string,\n  declaration: string,\n  insertion: string,\n  options: {\n    position: 'head' | 'tail';\n  }\n): string {\n  const start = srcContents.search(new RegExp(`\\\\s*${declaration}.*?[\\\\(\\\\{]`));\n  if (start < 0) {\n    throw new Error(`Unable to find class code block - declaration[${declaration}]`);\n  }\n\n  const { position } = options;\n  if (position === 'head') {\n    const firstBracketIndex = srcContents.indexOf('{', start);\n    srcContents = insertContentsAtOffset(srcContents, insertion, firstBracketIndex + 1);\n  } else if (position === 'tail') {\n    const endBracketIndex = findMatchingBracketPosition(srcContents, '{', start);\n    srcContents = insertContentsAtOffset(srcContents, insertion, endBracketIndex);\n  }\n  return srcContents;\n}\n\n/**\n * Insert contents to the Swift function block\n *\n * @param srcContents source contents\n * @param selector function selector, e.g. 'doSomething:withSomeValue:'\n * @param insertion code to insert\n * @param options insertion options\n * @returns updated contents\n */\nexport function insertContentsInsideSwiftFunctionBlock(\n  srcContents: string,\n  selector: string,\n  insertion: string,\n  options: InsertContentFunctionOptions\n): string {\n  return insertContentsInsideFunctionBlock(srcContents, selector, insertion, options, 'swift');\n}\n\nfunction insertContentsInsideFunctionBlock(\n  srcContents: string,\n  selector: string,\n  insertion: string,\n  options: InsertContentFunctionOptions,\n  language: 'objc' | 'swift'\n): string {\n  const codeBlock =\n    language === 'objc'\n      ? findObjcFunctionCodeBlock(srcContents, selector)\n      : findSwiftFunctionCodeBlock(srcContents, selector);\n  if (!codeBlock) {\n    return srcContents;\n  }\n\n  const { position } = options;\n  const indent = ' '.repeat(options.indent ?? 2);\n\n  if (position === 'head') {\n    srcContents = insertContentsAtOffset(\n      srcContents,\n      `\\n${indent}${insertion}`,\n      codeBlock.start + 1\n    );\n  } else if (position === 'tail') {\n    srcContents = insertContentsAtOffset(srcContents, `\\n${indent}${insertion}`, codeBlock.end - 1);\n  } else if (position === 'tailBeforeLastReturn') {\n    let lastReturnIndex = srcContents.lastIndexOf(' return ', codeBlock.end);\n    if (lastReturnIndex < 0) {\n      throw new Error(`Cannot find last return statement:\\n${srcContents}`);\n    }\n    lastReturnIndex += 1; // +1 for the prefix space\n    srcContents = insertContentsAtOffset(srcContents, `${insertion}\\n${indent}`, lastReturnIndex);\n  }\n\n  return srcContents;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AACA;EAAA;;EAAA;IAAA;EAAA;;EAAA;AAAA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,cAAT,CAAwBC,MAAxB,EAAwCC,OAAxC,EAAmE;EACxE,MAAMC,KAAK,GAAGF,MAAM,CAACG,KAAP,CAAa,IAAb,CAAd,CADwE,CAExE;;EACA,MAAMC,wBAAwB,GAAGF,KAAK,CAACG,SAAN,CAAiBC,IAAD,IAAUA,IAAI,CAACC,KAAL,CAAW,cAAX,CAA1B,CAAjC;;EACA,KAAK,MAAMC,aAAX,IAA4BP,OAA5B,EAAqC;IACnC,IAAI,CAACD,MAAM,CAACS,QAAP,CAAgBD,aAAhB,CAAL,EAAqC;MACnC,MAAME,eAAe,GAAI,WAAUF,aAAc,EAAjD;MACAN,KAAK,CAACS,MAAN,CAAaP,wBAAwB,GAAG,CAAxC,EAA2C,CAA3C,EAA8CM,eAA9C;IACD;EACF;;EACD,OAAOR,KAAK,CAACU,IAAN,CAAW,IAAX,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASC,0BAAT,CACLC,QADK,EAELC,WAFK,EAGa;EAClB,MAAMC,KAAK,GAAGF,QAAQ,CAACG,MAAT,CAAgB,IAAIC,MAAJ,CAAY,IAAGH,WAAY,KAA3B,EAAiC,GAAjC,CAAhB,CAAd;;EACA,IAAIC,KAAK,GAAG,CAAZ,EAAe;IACb,OAAO,IAAP;EACD;;EAED,IAAIG,GAAG,GAAGL,QAAQ,CAACM,OAAT,CAAiB,QAAjB,EAA2BJ,KAA3B,CAAV;EACAG,GAAG,IAAI,CAAP,CAPkB,CAOR;;EAEV,OAAO;IACLH,KADK;IAELG,GAFK;IAGLE,IAAI,EAAEP,QAAQ,CAACQ,SAAT,CAAmBN,KAAnB,EAA0BG,GAA1B;EAHD,CAAP;AAKD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASI,yBAAT,CAAmCT,QAAnC,EAAqDU,QAArD,EAAyF;EAC9F,MAAMC,OAAO,GAAGD,QAAQ,CAACrB,KAAT,CAAe,GAAf,CAAhB;EACA,MAAMuB,SAAS,GAAGD,OAAO,CAACE,MAAR,GAAiB,CAAnC;EACA,IAAIC,OAAO,GAAG,sBAAd;;EACA,IAAIF,SAAS,KAAK,CAAlB,EAAqB;IACnBE,OAAO,IAAK,GAAEH,OAAO,CAAC,CAAD,CAAI,MAAzB;EACD,CAFD,MAEO;IACL,KAAK,IAAII,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,SAApB,EAA+B,EAAEG,CAAjC,EAAoC;MAClC,MAAMC,SAAS,GAAI,GAAEL,OAAO,CAACI,CAAD,CAAI,eAAhC;MACAD,OAAO,IAAK,GAAEE,SAAU,MAAxB;IACD;EACF;;EACDF,OAAO,IAAI,GAAX;EACA,IAAIZ,KAAK,GAAGF,QAAQ,CAACG,MAAT,CAAgB,IAAIC,MAAJ,CAAWU,OAAX,EAAoB,GAApB,CAAhB,CAAZ;;EACA,IAAIZ,KAAK,GAAG,CAAZ,EAAe;IACb,OAAO,IAAP;EACD;;EACDA,KAAK,GAAGF,QAAQ,CAACM,OAAT,CAAiB,GAAjB,EAAsBJ,KAAtB,CAAR;EAEA,MAAMG,GAAG,GAAG,IAAAY,4CAAA,EAA4BjB,QAA5B,EAAsC,GAAtC,EAA2CE,KAA3C,CAAZ;EACA,OAAO;IACLA,KADK;IAELG,GAFK;IAGLE,IAAI,EAAEP,QAAQ,CAACQ,SAAT,CAAmBN,KAAnB,EAA0BG,GAAG,GAAG,CAAhC;EAHD,CAAP;AAKD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASa,qCAAT,CACLC,WADK,EAELT,QAFK,EAGLU,SAHK,EAILC,OAJK,EAKG;EACR,OAAOC,iCAAiC,CAACH,WAAD,EAAcT,QAAd,EAAwBU,SAAxB,EAAmCC,OAAnC,EAA4C,MAA5C,CAAxC;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASE,sCAAT,CACLJ,WADK,EAELlB,WAFK,EAGLmB,SAHK,EAILC,OAJK,EAOG;EACR,MAAMG,SAAS,GAAGzB,0BAA0B,CAACoB,WAAD,EAAclB,WAAd,CAA5C;;EACA,IAAI,CAACuB,SAAL,EAAgB;IACd,OAAOL,WAAP;EACD;;EAED,MAAM;IAAEM;EAAF,IAAeJ,OAArB;;EACA,IAAII,QAAQ,KAAK,MAAjB,EAAyB;IACvB,MAAMC,iBAAiB,GAAGP,WAAW,CAACb,OAAZ,CAAoB,IAApB,EAA0BkB,SAAS,CAACtB,KAApC,CAA1B;IACAiB,WAAW,GAAG,IAAAQ,uCAAA,EAAuBR,WAAvB,EAAoCC,SAApC,EAA+CM,iBAA/C,CAAd;EACD,CAHD,MAGO,IAAID,QAAQ,KAAK,MAAjB,EAAyB;IAC9B,MAAMG,MAAM,GAAG,OAAOf,MAAtB;IACAM,WAAW,GAAG,IAAAQ,uCAAA,EAAuBR,WAAvB,EAAoCC,SAApC,EAA+CI,SAAS,CAACnB,GAAV,GAAgBuB,MAA/D,CAAd;EACD;;EACD,OAAOT,WAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASU,0BAAT,CAAoC7B,QAApC,EAAsDU,QAAtD,EAA0F;EAC/F,MAAMoB,gBAAgB,GAAGpB,QAAQ,CAACJ,OAAT,CAAiB,GAAjB,CAAzB,CAD+F,CAE/F;;EACA,MAAMyB,QAAQ,GAAGrB,QAAQ,CAACF,SAAT,CAAmB,CAAnB,EAAsBsB,gBAAtB,CAAjB,CAH+F,CAI/F;;EACA,MAAME,SAAS,GAAGtB,QAAQ,CAACF,SAAT,CAAmBsB,gBAAgB,GAAG,CAAtC,EAAyCpB,QAAQ,CAACG,MAAT,GAAkB,CAA3D,EAA8DxB,KAA9D,CAAoE,GAApE,CAAlB;EAEA,IAAI4C,YAAY,GAAG,CAAnB;EACA,MAAMC,mBAAmB,GAAG,IAAI9B,MAAJ,CAAY,cAAa2B,QAAS,KAAlC,EAAwC,GAAxC,CAA5B;EACA,IAAII,mBAAmB,GAAG,IAAAC,iCAAA,EAAiBpC,QAAjB,EAA2BkC,mBAA3B,EAAgDD,YAAhD,CAA1B;;EACA,OAAOE,mBAAmB,IAAI,CAA9B,EAAiC;IAC/B;IACA,MAAME,iBAAiB,GAAGrC,QAAQ,CAACM,OAAT,CAAiB,GAAjB,EAAsB6B,mBAAtB,CAA1B;IACA,MAAMG,eAAe,GAAG,IAAArB,4CAAA,EAA4BjB,QAA5B,EAAsC,GAAtC,EAA2CqC,iBAA3C,CAAxB;IACA,MAAME,YAAY,GAAGvC,QAAQ,CAACQ,SAAT,CAAmB6B,iBAAiB,GAAG,CAAvC,EAA0CC,eAA1C,CAArB;IACA,MAAME,MAAM,GAAGD,YAAY,CAAClD,KAAb,CAAmB,GAAnB,EAAwBoD,GAAxB,CAA4BC,uBAA5B,CAAf,CAL+B,CAO/B;;IACAT,YAAY,GAAGK,eAAe,GAAG,CAAjC;IACAH,mBAAmB,GAAG,IAAAC,iCAAA,EAAiBpC,QAAjB,EAA2BkC,mBAA3B,EAAgDD,YAAhD,CAAtB,CAT+B,CAW/B;;IACA,IAAID,SAAS,CAACnB,MAAV,KAAqB2B,MAAM,CAAC3B,MAAhC,EAAwC;MACtC;IACD;;IACD,KAAK,IAAIE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGiB,SAAS,CAACnB,MAA9B,EAAsC,EAAEE,CAAxC,EAA2C;MACzC,IAAIiB,SAAS,CAACjB,CAAD,CAAT,KAAiByB,MAAM,CAACzB,CAAD,CAAN,CAAU4B,aAA/B,EAA8C;QAC5C;MACD;IACF,CAnB8B,CAqB/B;;;IACA,MAAMC,cAAc,GAAG5C,QAAQ,CAACM,OAAT,CAAiB,GAAjB,EAAsBgC,eAAtB,CAAvB;IACA,MAAMO,YAAY,GAAG,IAAA5B,4CAAA,EAA4BjB,QAA5B,EAAsC,GAAtC,EAA2CsC,eAA3C,CAArB;IACA,MAAMd,SAAS,GAAGxB,QAAQ,CAACQ,SAAT,CAAmBoC,cAAnB,EAAmCC,YAAY,GAAG,CAAlD,CAAlB;IACA,OAAO;MACL3C,KAAK,EAAE0C,cADF;MAELvC,GAAG,EAAEwC,YAFA;MAGLtC,IAAI,EAAEiB;IAHD,CAAP;EAKD;;EAED,OAAO,IAAP;AACD;;AAED,SAASkB,uBAAT,CAAiCI,UAAjC,EAAyE;EACvE,MAAMC,SAAS,GAAGD,UAAU,CAACxC,OAAX,CAAmB,GAAnB,CAAlB;EACA,MAAM,CAACqC,aAAD,EAAgBK,aAAhB,IAAiCF,UAAU,CAACtC,SAAX,CAAqB,CAArB,EAAwBuC,SAAxB,EAAmC1D,KAAnC,CAAyC,KAAzC,CAAvC;EACA,MAAM4D,UAAU,GAAGH,UAAU,CAACtC,SAAX,CAAqBuC,SAAS,GAAG,CAAjC,EAAoCG,IAApC,EAAnB;EACA,OAAO;IACLP,aADK;IAELK,aAFK;IAGLC;EAHK,CAAP;AAKD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASE,mCAAT,CACLhC,WADK,EAELlB,WAFK,EAGLmB,SAHK,EAILC,OAJK,EAOG;EACR,MAAMnB,KAAK,GAAGiB,WAAW,CAAChB,MAAZ,CAAmB,IAAIC,MAAJ,CAAY,OAAMH,WAAY,aAA9B,CAAnB,CAAd;;EACA,IAAIC,KAAK,GAAG,CAAZ,EAAe;IACb,MAAM,IAAIkD,KAAJ,CAAW,iDAAgDnD,WAAY,GAAvE,CAAN;EACD;;EAED,MAAM;IAAEwB;EAAF,IAAeJ,OAArB;;EACA,IAAII,QAAQ,KAAK,MAAjB,EAAyB;IACvB,MAAM4B,iBAAiB,GAAGlC,WAAW,CAACb,OAAZ,CAAoB,GAApB,EAAyBJ,KAAzB,CAA1B;IACAiB,WAAW,GAAG,IAAAQ,uCAAA,EAAuBR,WAAvB,EAAoCC,SAApC,EAA+CiC,iBAAiB,GAAG,CAAnE,CAAd;EACD,CAHD,MAGO,IAAI5B,QAAQ,KAAK,MAAjB,EAAyB;IAC9B,MAAM6B,eAAe,GAAG,IAAArC,4CAAA,EAA4BE,WAA5B,EAAyC,GAAzC,EAA8CjB,KAA9C,CAAxB;IACAiB,WAAW,GAAG,IAAAQ,uCAAA,EAAuBR,WAAvB,EAAoCC,SAApC,EAA+CkC,eAA/C,CAAd;EACD;;EACD,OAAOnC,WAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASoC,sCAAT,CACLpC,WADK,EAELT,QAFK,EAGLU,SAHK,EAILC,OAJK,EAKG;EACR,OAAOC,iCAAiC,CAACH,WAAD,EAAcT,QAAd,EAAwBU,SAAxB,EAAmCC,OAAnC,EAA4C,OAA5C,CAAxC;AACD;;AAED,SAASC,iCAAT,CACEH,WADF,EAEET,QAFF,EAGEU,SAHF,EAIEC,OAJF,EAKEmC,QALF,EAMU;EAAA;;EACR,MAAMhC,SAAS,GACbgC,QAAQ,KAAK,MAAb,GACI/C,yBAAyB,CAACU,WAAD,EAAcT,QAAd,CAD7B,GAEImB,0BAA0B,CAACV,WAAD,EAAcT,QAAd,CAHhC;;EAIA,IAAI,CAACc,SAAL,EAAgB;IACd,OAAOL,WAAP;EACD;;EAED,MAAM;IAAEM;EAAF,IAAeJ,OAArB;EACA,MAAMoC,MAAM,GAAG,IAAIC,MAAJ,oBAAWrC,OAAO,CAACoC,MAAnB,6DAA6B,CAA7B,CAAf;;EAEA,IAAIhC,QAAQ,KAAK,MAAjB,EAAyB;IACvBN,WAAW,GAAG,IAAAQ,uCAAA,EACZR,WADY,EAEX,KAAIsC,MAAO,GAAErC,SAAU,EAFZ,EAGZI,SAAS,CAACtB,KAAV,GAAkB,CAHN,CAAd;EAKD,CAND,MAMO,IAAIuB,QAAQ,KAAK,MAAjB,EAAyB;IAC9BN,WAAW,GAAG,IAAAQ,uCAAA,EAAuBR,WAAvB,EAAqC,KAAIsC,MAAO,GAAErC,SAAU,EAA5D,EAA+DI,SAAS,CAACnB,GAAV,GAAgB,CAA/E,CAAd;EACD,CAFM,MAEA,IAAIoB,QAAQ,KAAK,sBAAjB,EAAyC;IAC9C,IAAIkC,eAAe,GAAGxC,WAAW,CAACyC,WAAZ,CAAwB,UAAxB,EAAoCpC,SAAS,CAACnB,GAA9C,CAAtB;;IACA,IAAIsD,eAAe,GAAG,CAAtB,EAAyB;MACvB,MAAM,IAAIP,KAAJ,CAAW,uCAAsCjC,WAAY,EAA7D,CAAN;IACD;;IACDwC,eAAe,IAAI,CAAnB,CAL8C,CAKxB;;IACtBxC,WAAW,GAAG,IAAAQ,uCAAA,EAAuBR,WAAvB,EAAqC,GAAEC,SAAU,KAAIqC,MAAO,EAA5D,EAA+DE,eAA/D,CAAd;EACD;;EAED,OAAOxC,WAAP;AACD"}