{"version":3,"sources":["jsdelivr-header.js","/npm/open-juice@0.0.1/index.js"],"names":[],"mappings":"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G,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GACrR,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,GACnC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GACxH,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAC9F,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAC/E,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,GAC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I,EAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,GAAG,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,EAAI,CAAC,EAAE,IAAI,GAAI,CAAC,EAAE,IAAI,GAAI,CAAC,EAAE,IAAI,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAI,CAAC,EAAE,IAAI,GAAI,CAAC,EAAE,IAAI,GAAI,CAAC,EAAE,IAAI,GAA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G,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,IAAI,EAAE,EAAI,CAAC,EAAE,IAAI,EAAE,EAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG,EAAI,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG,EAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,EAAE,EAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAI,EAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAI,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,EAAE,EAAI,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,GAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,EAAE,EAAI,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAM,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAI,GAAG,IAAK,EAAE,GAAI,CAAC,EAAE,KAAK,EAAE,GAAI,CAAC,EAAE,KAAK,EAAE,GAAI,CAAC,EAAE,KAAK,EAAE,GAAI,GAAI,CAAC,GAAG,KAAM,EAAE,GAAI,CAAC,EAAE,KAAK,EAAE,GAAI,CAAC,EAAE,KAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,IAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAI,GAAG,KAAM,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAI,CAAC,GAAG,GAAI,GAAG,CAAC,EAAE,MAAM,EAAE,EAAI,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAM,CAAC,GAAG,EAAI,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAI,GAAG,IAAK,CAAC,GAAG,GAAG,GAAG,GAAI,GAAG,IAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,EAAE,EAAI,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAI,GAAG,KAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,GAAI,GAAG,CAAC,EAAE,MAAM,EAAE,GAAI,GAAI,CAAC,GAAG,IAAI,GAAG,KAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAI,GAAG,IAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAI,CAAC,GAAG,IAAI,GAAG,KAAM,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,IAAI,GAAG,GAAI,GAAG,IAAK,EAAE,EAAI,CAAC,EAAE,KAAK,EAAE,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,GAAI,CAAC,GAAG,IAAI,GAAG,KAAM,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,GAAK,EAAE,GAAI,CAAC,EAAE,KAAK,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,GAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAM,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAA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","file":"/npm/open-juice@0.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/open-juice@0.0.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\nconst inchMM = (1 / 0.039370) // used for scaling AMF (inch) to CAG coordinates(MM)\n\nmodule.exports = {inchMM}\n\n},{}],2:[function(require,module,exports){\nconst {CSG} = require('@jscad/csg')\n\nconst createObject = require('./objectBuilder')\nconst parse = require('./parse')\n\nconst deserializeToCSG = function (src, filename, options) {\n  filename = filename || 'amf'\n  const defaults = {pxPmm: require('./constants').pxPmm, version: '0.0.0', addMetaData: true}\n  options = Object.assign({}, defaults, options)\n  const {pxPmm} = options\n\n  // parse the AMF data\n  const {amfObj, amfMaterials, amfTextures, amfConstels} = parse(src, pxPmm)\n  if (!amfObj) {\n    throw new Error('AMF parsing failed, no valid amf data retrieved')\n  }\n\n  return objectify(amfObj, {amfMaterials, amfTextures, amfConstels})\n}\n\nconst objectify = (amf, data) => {\n  let objects = amf.objects\n  const csgs = objects.map((object, index) => object.type === 'object' ? createObject(object, index, data, {amf, csg: true}) : undefined)\n  return new CSG().union(csgs)\n}\n\nmodule.exports = deserializeToCSG\n\n},{\"./constants\":1,\"./objectBuilder\":5,\"./parse\":6,\"@jscad/csg\":22}],3:[function(require,module,exports){\nfunction amfMesh (element) {\n  let obj = {type: 'mesh'}\n  obj.objects = []\n  return obj\n}\n\n// Note: TBD Vertices can have a color, which is used to interpolate a face color (from the 3 vertices)\nfunction amfVertices (element) {\n  let obj = {type: 'vertices'}\n  obj.objects = []\n  return obj\n}\n\nfunction amfCoordinates (element) {\n  let obj = {type: 'coordinates'}\n  obj.objects = []\n  return obj\n}\nfunction amfNormal (element) {\n  let obj = {type: 'normal'}\n  obj.objects = []\n  return obj\n}\nfunction amfX (element) {\n  return {type: 'x', value: '0'}\n}\nfunction amfY (element) {\n  return {type: 'y', value: '0'}\n}\nfunction amfZ (element) {\n  return {type: 'z', value: '0'}\n}\n\nfunction amfVolume (element) {\n  let obj = {type: 'volume'}\n\n  if ('MATERIALID' in element) { obj.materialid = element.MATERIALID }\n\n  obj.objects = []\n  return obj\n}\n\nfunction amfTriangle (element) {\n  let obj = {type: 'triangle'}\n  obj.objects = []\n  return obj\n}\nfunction amfV1 (element) {\n  return {type: 'v1', value: '0'}\n}\nfunction amfV2 (element) {\n  return {type: 'v2', value: '0'}\n}\nfunction amfV3 (element) {\n  return {type: 'v3', value: '0'}\n}\n\nfunction amfVertex (element) {\n  let obj = {type: 'vertex'}\n  obj.objects = []\n  return obj\n}\n\nfunction amfEdge (element) {\n  let obj = {type: 'edge'}\n\n  obj.objects = []\n  return obj\n}\n\nfunction amfMetadata (element) {\n  let obj = {type: 'metadata'}\n\n  if ('TYPE' in element) { obj.mtype = element.TYPE }\n  if ('ID' in element) { obj.id = element.ID }\n\n  return obj\n}\n\nfunction amfMaterial (element) {\n  let obj = {type: 'material'}\n\n  if ('ID' in element) { obj.id = element.ID }\n\n  obj.objects = []\n  return obj\n}\n\nfunction amfColor (element) {\n  let obj = {type: 'color'}\n\n  obj.objects = []\n  return obj\n}\nfunction amfR (element) {\n  return {type: 'r', value: '1'}\n}\nfunction amfG (element) {\n  return {type: 'g', value: '1'}\n}\nfunction amfB (element) {\n  return {type: 'b', value: '1'}\n}\nfunction amfA (element) {\n  return {type: 'a', value: '1'}\n}\n\nfunction amfMap (element) {\n  let obj = {type: 'map'}\n\n  if ('GTEXID' in element) { obj.gtexid = element.GTEXID }\n  if ('BTEXID' in element) { obj.btexid = element.BTEXID }\n  if ('RTEXID' in element) { obj.rtexid = element.RTEXID }\n\n  obj.objects = []\n  return obj\n}\n\nfunction amfU1 (element) {\n  return {type: 'u1', value: '0'}\n}\nfunction amfU2 (element) {\n  return {type: 'u2', value: '0'}\n}\nfunction amfU3 (element) {\n  return {type: 'u3', value: '0'}\n}\n\nmodule.exports = {\n  amfMesh,\n  amfVertices,\n  amfCoordinates,\n  amfX,\n  amfY,\n  amfZ,\n  amfNormal,\n  amfVolume,\n  amfTriangle,\n  amfV1,\n  amfV2,\n  amfV3,\n  amfVertex,\n  amfEdge,\n  amfMetadata,\n  amfMaterial,\n  amfColor,\n  amfR,\n  amfG,\n  amfB,\n  amfA,\n  amfMap,\n  amfU1,\n  amfU2,\n  amfU3\n}\n\n},{}],4:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2016 Z3 Development https://github.com/z3dev\nCopyright (c) 2013-2016 by Rene K. Mueller <spiritdude@gmail.com>\nCopyright (c) 2016 by Z3D Development\n\nAll code released under MIT license\n\nHistory:\n  2016/06/27: 0.5.1: rewrote using SAX XML parser, enhanced for multiple objects, materials, units by Z3Dev\n  2013/04/11: 0.018: added alpha support to AMF export\n\n*/\n\n// //////////////////////////////////////////\n//\n// AMF is a language for describing three-dimensional graphics in XML\n// See http://www.astm.org/Standards/ISOASTM52915.htm\n// See http://amf.wikispaces.com/\n//\n// //////////////////////////////////////////\nconst translate = require('./translate')\nconst deserializeToCSG = require('./deserialize')\n\n/**\n * Parse the given AMF source (xml) and return either a JSCAD script or a CSG/CAG object\n * @param {string} input amf data\n * @param {string} filename (optional) original filename of AMF source\n * @param {object} options options (optional) anonymous object with:\n * @param {string} [options.version='0.0.0'] version number to add to the metadata\n * @param {boolean} [options.addMetadata=true] toggle injection of metadata (producer, date, source) at the start of the file\n * @param {string} [options.output='jscad'] {String} either jscad or csg to set desired output\n * @return {CSG/string} either a CAG/CSG object or a string (jscad script)\n */\nconst deserialize = function (input, filename, options) {\n  const defaults = {\n    output: 'jscad'\n  }\n  options = Object.assign({}, defaults, options)\n  return options.output === 'jscad' ? translate(input, filename, options) : deserializeToCSG(input, filename, options)\n}\n\nmodule.exports = {\n  deserialize\n}\n\n},{\"./deserialize\":2,\"./translate\":7}],5:[function(require,module,exports){\nfunction findMaterial (materials, id) {\n  let lastmaterial = null // FIXME: shoud this be outside this scope ?\n\n  if (lastmaterial && lastmaterial.id === id) return lastmaterial\n  for (let i = 0; i < materials.length; i++) {\n    if (materials[i].id && materials[i].id === id) {\n      lastmaterial = materials[i]\n      return lastmaterial\n    }\n  }\n  return null\n}\n\nfunction getValue (objects, type) {\n  for (let i = 0; i < objects.length; i++) {\n    if (objects[i].type === type) return objects[i].value\n  }\n  return null\n}\nfunction getColor (objects) {\n  for (let i = 0; i < objects.length; i++) {\n    let obj = objects[i]\n    if (obj.type === 'color') {\n      let r = parseFloat(getValue(obj.objects, 'r'))\n      let g = parseFloat(getValue(obj.objects, 'g'))\n      let b = parseFloat(getValue(obj.objects, 'b'))\n      let a = parseFloat(getValue(obj.objects, 'a'))\n      if (Number.isNaN(r)) r = 1.0 // AMF default color\n      if (Number.isNaN(g)) g = 1.0\n      if (Number.isNaN(b)) b = 1.0\n      if (Number.isNaN(a)) a = 1.0\n      return [r, g, b, a]\n    }\n  }\n  return null\n}\n\nfunction findColorByMaterial (materials, id) {\n  let m = findMaterial(materials, id)\n  if (m) {\n    return getColor(m.objects)\n  }\n  return null\n}\n\n// convert all objects to CSG based code\nfunction createObject (obj, index, data, options) {\n  let vertices = [] // [x,y,z]\n  let faces = [] // [v1,v2,v3]\n  let colors = [] // [r,g,b,a]\n\n  function addCoord (coord, cidx) {\n    if (coord.type === 'coordinates') {\n      // console.log('coords', coord.objects)\n      let x = parseFloat(getValue(coord.objects, 'x'))\n      let y = parseFloat(getValue(coord.objects, 'y'))\n      let z = parseFloat(getValue(coord.objects, 'z'))\n      // console.log('[' + x + ',' + y + ',' + z + ']')\n      vertices.push([x, y, z])\n    }\n    // normal is possible\n  }\n  function addVertex (vertex, vidx) {\n    if (vertex.type === 'vertex') {\n      vertex.objects.map(addCoord)\n    }\n    // edge is possible\n  }\n  function addTriangle (tri, tidx) {\n    if (tri.type === 'triangle') {\n      let v1 = parseInt(getValue(tri.objects, 'v1'))\n      let v2 = parseInt(getValue(tri.objects, 'v2'))\n      let v3 = parseInt(getValue(tri.objects, 'v3'))\n      // console.log('['+v1+','+v2+','+v3+']');\n      faces.push([v1, v2, v3]) // HINT: reverse order for polyhedron()\n      let c = getColor(tri.objects)\n      if (c) {\n        colors.push(c)\n      } else {\n        colors.push(tricolor)\n      }\n    }\n  }\n  let tricolor = null // for found colors\n  function addPart (part, pidx) {\n    // console.log(part.type);\n    switch (part.type) {\n      case 'vertices':\n        part.objects.map(addVertex, data)\n        break\n      case 'volume':\n        tricolor = getColor(part.objects)\n        if (part.materialid) {\n        // convert material to color\n          tricolor = findColorByMaterial(part.materialid)\n        }\n        part.objects.map(addTriangle, data)\n        break\n      default:\n        break\n    }\n  }\n  function addMesh (mesh, midx) {\n    // console.log(mesh.type);\n    if (mesh.type === 'mesh') {\n      mesh.objects.map(addPart, data)\n    }\n  }\n\n  // const output =\n  if (options.csg === true) {\n    const {CSG} = require('@jscad/csg')\n    const scale = options.amf.scale\n    const vertex = scale !== 1.0 ? ([x, y, z]) => new CSG.Vertex(new CSG.Vector3D(x * scale, y * scale, z * scale))\n      : ([x, y, z]) => new CSG.Vertex(new CSG.Vector3D(x, y, z))\n    const polygon = a => new CSG.Polygon(a)\n\n    obj.objects.map(addMesh, data)\n    let polys = []\n\n    let fcount = faces.length\n    let vcount = vertices.length\n    // console.log('here', fcount, vcount)\n\n    for (let i = 0; i < fcount; i++) {\n      let subData = []\n      for (let j = 0; j < faces[i].length; j++) {\n        if (faces[i][j] < 0 || faces[i][j] >= vcount) {\n          // if (err.length === '') err += 'bad index for vertice (out of range)'\n          continue\n        }\n        // console.log('bla', vertices[faces[i][j]])\n\n        subData.push(vertex(vertices[faces[i][j]]))\n      }\n      const color = colors[i] ? colors[i] : undefined\n      const polygonData = color ? polygon(subData).setColor([color[0], color[1], color[2], color[3]]) : polygon(subData)\n      polys.push(polygonData)\n    }\n    return CSG.fromPolygons(polys)\n  }\n\n  let code = ''\n  if (obj.objects.length > 0) {\n    obj.objects.map(addMesh, data)\n\n    let fcount = faces.length\n    let vcount = vertices.length\n\n    code += `// Object ${obj.id}\n//  faces   : ${fcount}\n//  vertices: ${vcount}\nfunction createObject${obj.id}() {\n  let polys = [];\n`\n\n    // convert the results into function calls\n    for (let i = 0; i < fcount; i++) {\n      code += '  polys.push(\\n'\n      code += '    PP([\\n'\n      for (let j = 0; j < faces[i].length; j++) {\n        if (faces[i][j] < 0 || faces[i][j] >= vcount) {\n          // if (err.length === '') err += 'bad index for vertice (out of range)'\n          continue\n        }\n        if (j) code += ',\\n'\n        code += '      VV(' + vertices[faces[i][j]] + ')'\n      }\n      code += '])'\n      if (colors[i]) {\n        let c = colors[i]\n        code += '.setColor([' + c[0] + ',' + c[1] + ',' + c[2] + ',' + c[3] + '])'\n      }\n      code += ');\\n'\n    }\n    code += '  return CSG.fromPolygons(polys);\\n'\n    code += '}\\n'\n  }\n  return code\n}\n\nmodule.exports = createObject\n\n},{\"@jscad/csg\":22}],6:[function(require,module,exports){\nconst sax = require('sax')\nconst {amfMesh,\namfVertices,\namfCoordinates,\namfX,\namfY,\namfZ,\namfNormal,\namfVolume,\namfTriangle,\namfV1,\namfV2,\namfV3,\namfVertex,\namfEdge,\namfMetadata,\namfMaterial,\namfColor,\namfR,\namfG,\namfB,\namfA,\namfMap,\namfU1,\namfU2,\namfU3} = require('./helpers')\nconst {inchMM} = require('./constants')\n\nlet amfLast = null // last object found\nlet amfDefinition = 0 // definitions beinging created\n// 0-AMF,1-object,2-material,3-texture,4-constellation,5-metadata\n// high level elements / definitions\nlet amfObjects = [] // list of objects\nlet amfMaterials = [] // list of materials\nlet amfTextures = [] // list of textures\nlet amfConstels = [] // list of constellations\n// let amfMetadata = [] // list of metadata\nlet amfObj = null // amf in object form\n\nfunction amfAmf (element) {\n  // default SVG with no viewport\n  let obj = {type: 'amf', unit: 'mm', scale: 1.0}\n\n  if ('UNIT' in element) { obj.unit = element.UNIT.toLowerCase() }\n  // set scaling\n  switch (obj.unit.toLowerCase()) {\n    case 'inch':\n      obj.scale = inchMM\n      break\n    case 'foot':\n      obj.scale = inchMM * 12.0\n      break\n    case 'meter':\n      obj.scale = 1000.0\n      break\n    case 'micron':\n      obj.scale = 0.001\n      break\n    case 'millimeter':\n    default:\n      break\n  }\n\n  obj.objects = []\n  return obj\n}\n\nconst amfObject = function (element) {\n  let obj = {type: 'object', id: 'JSCAD' + (amfObjects.length)} // default ID\n\n  if ('ID' in element) { obj.id = element.ID }\n\n  obj.objects = []\n  return obj\n}\n\nfunction createAmfParser (src, pxPmm) {\n  // create a parser for the XML\n  const parser = sax.parser(false, {trim: true, lowercase: false, position: true})\n\n  parser.onerror = function (e) {\n    console.log('error: line ' + e.line + ', column ' + e.column + ', bad character [' + e.c + ']')\n  }\n  parser.onopentag = function (node) {\n    const objMap = {\n      AMF: amfAmf, // obj = amfAmf(node.attributes)\n      OBJECT: (attributes) => {\n        const tmp = amfObject(attributes)\n        if (amfDefinition === 0) amfDefinition = 1 // OBJECT processing\n        return tmp\n      }, //\n      MESH: amfMesh,\n      VERTICES: amfVertices,\n      VERTEX: amfVertex,\n      EDGE: amfEdge,\n      VOLUME: amfVolume,\n      MATERIAL: attributes => {\n        const tmp = amfMaterial(attributes)\n        if (amfDefinition === 0) amfDefinition = 2 // MATERIAL processing\n        return tmp\n      },\n      TEXTURE: node => {\n        if (amfDefinition === 0) amfDefinition = 3 // TEXTURE processing\n      },\n      CONSTELLATION: node => {\n        if (amfDefinition === 0) amfDefinition = 4 // CONSTELLATION processing\n      },\n      METADATA: attributes => {\n        const tmp = amfMetadata(attributes)\n        if (amfDefinition === 0) amfDefinition = 5 // METADATA processing\n        return tmp\n      },\n      COORDINATES: amfCoordinates,\n      NORMAL: amfNormal,\n      NX: amfX,\n      X: amfX,\n      NY: amfY,\n      Y: amfY,\n      NZ: amfZ,\n      Z: amfZ,\n      TRIANGLE: amfTriangle,\n      V1: amfV1,\n      VTEX1: amfV1,\n      V2: amfV2,\n      VTEX2: amfV2,\n      V3: amfV3,\n      VTEX3: amfV3,\n      COLOR: amfColor,\n      R: amfR,\n      G: amfG,\n      B: amfB,\n      A: amfA,\n      MAP: amfMap,\n      TEXMAP: amfMap,\n      U1: amfU1,\n      UTEX1: amfU1,\n      WTEX1: amfU1,\n      U2: amfU2,\n      UTEX2: amfU2,\n      WTEX2: amfU2,\n      U3: amfU3,\n      UTEX3: amfU3,\n      WTEX3: amfU3,\n      COMPOSITE: () => undefined, // ignored by design\n      undefined: () => console.log('Warning: Unsupported AMF element: ' + node.name)\n    }\n\n    let obj = objMap[node.name] ? objMap[node.name](node.attributes, {amfObjects}) : null\n\n    if (obj !== null) {\n      switch (amfDefinition) {\n        case 0: // definition of AMF\n          if ('objects' in obj) {\n            // console.log('push object ['+obj.type+']');\n            amfObjects.push(obj)\n          }\n          break\n        case 1: // definition of OBJECT\n          if (amfObjects.length > 0) {\n            let group = amfObjects.pop()\n            // add the object to the active group if necessary\n            if ('objects' in group) {\n              // console.log('object '+group.type+' adding ['+obj.type+']');\n              // console.log(JSON.stringify(obj));\n              group.objects.push(obj)\n            }\n            amfObjects.push(group)\n            // and push this object as a group object if necessary\n            if ('objects' in obj) {\n              // console.log('object group ['+obj.type+']');\n              amfObjects.push(obj)\n            }\n          }\n          break\n        case 2: // definition of MATERIAL\n          if (obj.type === 'material') {\n            // console.log('push material ['+obj.type+']');\n            amfMaterials.push(obj)\n          } else {\n            if (amfMaterials.length > 0) {\n              let group = amfMaterials.pop()\n              // add the object to the active group if necessary\n              if ('objects' in group) {\n                // console.log('material '+group.type+' adding ['+obj.type+']');\n                // console.log(JSON.stringify(obj));\n                group.objects.push(obj)\n              }\n              amfMaterials.push(group)\n              // and push this object as a group object if necessary\n              if ('objects' in obj) {\n                // console.log('push material ['+obj.type+']');\n                amfMaterials.push(obj)\n              }\n            }\n          }\n          break\n        case 3: // definition of TEXTURE\n          break\n        case 4: // definition of CONSTELLATION\n          break\n        case 5: // definition of METADATA\n          break\n        default:\n          console.log('ERROR: invalid AMF definition')\n          break\n      }\n      amfLast = obj // retain this object in order to add values\n    }\n  }\n\n  parser.onclosetag = function (node) {\n    switch (node) {\n      // list those which have objects\n      case 'AMF':\n      case 'OBJECT':\n      case 'MESH':\n      case 'VERTICES':\n      case 'VERTEX':\n      case 'EDGE':\n      case 'COORDINATES':\n      case 'NORMAL':\n      case 'VOLUME':\n      case 'TRIANGLE':\n      case 'MATERIAL':\n      case 'COLOR':\n      case 'MAP':\n      case 'TEXMAP':\n        break\n      case 'TEXTURE':\n        if (amfDefinition === 3) { amfDefinition = 0 } // resume processing\n        return\n      case 'CONSTELLATION':\n        if (amfDefinition === 4) { amfDefinition = 0 } // resume processing\n        return\n      case 'METADATA':\n        if (amfDefinition === 5) { amfDefinition = 0 } // resume processing\n        return\n      default:\n        // console.log('closetag: '+node);\n        return\n    }\n\n    let obj = null\n    switch (amfDefinition) {\n      case 0: // definition of AMF\n      case 1: // definition of OBJECT\n        if (amfObjects.length > 0) {\n          obj = amfObjects.pop()\n          // console.log('pop object ['+obj.type+']');\n          if (obj.type === 'object') {\n            amfDefinition = 0 // AMF processing\n          }\n        }\n        // check for completeness\n        if (amfObjects.length === 0) {\n          amfObj = obj\n        }\n        break\n      case 2: // definition of MATERIAL\n        if (amfMaterials.length > 0) {\n          obj = amfMaterials.pop()\n          // console.log('pop material ['+obj.type+']');\n          if (obj.type === 'material') {\n            amfMaterials.push(obj) // keep a list of materials\n            amfDefinition = 0 // AMF processing\n          }\n        }\n        break\n      case 3: // definition of TEXTURE\n        amfDefinition = 0 // AMF processing\n        break\n      case 4: // definition of CONSTELLATION\n        amfDefinition = 0 // AMF processing\n        break\n      case 5: // definition of METADATA\n        amfDefinition = 0 // AMF processing\n        break\n      default:\n        break\n    }\n  }\n\n  parser.ontext = function (value) {\n    if (value !== null) {\n      if (amfLast && amfDefinition !== 0) {\n        amfLast.value = value\n      }\n    }\n  }\n\n  parser.onend = function () {\n    // console.log('AMF parsing completed')\n  }\n\n  // start the parser\n  parser.write(src).close()\n}\n\nconst parse = (src, pxPmm) => {\n  createAmfParser(src, pxPmm)\n  return {amfObj, amfMaterials, amfTextures, amfConstels}\n}\n\nmodule.exports = parse\n\n},{\"./constants\":1,\"./helpers\":3,\"sax\":259}],7:[function(require,module,exports){\nconst createObject = require('./objectBuilder')\nconst parse = require('./parse')\n\nconst translate = function (src, filename, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  filename = filename || 'amf'\n  const defaults = {pxPmm: require('./constants').pxPmm, version: '0.0.0', addMetaData: true}\n  options = Object.assign({}, defaults, options)\n  const {version, pxPmm, addMetaData} = options\n\n  // parse the AMF source\n  const {amfObj, amfMaterials, amfTextures, amfConstels} = parse(src, pxPmm)\n  // convert the internal objects to JSCAD code\n  let code = addMetaData ? `//\n  // producer: OpenJSCAD.org ${version} AMF deserializer\n  // date: ${new Date()}\n  // source: ${filename}\n  //\n  ` : ''\n\n  if (!amfObj) {\n    throw new Error('AMF parsing failed, no valid AMF data retrieved')\n  }\n\n  options && options.statusCallback && options.statusCallback({progress: 50})\n  \n  const scadCode = codify(amfObj, {amfMaterials, amfTextures, amfConstels})\n  code += scadCode\n  \n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return code\n}\n\n//\n// convert the internal repreentation into JSCAD code\n//\nfunction codify (amf, data) {\n  if (amf.type !== 'amf' || (!amf.objects)) throw new Error('AMF malformed')\n  let code = ''\n\n  // hack due to lack of this in array map()\n  let objects = amf.objects\n  let materials = data.amfMaterials\n\n  // convert high level definitions\n  function createDefinition (obj, didx) {\n    // console.log(materials.length);\n    switch (obj.type) {\n      case 'object':\n        code += createObject(obj, didx, data, {csg: false})\n        break\n      case 'metadata':\n        break\n      case 'material':\n        break\n      default:\n        console.log('Warning: unknown definition: ' + obj.type)\n        break\n    }\n  }\n\n  // start everthing\n  code = `// Objects  : ${objects.length}\n// Materials: ${materials.length}\n\n// helper functions\n`\n\n  if (amf.scale !== 1.0) {\n    code += 'let SCALE = ' + amf.scale + '; // scaling units (' + amf.unit + ')\\n'\n    code += 'let VV = function(x,y,z) { return new CSG.Vertex(new CSG.Vector3D(x*SCALE,y*SCALE,z*SCALE)); };\\n'\n  } else {\n    code += 'let VV = function(x,y,z) { return new CSG.Vertex(new CSG.Vector3D(x,y,z)); };\\n'\n  }\n  code += `let PP = function(a) { return new CSG.Polygon(a); };\n\nfunction main() {\n  let csgs = [];\n`\n  for (let i = 0; i < objects.length; i++) {\n    let obj = objects[i]\n    if (obj.type === 'object') {\n      code += '  csgs.push(createObject' + obj.id + '());\\n'\n    }\n  }\n  code += `  return union(csgs);\n}\n\n`\n\n  objects.map(createDefinition, data)\n  return code\n}\n\nmodule.exports = translate\n\n},{\"./constants\":1,\"./objectBuilder\":5,\"./parse\":6}],8:[function(require,module,exports){\nconst { ensureManifoldness } = require('@jscad/io-utils')\nconst mimeType = 'application/amf+xml'\n\nfunction serialize (CSG, m, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  CSG = ensureManifoldness(CSG)\n  var result = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<amf' + (m && m.unit ? ' unit=\"+m.unit\"' : '') + '>\\n'\n  for (var k in m) {\n    result += '<metadata type=\"' + k + '\">' + m[k] + '</metadata>\\n'\n  }\n  result += '<object id=\"0\">\\n<mesh>\\n<vertices>\\n'\n\n  CSG.polygons.map(function (p) { // first we dump all vertices of all polygons\n    for (var i = 0; i < p.vertices.length; i++) {\n      result += CSGVertextoAMFString(p.vertices[i])\n    }\n  })\n  result += '</vertices>\\n'\n\n  var n = 0\n  CSG.polygons.map(function (p, i) { // then we dump all polygons\n    result += '<volume>\\n'\n    if (p.vertices.length < 3) {\n      return\n    }\n    var color = null\n    if (p.shared && p.shared.color) {\n      color = p.shared.color\n    } else if (p.color) {\n      color = p.color\n    }\n    if (color != null) {\n      if (color.length < 4) color.push(1.0)\n      result += '<color><r>' + color[0] + '</r><g>' + color[1] + '</g><b>' + color[2] + '</b><a>' + color[3] + '</a></color>'\n    }\n\n    for (var i = 0; i < p.vertices.length - 2; i++) { // making sure they are all triangles (triangular polygons)\n      result += '<triangle>'\n      result += '<v1>' + (n) + '</v1>'\n      result += '<v2>' + (n + i + 1) + '</v2>'\n      result += '<v3>' + (n + i + 2) + '</v3>'\n      result += '</triangle>\\n'\n    }\n    n += p.vertices.length\n    result += '</volume>\\n'\n    options && options.statusCallback && options.statusCallback({progress: 100 * i / CSG.polygons.length})\n  })\n  result += '</mesh>\\n</object>\\n'\n  result += '</amf>\\n'\n\n  options && options.statusCallback && options.statusCallback({progress: 100})\n\n  return [result]\n}\n\nfunction CSGVectortoAMFString (v) {\n  return '<x>' + v._x + '</x><y>' + v._y + '</y><z>' + v._z + '</z>'\n}\n\nfunction CSGVertextoAMFString (vertex) {\n  return '<vertex><coordinates>' + CSGVectortoAMFString(vertex.pos) + '</coordinates></vertex>\\n'\n}\n/*\nCSG.Vector3D.prototype.toAMFString = function () {\n  return '<x>' + this._x + '</x><y>' + this._y + '</y><z>' + this._z + '</z>'\n}\n\nCSG.Vertex.prototype.toAMFString = function () {\n  return '<vertex><coordinates>' + this.pos.toAMFString() + '</coordinates></vertex>\\n'\n} */\n\nmodule.exports = {\n  serialize,\n  mimeType\n}\n\n},{\"@jscad/io-utils\":92}],9:[function(require,module,exports){\nconst WebWorkify = require('webworkify')\nconst { CAG, CSG } = require('@jscad/csg')\nconst oscad = require('@jscad/csg/api')\nconst createJscadFunction = require('../code-loading/jscad-function')\nconst { replaceIncludes } = require('../code-loading/replaceIncludes')\nconst { resolveIncludesHttp } = require('../code-loading/resolveIncludesHttp')\nconst { toArray } = require('../utils/arrays')\n\n/**\n * evaluate script & rebuild solids, in main thread\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nfunction rebuildSolids (script, fullurl, parameters, callback, options) {\n  let basePath = fullurl\n  if (basePath.lastIndexOf('/') >= 0) {\n    basePath = basePath.substring(0, basePath.lastIndexOf('/') + 1)\n  }\n  const defaults = {\n    implicitGlobals: true,\n    memFs: undefined,\n    includeResolver: resolveIncludesHttp // default function to retrieve 'includes'\n  }\n  options = Object.assign({}, defaults, options)\n\n  replaceIncludes(script, basePath, '', {includeResolver: options.includeResolver, memFs: options.memFs})\n    .then(function ({source}) {\n      const globals = options.implicitGlobals ? (options.globals ? options.globals : {oscad}) : {}\n      const func = createJscadFunction(source, globals)\n    // stand-in for the include function(no-op)\n      const include = x => x\n      try {\n        let objects = func(parameters, include, globals)\n        objects = toArray(objects)\n        if (objects.length === 0) {\n          throw new Error('The JSCAD script must return one or more CSG or CAG solids.')\n        }\n        callback(undefined, objects)\n      } catch (error) {\n        callback(error, undefined)\n      }\n    }).catch(error => callback(error, undefined))\n\n  // have we been asked to stop our work?\n  return {\n    cancel: () => {\n      console.log('cannot stop work in main thread, sorry')\n    }\n  }\n}\n\n/**\n * evaluate script & rebuild solids, in seperate thread/webworker\n * @param {String} script the script\n * @param {String} fullurl full url of current script\n * @param {Object} parameters the parameters to use with the script\n * @param {Object} callback the callback to call once evaluation is done /failed\n * @param {Object} options the settings to use when rebuilding the solid\n */\nfunction rebuildSolidsInWorker (script, fullurl, parameters, callback, options) {\n  if (!parameters) { throw new Error(\"JSCAD: missing 'parameters'\") }\n  if (!window.Worker) throw new Error('Worker threads are unsupported.')\n  const defaults = {\n    implicitGlobals: true,\n    memFs: undefined,\n    includeResolver: resolveIncludesHttp // default function to retrieve 'includes'\n  }\n  options = Object.assign({}, defaults, options)\n\n  let basePath = fullurl\n  if (basePath.lastIndexOf('/') >= 0) {\n    basePath = basePath.substring(0, basePath.lastIndexOf('/') + 1)\n  }\n\n  let worker\n  replaceIncludes(script, basePath, '', {includeResolver: options.includeResolver, memFs: options.memFs})\n    .then(function ({source}) {\n      worker = WebWorkify(require('../code-loading/jscad-worker.js'))\n    // we need to create special options as you cannot send functions to webworkers\n      const workerOptions = {implicitGlobals: options.implicitGlobals}\n      worker.onmessage = function (e) {\n        if (e.data instanceof Object) {\n          const data = e.data.objects.map(function (object) {\n            if (object['class'] === 'CSG') { return CSG.fromCompactBinary(object) }\n            if (object['class'] === 'CAG') { return CAG.fromCompactBinary(object) }\n          })\n          callback(undefined, data)\n        }\n      }\n      worker.onerror = function (e) {\n        callback(`Error in line ${e.lineno} : ${e.message}`, undefined)\n      }\n      worker.postMessage({cmd: 'render', fullurl, source, parameters, options: workerOptions})\n    }).catch(error => callback(error, undefined))\n\n  // have we been asked to stop our work?\n  return {\n    cancel: () => {\n      if (worker) worker.terminate()\n    }\n  }\n}\n\nmodule.exports = {\n  rebuildSolids,\n  rebuildSolidsInWorker\n}\n\n},{\"../code-loading/jscad-function\":10,\"../code-loading/jscad-worker.js\":11,\"../code-loading/replaceIncludes\":12,\"../code-loading/resolveIncludesHttp\":13,\"../utils/arrays\":19,\"@jscad/csg\":22,\"@jscad/csg/api\":21,\"webworkify\":269}],10:[function(require,module,exports){\n/**\n * Create an function for processing the JSCAD script into CSG/CAG objects\n * @param {String} script the script\n * @param {Object} globals the globals to use when evaluating the script: these are not ..\n * ...ACTUAL globals, merely functions/ variable accessible AS IF they were globals !\n */\nfunction createJscadFunction (script, globals) {\n  // console.log('globals', globals)\n  // not a fan of this, we have way too many explicit api elements\n  let globalsList = ''\n  // each top key is a library ie : openscad helpers etc\n  // one level below that is the list of libs\n  // last level is the actual function we want to export to 'local' scope\n  Object.keys(globals).forEach(function (libKey) {\n    const lib = globals[libKey]\n    // console.log(`lib:${libKey}: ${lib}`)\n    Object.keys(lib).forEach(function (libItemKey) {\n      const libItems = lib[libItemKey]\n      // console.log('libItems', libItems)\n      Object.keys(libItems).forEach(function (toExposeKey) {\n        // console.log('toExpose',toExpose )\n        const text = `const ${toExposeKey} = globals['${libKey}']['${libItemKey}']['${toExposeKey}']\n`\n        globalsList += text\n      })\n    })\n  })\n\n  const source = `// SYNC WORKER\n    ${globalsList}\n\n    //user defined script(s)\n    ${script}\n\n    if (typeof (main) !== 'function') {\n      throw new Error('The JSCAD script must contain a function main() which returns one or more CSG or CAG solids.')\n    }\n\n    return main(params)\n  `\n\n  var f = new Function('params', 'include', 'globals', source)\n  return f\n}\n\nmodule.exports = createJscadFunction\n\n},{}],11:[function(require,module,exports){\n// jscad-worker.js\n//\n// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\nconst {isCSG, isCAG} = require('@jscad/csg')\nconst oscad = require('@jscad/csg/api')\nconst createJscadFunction = require('./jscad-function')\nconst { toArray } = require('../utils/arrays')\n\n/**\n * Create an worker (thread) for processing the JSCAD script into CSG/CAG objects\n */\nmodule.exports = function (self) {\n  self.onmessage = function (e) {\n    if (e.data instanceof Object) {\n      var data = e.data\n      if (data.cmd === 'render') {\n        const {source, parameters, options} = e.data\n        const include = x => x\n        const globals = options.implicitGlobals ? { oscad } : {}\n        const func = createJscadFunction(source, globals)\n\n        let objects = func(parameters, include, globals)\n        objects = toArray(objects)\n          .map(function (object) {\n            if (isCSG(object) || isCAG(object)) {\n              return object.toCompactBinary()\n            }\n          })\n\n        if (objects.length === 0) {\n          throw new Error('The JSCAD script must return one or more CSG or CAG solids.')\n        }\n        self.postMessage({cmd: 'rendered', objects})\n      }\n    }\n  }\n}\n\n},{\"../utils/arrays\":19,\"./jscad-function\":10,\"@jscad/csg\":22,\"@jscad/csg/api\":21}],12:[function(require,module,exports){\nconst esprima = require('esprima')\nconst estraverse = require('estraverse')\nconst astring = require('astring')\n\n/**\n * helper function that finds include() statements in files,\n * fetches their code & returns it (recursively) returning the whole code with\n * inlined includes\n * this is more reliable than async xhr + eval()\n * but is still just a temporary solution until using actual modules & loaders (commonjs , es6 etc)\n * @param {String} source the original script (with include statements)\n * @param {String} basePath base path, for xhr resolution\n * @param {String} relPath relative path for include hierarchies\n * @param {String} memFs memFs cache object\n * @returns {String} the full script, with inlined\n */\nfunction replaceIncludes (source, basePath, relPath, {memFs, includeResolver}) {\n  return new Promise(function (resolve, reject) {\n    const moduleAst = astFromSource(source)\n    const foundIncludes = findIncludes(moduleAst).map(x => x.value)\n\n    const modulePromises = foundIncludes.map(function (uri, index) {\n      return includeResolver(basePath, uri, memFs)\n        .then(\n          includedScript => replaceIncludes(includedScript, basePath, `${relPath}/${uri}`, {memFs, includeResolver})\n        )\n        .then(data => {\n          data.moduleCache[uri] = data.source\n          return data\n        })\n\n    })\n    Promise.all(modulePromises).then(function (resolvedModules) {\n      let resolvedScript = source\n      const moduleCache = resolvedModules.reduce((acc, cur) => {\n        Object.keys(cur.moduleCache).forEach(key => { acc[key] = cur.moduleCache[key] })\n        return acc\n      }, {})\n      // we are the root level\n      if (relPath === '') {\n        const moduleSources = Object.keys(moduleCache).map(function (uri) {\n          return `globals['includesSource']['${uri}'] = function() {${moduleCache[uri]}}`\n        }).join('\\n')\n\n        resolvedScript = `globals['includedFiles'] || (globals['includedFiles'] = {})\nglobals['includesSource'] || (globals['includesSource'] = {})\nif (!globals['originalIncludeFunction']) {\n  globals['originalIncludeFunction'] = include\n  include = function(file) {\n    if (!globals['includedFiles'][file]) {\n      globals['includesSource'][file]()\n      globals['includedFiles'][file] = true\n    }\n  }\n}\n${moduleSources}\n${resolvedScript}\n`\n      }\n      resolve({source: resolvedScript, moduleCache})\n    })\n    .catch(reject)\n  })\n}\n\nfunction isInclude (node) {\n  return (node.type === 'CallExpression' && node.callee && node.callee.name && node.callee.name === 'include')\n}\n\nfunction astFromSource (source, options) {\n  const defaults = {\n    loc: true, range: true, tolerant: true\n  }\n  options = Object.assign({}, defaults, options)\n\n  let ast\n  try {\n    ast = esprima.parse(source, options)\n    // console.log(\"ast\",ast,\"scope\", scope);\n  } catch (error) {\n    console.error('failed to generate ast:', error)\n    ast = {}\n  }\n  return ast\n}\n\nfunction findIncludes (ast) {\n  let includes = []\n  estraverse.traverse(ast, {\n    enter: function (node, parent) {\n      if (isInclude(node)) {\n        if (node.arguments && arguments.length > 0) {\n          const includePath = node.arguments[0]\n          const {raw, value} = includePath\n          includes.push({raw, value})\n        }\n        return estraverse.VisitorOption.Skip\n      }\n    }\n  })\n  return includes\n}\n\nfunction replaceIncludesInAst (ast, replacement = '') {\n  const result = estraverse.replace(ast, {\n    enter: function (node, parent) {\n      if (isInclude(node)) {\n        if (node.arguments && arguments.length > 0) {\n          return {type: 'Literal', value: replacement}\n        }\n        return estraverse.VisitorOption.Skip\n      }\n    }\n  })\n\n  return astring.generate(result, {indent: '  ', lineEnd: '\\n'})\n}\n\nmodule.exports = {\n  replaceIncludes\n}\n\n},{\"astring\":144,\"esprima\":156,\"estraverse\":157}],13:[function(require,module,exports){\n/**\n * fetch the requested script either via MemFs or HTTP Request\n * (Note: The resolved modules are prepepended in front of the calling script\n * @param {String} relpath the relative path\n * @param {String} scriptPath the path to the script\n * @param {Object} memFs local cache (optional)\n */\nfunction resolveIncludesHttp (relpath, scriptPath, memFs) {\n  // include the requested script via MemFs if possible\n  return new Promise(function (resolve, reject) {\n    if (typeof (memFs) === 'object') {\n      for (var fs in memFs) {\n        if (memFs[fs].fullpath === scriptPath || './' + memFs[fs].fullpath === scriptPath || memFs[fs].name === scriptPath) {\n          resolve(memFs[fs].source)\n          return\n        }\n      }\n    }\n    // include the requested script via webserver access\n    const xhr = new XMLHttpRequest()\n    let url = relpath + scriptPath\n    if (scriptPath.match(/^(https:|http:)/i)) {\n      url = scriptPath\n    }\n    xhr.open('GET', url, true)\n    xhr.onload = function (event) {\n      const status = '' + event.currentTarget.status\n      if (status.length > 0 && status[0] === '2') {\n        resolve(this.responseText)\n      } else {\n        reject(this.responseText)\n      }\n    }\n    xhr.onerror = err => { reject(err) }\n    xhr.send()\n  })\n}\n\nmodule.exports = {\n  resolveIncludesHttp\n}\n\n},{}],14:[function(require,module,exports){\nconst { makeBlob } = require('@jscad/io')\n\nconst Blob = makeBlob()\n\nfunction convertToBlob (input) {\n  const {data, mimeType} = input\n  const blob = new Blob(data, { type: mimeType })\n  return blob\n}\n\nmodule.exports = {\n  convertToBlob\n}\n\n},{\"@jscad/io\":94}],15:[function(require,module,exports){\nconst { isCSG, isCAG } = require('@jscad/csg')\n\n// handled format descriptions\nconst formats = {\n  stl: {\n    displayName: 'STL (Binary)',\n    description: 'STereoLithography, Binary',\n    extension: 'stl',\n    mimetype: 'application/sla',\n    convertCSG: true,\n    convertCAG: false\n  },\n  stla: {\n    displayName: 'STL (ASCII)',\n    description: 'STereoLithography, ASCII',\n    extension: 'stl',\n    mimetype: 'application/sla',\n    convertCSG: true,\n    convertCAG: false\n  },\n  stlb: {\n    displayName: 'STL (Binary)',\n    description: 'STereoLithography, Binary',\n    extension: 'stl',\n    mimetype: 'application/sla',\n    convertCSG: true,\n    convertCAG: false\n  },\n\n  amf: {\n    displayName: 'AMF (experimental)',\n    description: 'Additive Manufacturing File Format',\n    extension: 'amf',\n    mimetype: 'application/amf+xml',\n    convertCSG: true,\n    convertCAG: false },\n  x3d: {\n    displayName: 'X3D',\n    description: 'X3D File Format',\n    extension: 'x3d',\n    mimetype: 'model/x3d+xml',\n    convertCSG: true,\n    convertCAG: false },\n  dxf: {\n    displayName: 'DXF',\n    description: 'AutoCAD Drawing Exchange Format',\n    extension: 'dxf',\n    mimetype: 'application/dxf',\n    convertCSG: true,\n    convertCAG: true },\n  jscad: {\n    displayName: 'JSCAD',\n    description: 'OpenJSCAD.org Source',\n    extension: 'jscad',\n    mimetype: 'application/javascript',\n    convertCSG: true,\n    convertCAG: true\n  },\n  js: {\n    displayName: 'js',\n    description: 'JavaScript Source',\n    extension: 'js',\n    mimetype: 'application/javascript',\n    convertCSG: true,\n    convertCAG: true\n  },\n  svg: {\n    displayName: 'SVG',\n    description: 'Scalable Vector Graphics Format',\n    extension: 'svg',\n    mimetype: 'image/svg+xml',\n    convertCSG: false,\n    convertCAG: true\n  },\n  gcode: {\n    displayName: 'gcode',\n    description: 'G Programming Language File Format' },\n  json: {\n    displayName: 'json',\n    description: 'JavaScript Object Notation Format' }\n}\n\n// handled input formats\nconst conversionFormats = [\n// 3D file formats\n  'amf',\n  'gcode',\n  'js',\n  'jscad',\n  'obj',\n  'scad',\n  'stl',\n  'dxf',\n// 2D file formats\n  'svg'\n]\n\nfunction supportedFormatsForObjects (objects) {\n  let objectFormats = []\n  let foundCSG = false\n  let foundCAG = false\n  for (let i = 0; i < objects.length; i++) {\n    if (isCSG(objects[i])) { foundCSG = true }\n    if (isCAG(objects[i])) { foundCAG = true }\n  }\n  for (let format in formats) {\n    if (foundCSG && formats[format].convertCSG === true) {\n      objectFormats[objectFormats.length] = format\n      continue // only add once\n    }\n    if (foundCAG && formats[format].convertCAG === true) {\n      objectFormats[objectFormats.length] = format\n    }\n  }\n  return objectFormats\n}\n\nmodule.exports = {\n  formats,\n  conversionFormats,\n  supportedFormatsForObjects\n}\n\n},{\"@jscad/csg\":22}],16:[function(require,module,exports){\nconst { formats } = require('./formats')\nconst {mergeSolids2} = require('../utils/mergeSolids')\n\nconst {stlSerializer} = require('@jscad/io')\nconst {amfSerializer} = require('@jscad/io')\nconst {x3dSerializer} = require('@jscad/io')\nconst {svgSerializer} = require('@jscad/io')\nconst {jsonSerializer} = require('@jscad/io')\nconst {dxfSerializer} = require('@jscad/io')\n\nfunction prepareOutput (objects, params) {\n  const {format, version = '0.0.0'} = params\n\n  let object\n\n  if (format === 'jscad' || format === 'js') {\n    object = objects\n  } else {\n    const formatInfo = formats[format]\n    object = mergeSolids2(objects, formatInfo)\n  }\n\n  const metaData = {\n    producer: 'OpenJSCAD.org ' + version,\n    date: new Date(),\n    version\n  }\n\n  const outputFormatHandlers = {\n    amf: amfSerializer, // CSG to AMF\n    stl: stlSerializer, // CSG to STL ASCII // NOTE: now using binary output by default !!\n    stla: {\n      mimeType: stlSerializer.mimeType,\n      serialize: data => stlSerializer.serialize(data, {binary: false})\n    }, // CSG to STL ASCII\n    stlb: stlSerializer, // CSG to STL BINARY\n    dxf: dxfSerializer, // CAG to DXF\n    svg: svgSerializer, // CAG to SVG\n    x3d: x3dSerializer, // CSG to X3D\n    json: jsonSerializer, // CSG or CAG to JSON\n    js: {\n      mimeType: formats['js'].mimetype,\n      serialize: object => [object] // js , pass through\n    },\n    jscad: {\n      mimeType: formats['jscad'].mimetype,\n      serialize: object => [object] // jscad , pass through\n    },\n    undefined: () => {\n      throw new Error('Not supported : only jscad, stl, amf, dxf, svg or json as output format')\n    }\n  }\n  const data = outputFormatHandlers[format].serialize(object, metaData)\n  const mimeType = outputFormatHandlers[format].mimeType\n  return {data, mimeType}\n}\n\nmodule.exports = {\n  prepareOutput\n}\n\n},{\"../utils/mergeSolids\":20,\"./formats\":15,\"@jscad/io\":94}],17:[function(require,module,exports){\n/**\n * parse the jscad script to get the parameter definitions\n * @param {String} script the script\n * @return {Object} params : the parsed parameters\n */\nmodule.exports = function getParamDefinitions (script) {\n  var scriptisvalid = true\n  script += '\\nfunction include() {}' // at least make it not throw an error so early\n  try {\n    // first try to execute the script itself\n    // this will catch any syntax errors\n    // BUT we can't introduce any new function!!!\n    (new Function(script))()\n  } catch (e) {\n    scriptisvalid = false\n    throw e\n  }\n  var params = []\n  if (scriptisvalid) {\n    var script1 = \"if(typeof(getParameterDefinitions) == 'function') {return getParameterDefinitions();} else {return [];} \"\n    script1 += script\n    const f = new Function(script1)\n    params = f()\n    if ((typeof (params) !== 'object') || (typeof (params.length) !== 'number')) {\n      throw new Error('The getParameterDefinitions() function should return an array with the parameter definitions')\n    }\n  }\n  return params\n}\n\n},{}],18:[function(require,module,exports){\n/**\n * extracts the parameter\n * @param {Array} paramControls\n * @param {Boolean} onlyChanged\n * @returns {Object} the parameter values, as an object\n */\nmodule.exports = function getParameterValuesFromUIControls (paramControls, parameterDefinitions, onlyChanged) {\n  let paramValues = {}\n  let value\n  for (var i = 0; i < paramControls.length; i++) {\n    const control = paramControls[i]\n\n    switch (control.paramType) {\n      case 'choice':\n        value = control.options[control.selectedIndex].value\n        break\n      case 'float':\n      case 'number':\n        value = control.value\n        if (!isNaN(parseFloat(value)) && isFinite(value)) {\n          value = parseFloat(value)\n        } else {\n          throw new Error('Parameter (' + control.paramName + ') is not a valid number (' + value + ')')\n        }\n        break\n      case 'int':\n        value = control.value\n        if (!isNaN(parseFloat(value)) && isFinite(value)) {\n          value = parseInt(value)\n        } else {\n          throw new Error('Parameter (' + control.paramName + ') is not a valid number (' + value + ')')\n        }\n        break\n      case 'checkbox':\n        value = control.checked\n        break\n      case 'radio':\n        if (!control.checked) {\n          continue\n        }\n        value = control.value\n        break\n      default:\n        value = control.value\n        break\n    }\n    if (onlyChanged) {\n      if ('initial' in control && control.initial === value) {\n        continue\n      } else if ('default' in control && control.default === value) {\n        continue\n      }\n    }\n    paramValues[control.paramName] = value\n  }\n  return paramValues\n}\n\n},{}],19:[function(require,module,exports){\n/* converts input data to array if it is not already an array */\nfunction toArray (data) {\n  if (!data) return []\n  if (data.constructor !== Array) return [data]\n  return data\n}\n\nmodule.exports = {toArray}\n\n},{}],20:[function(require,module,exports){\nconst { CSG, CAG, isCSG, isCAG } = require('@jscad/csg')\nconst {toArray} = require('./arrays')\n\n/**\n * convert objects to a single solid\n * @param {Array} objects the list of objects\n * @return {Object} solid : the single CSG object\n */\nfunction mergeSolids (objects, params) {\n  if (objects.length === undefined) {\n    if (isCAG(objects) || isCSG(objects)) {\n      var obj = objects\n      objects = [obj]\n    } else {\n      throw new Error('Cannot convert object (' + typeof (objects) + ') to solid')\n    }\n  }\n\n  var solid = null\n  for (var i = 0; i < objects.length; i++) {\n    let obj = objects[i]\n    if (isCAG(obj)) {\n      obj = obj.extrude({offset: [0, 0, 0.1]}) // convert CAG to a thin solid CSG\n    }\n    if (solid !== null) {\n      solid = solid.unionForNonIntersecting(obj)\n    } else {\n      solid = obj\n    }\n  }\n  return solid\n}\n/** combine/ merge multiple 2d & 3D solids into\n * a single 3d (CSG)  or CAG output:\n * if there is even a single 3D solid in the input,\n * all other input 2D shapes get extruded and unioned\n * with the 3D solid\n * @param  {Array} objects\n * @param  {} params\n * @returns {CSG} a single CSG/CAG object\n */\nfunction mergeSolids2 (objects, params) {\n  const {convertCSG, convertCAG} = params\n\n  let object\n  objects = toArray(objects)\n  // review the given objects\n  let foundCSG = false\n  let foundCAG = false\n  for (let i = 0; i < objects.length; i++) {\n    if (isCSG(objects[i])) { foundCSG = true }\n    if (isCAG(objects[i])) { foundCAG = true }\n  }\n\n  // convert based on the given format\n  foundCSG = foundCSG && convertCSG\n  foundCAG = foundCAG && convertCAG\n\n  if (foundCSG && foundCAG) { foundCAG = false } // use 3D conversion\n\n  object = !foundCSG ? new CAG() : new CSG()\n\n  for (let i = 0; i < objects.length; i++) {\n    if (foundCSG === true && isCAG(objects[i])) {\n      object = object.union(objects[i].extrude({offset: [0, 0, 0.1]})) // convert CAG to a thin solid CSG\n      continue\n    }\n    if (foundCAG === true && isCSG(objects[i])) {\n      continue\n    }\n    object = object.union(objects[i])\n  }\n\n  return object\n}\n\nmodule.exports = {\n  mergeSolids,\n  mergeSolids2\n}\n\n},{\"./arrays\":19,\"@jscad/csg\":22}],21:[function(require,module,exports){\nconst api = require('./src/api/index')\n// const csg = require('./csg')\n\nmodule.exports = api // {api, csg}\n\n},{\"./src/api/index\":29}],22:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2014 bebbi (elghatta@gmail.com)\nCopyright (c) 2013 Eduard Bespalov (edwbes@gmail.com)\nCopyright (c) 2012 Joost Nieuwenhuijse (joost@newhouse.nl)\nCopyright (c) 2011 Evan Wallace (http://evanw.github.com/csg.js/)\nCopyright (c) 2012 Alexandre Girard (https://github.com/alx)\n\nAll code released under MIT license\n\n## Overview\n\nFor an overview of the CSG process see the original csg.js code:\nhttp://evanw.github.com/csg.js/\n\nCSG operations through BSP trees suffer from one problem: heavy fragmentation\nof polygons. If two CSG solids of n polygons are unified, the resulting solid may have\nin the order of n*n polygons, because each polygon is split by the planes of all other\npolygons. After a few operations the number of polygons explodes.\n\nThis version of CSG.js solves the problem in 3 ways:\n\n1. Every polygon split is recorded in a tree (CSG.PolygonTreeNode). This is a separate\ntree, not to be confused with the CSG tree. If a polygon is split into two parts but in\nthe end both fragments have not been discarded by the CSG operation, we can retrieve\nthe original unsplit polygon from the tree, instead of the two fragments.\n\nThis does not completely solve the issue though: if a polygon is split multiple times\nthe number of fragments depends on the order of subsequent splits, and we might still\nend up with unncessary splits:\nSuppose a polygon is first split into A and B, and then into A1, B1, A2, B2. Suppose B2 is\ndiscarded. We will end up with 2 polygons: A and B1. Depending on the actual split boundaries\nwe could still have joined A and B1 into one polygon. Therefore a second approach is used as well:\n\n2. After CSG operations all coplanar polygon fragments are joined by a retesselating\noperation. See CSG.reTesselated(). Retesselation is done through a\nlinear sweep over the polygon surface. The sweep line passes over the y coordinates\nof all vertices in the polygon. Polygons are split at each sweep line, and the fragments\nare joined horizontally and vertically into larger polygons (making sure that we\nwill end up with convex polygons).\nThis still doesn't solve the problem completely: due to floating point imprecisions\nwe may end up with small gaps between polygons, and polygons may not be exactly coplanar\nanymore, and as a result the retesselation algorithm may fail to join those polygons.\nTherefore:\n\n3. A canonicalization algorithm is implemented: it looks for vertices that have\napproximately the same coordinates (with a certain tolerance, say 1e-5) and replaces\nthem with the same vertex. If polygons share a vertex they will actually point to the\nsame CSG.Vertex instance. The same is done for polygon planes. See CSG.canonicalized().\n\nPerformance improvements to the original CSG.js:\n\nReplaced the flip() and invert() methods by flipped() and inverted() which don't\nmodify the source object. This allows to get rid of all clone() calls, so that\nmultiple polygons can refer to the same CSG.Plane instance etc.\n\nThe original union() used an extra invert(), clipTo(), invert() sequence just to remove the\ncoplanar front faces from b; this is now combined in a single b.clipTo(a, true) call.\n\nDetection whether a polygon is in front or in back of a plane: for each polygon\nwe are caching the coordinates of the bounding sphere. If the bounding sphere is\nin front or in back of the plane we don't have to check the individual vertices\nanymore.\n\nOther additions to the original CSG.js:\n\nCSG.Vector class has been renamed into CSG.Vector3D\n\nClasses for 3D lines, 2D vectors, 2D lines, and methods to find the intersection of\na line and a plane etc.\n\nTransformations: CSG.transform(), CSG.translate(), CSG.rotate(), CSG.scale()\n\nExpanding or contracting a solid: CSG.expand() and CSG.contract(). Creates nice\nsmooth corners.\n\nThe vertex normal has been removed since it complicates retesselation. It's not needed\nfor solid CAD anyway.\n\n*/\n\nconst {addTransformationMethodsToPrototype, addCenteringToPrototype} = require('./src/core/mutators')\nlet CSG = require('./src/core/CSG')\nlet CAG = require('./src/core/CAG')\n\n// FIXME: how many are actual usefull to be exposed as API ?? looks like a code smell\nconst { _CSGDEBUG,\n  defaultResolution2D,\n  defaultResolution3D,\n  EPS,\n  angleEPS,\n  areaEPS,\n  all,\n  top,\n  bottom,\n  left,\n  right,\n  front,\n  back,\n  staticTag,\n  getTag} = require('./src/core/constants')\n\nCSG._CSGDEBUG = _CSGDEBUG\nCSG.defaultResolution2D = defaultResolution2D\nCSG.defaultResolution3D = defaultResolution3D\nCSG.EPS = EPS\nCSG.angleEPS = angleEPS\nCSG.areaEPS = areaEPS\nCSG.all = all\nCSG.top = top\nCSG.bottom = bottom\nCSG.left = left\nCSG.right = right\nCSG.front = front\nCSG.back = back\nCSG.staticTag = staticTag\nCSG.getTag = getTag\n\n// eek ! all this is kept for backwards compatibility...for now\nCSG.Vector2D = require('./src/core/math/Vector2')\nCSG.Vector3D = require('./src/core/math/Vector3')\nCSG.Vertex = require('./src/core/math/Vertex3')\nCAG.Vertex = require('./src/core/math/Vertex2')\nCSG.Plane = require('./src/core/math/Plane')\nCSG.Polygon = require('./src/core/math/Polygon3')\nCSG.Polygon2D = require('./src/core/math/Polygon2')\nCSG.Line2D = require('./src/core/math/Line2')\nCSG.Line3D = require('./src/core/math/Line3')\nCSG.Path2D = require('./src/core/math/Path2')\nCSG.OrthoNormalBasis = require('./src/core/math/OrthoNormalBasis')\nCSG.Matrix4x4 = require('./src/core/math/Matrix4')\n\nCAG.Side = require('./src/core/math/Side')\n\nCSG.Connector = require('./src/core/connectors').Connector\nCSG.ConnectorList = require('./src/core/connectors').ConnectorList\nCSG.Properties = require('./src/core/Properties')\n\nconst {circle, ellipse, rectangle, roundedRectangle} = require('./src/api/primitives2d')\nconst {sphere, cube, roundedCube, cylinder, roundedCylinder, cylinderElliptic, polyhedron} = require('./src/api/primitives3d')\n\nCSG.sphere = sphere\nCSG.cube = cube\nCSG.roundedCube = roundedCube\nCSG.cylinder = cylinder\nCSG.roundedCylinder = roundedCylinder\nCSG.cylinderElliptic = cylinderElliptic\nCSG.polyhedron = polyhedron\n\nCAG.circle = circle\nCAG.ellipse = ellipse\nCAG.rectangle = rectangle\nCAG.roundedRectangle = roundedRectangle\n\n// injecting factories\nconst {fromPolygons, fromCompactBinary, fromObject, fromSlices} = require('./src/core/CSGFactories')\nCSG.fromCompactBinary = fromCompactBinary\nCSG.fromObject = fromObject\nCSG.fromSlices = fromSlices\nCSG.fromPolygons = fromPolygons\n\nCSG.toPointCloud = require('./src/api/debugHelpers').toPointCloud\n\nconst CAGFactories = require('./src/core/CAGFactories')\nCAG.fromSides = CAGFactories.fromSides\nCAG.fromObject = CAGFactories.fromObject\nCAG.fromPoints = CAGFactories.fromPoints\nCAG.fromPointsNoCheck = CAGFactories.fromPointsNoCheck\nCAG.fromPath2 = CAGFactories.fromPath2\nCAG.fromFakeCSG = CAGFactories.fromFakeCSG\nCAG.fromCompactBinary = CAGFactories.fromCompactBinary\n\n/// ////////////////////////////////////\n// option parsers\nconst optionsParsers = require('./src/api/optionParsers')\n\n// ////////////////////////////////////\naddTransformationMethodsToPrototype(CSG.prototype)\naddTransformationMethodsToPrototype(CSG.Vector2D.prototype)\naddTransformationMethodsToPrototype(CSG.Vector3D.prototype)\naddTransformationMethodsToPrototype(CSG.Vertex.prototype)\naddTransformationMethodsToPrototype(CSG.Plane.prototype)\naddTransformationMethodsToPrototype(CSG.Polygon.prototype)\naddTransformationMethodsToPrototype(CSG.Line2D.prototype)\naddTransformationMethodsToPrototype(CSG.Line3D.prototype)\naddTransformationMethodsToPrototype(CSG.Path2D.prototype)\naddTransformationMethodsToPrototype(CSG.OrthoNormalBasis.prototype)\naddTransformationMethodsToPrototype(CSG.Connector.prototype)\n\naddTransformationMethodsToPrototype(CAG.prototype)\naddTransformationMethodsToPrototype(CAG.Side.prototype)\naddTransformationMethodsToPrototype(CAG.Vertex.prototype)\n\nCSG.parseOptionAs2DVector = optionsParsers.parseOptionAs3DVector\nCSG.parseOptionAs3DVector = optionsParsers.parseOptionAs3DVector\nCSG.parseOptionAs3DVectorList = optionsParsers.parseOptionAs3DVectorList\nCSG.parseOptionAsBool = optionsParsers.parseOptionAsBool\nCSG.parseOptionAsFloat = optionsParsers.parseOptionAsFloat\nCSG.parseOptionAsInt = optionsParsers.parseOptionAsInt\n// this is needed for now, otherwise there are missing features in Polygon2D\nCSG.Polygon2D.prototype = CAG.prototype\n\n// utilities\nconst {isCAG, isCSG} = require('./src/core/utils')\n\nconst globalApi = Object.assign({}, {CSG, CAG}, optionsParsers, {isCAG, isCSG})\n\nmodule.exports = globalApi\n\n},{\"./src/api/debugHelpers\":27,\"./src/api/optionParsers\":38,\"./src/api/primitives2d\":40,\"./src/api/primitives3d\":42,\"./src/core/CAG\":45,\"./src/core/CAGFactories\":46,\"./src/core/CSG\":47,\"./src/core/CSGFactories\":48,\"./src/core/Properties\":52,\"./src/core/connectors\":53,\"./src/core/constants\":54,\"./src/core/math/Line2\":55,\"./src/core/math/Line3\":56,\"./src/core/math/Matrix4\":57,\"./src/core/math/OrthoNormalBasis\":58,\"./src/core/math/Path2\":59,\"./src/core/math/Plane\":60,\"./src/core/math/Polygon2\":61,\"./src/core/math/Polygon3\":62,\"./src/core/math/Side\":63,\"./src/core/math/Vector2\":64,\"./src/core/math/Vector3\":65,\"./src/core/math/Vertex2\":66,\"./src/core/math/Vertex3\":67,\"./src/core/mutators\":70,\"./src/core/utils\":72}],23:[function(require,module,exports){\nconst Path2D = require('../core/math/Path2')\n\nconst cagoutlinePaths = function (_cag) {\n  let cag = _cag.canonicalized()\n  let sideTagToSideMap = {}\n  let startVertexTagToSideTagMap = {}\n  cag.sides.map(function (side) {\n    let sidetag = side.getTag()\n    sideTagToSideMap[sidetag] = side\n    let startvertextag = side.vertex0.getTag()\n    if (!(startvertextag in startVertexTagToSideTagMap)) {\n      startVertexTagToSideTagMap[startvertextag] = []\n    }\n    startVertexTagToSideTagMap[startvertextag].push(sidetag)\n  })\n  let paths = []\n  while (true) {\n    let startsidetag = null\n    for (let aVertexTag in startVertexTagToSideTagMap) {\n      let sidesForcagVertex = startVertexTagToSideTagMap[aVertexTag]\n      startsidetag = sidesForcagVertex[0]\n      sidesForcagVertex.splice(0, 1)\n      if (sidesForcagVertex.length === 0) {\n        delete startVertexTagToSideTagMap[aVertexTag]\n      }\n      break\n    }\n    if (startsidetag === null) break // we've had all sides\n    let connectedVertexPoints = []\n    let sidetag = startsidetag\n    let cagside = sideTagToSideMap[sidetag]\n    let startvertextag = cagside.vertex0.getTag()\n    while (true) {\n      connectedVertexPoints.push(cagside.vertex0.pos)\n      let nextvertextag = cagside.vertex1.getTag()\n      if (nextvertextag === startvertextag) break // we've closed the polygon\n      if (!(nextvertextag in startVertexTagToSideTagMap)) {\n        throw new Error('Area is not closed!')\n      }\n      let nextpossiblesidetags = startVertexTagToSideTagMap[nextvertextag]\n      let nextsideindex = -1\n      if (nextpossiblesidetags.length === 1) {\n        nextsideindex = 0\n      } else {\n                  // more than one side starting at the same vertex. cag means we have\n                  // two shapes touching at the same corner\n        let bestangle = null\n        let cagangle = cagside.direction().angleDegrees()\n        for (let sideindex = 0; sideindex < nextpossiblesidetags.length; sideindex++) {\n          let nextpossiblesidetag = nextpossiblesidetags[sideindex]\n          let possibleside = sideTagToSideMap[nextpossiblesidetag]\n          let angle = possibleside.direction().angleDegrees()\n          let angledif = angle - cagangle\n          if (angledif < -180) angledif += 360\n          if (angledif >= 180) angledif -= 360\n          if ((nextsideindex < 0) || (angledif > bestangle)) {\n            nextsideindex = sideindex\n            bestangle = angledif\n          }\n        }\n      }\n      let nextsidetag = nextpossiblesidetags[nextsideindex]\n      nextpossiblesidetags.splice(nextsideindex, 1)\n      if (nextpossiblesidetags.length === 0) {\n        delete startVertexTagToSideTagMap[nextvertextag]\n      }\n      cagside = sideTagToSideMap[nextsidetag]\n    } // inner loop\n    // due to the logic of fromPoints()\n    // move the first point to the last\n    if (connectedVertexPoints.length > 0) {\n      connectedVertexPoints.push(connectedVertexPoints.shift())\n    }\n    let path = new Path2D(connectedVertexPoints, true)\n    paths.push(path)\n  } // outer loop\n  return paths\n}\n\nmodule.exports = cagoutlinePaths\n\n},{\"../core/math/Path2\":59}],24:[function(require,module,exports){\nconst toArray = require('../core/utils/toArray')\n\n/**\n * Centers the given object(s) using the given options (if any)\n * @param {Object} [options] - options for centering\n * @param {Array} [options.axes=[true,true,true]] - axis of which to center, true or false\n * @param {Array} [options.center=[0,0,0]] - point of which to center the object upon\n * @param {Object|Array} objects - the shape(s) to center\n * @return {Object|Array} objects\n *\n * @example\n * let csg = center({axes: [true,false,false]}, sphere()) // center about the X axis\n */\nconst center = function (options, objects) {\n  const defaults = {\n    axes: [true, true, true],\n    center: [0, 0, 0]\n  // TODO : Add addition 'methods' of centering; midpoint, centeriod\n  }\n  options = Object.assign({}, defaults, options)\n  const {axes,center} = options\n  objects = toArray(objects)\n\n  const results = objects.map(function (object) {\n    let bounds = object.getBounds()\n    let offset = [0,0,0]\n    if (axes[0]) offset[0] = center[0] - (bounds[0].x + ((bounds[1].x - bounds[0].x) / 2))\n    if (axes[1]) offset[1] = center[1] - (bounds[0].y + ((bounds[1].y - bounds[0].y) / 2))\n    if (axes[2]) offset[2] = center[2] - (bounds[0].z + ((bounds[1].y - bounds[0].y) / 2))\n    return object.translate(offset)\n  })\n  // if there is more than one result, return them all , otherwise a single one\n  return results.length === 1 ? results[0] : results\n}\n\nmodule.exports = center\n\n},{\"../core/utils/toArray\":80}],25:[function(require,module,exports){\n// color table from http://www.w3.org/TR/css3-color/\nconst cssColors = {\n// basic color keywords\n  'black': [ 0 / 255, 0 / 255, 0 / 255 ],\n  'silver': [ 192 / 255, 192 / 255, 192 / 255 ],\n  'gray': [ 128 / 255, 128 / 255, 128 / 255 ],\n  'white': [ 255 / 255, 255 / 255, 255 / 255 ],\n  'maroon': [ 128 / 255, 0 / 255, 0 / 255 ],\n  'red': [ 255 / 255, 0 / 255, 0 / 255 ],\n  'purple': [ 128 / 255, 0 / 255, 128 / 255 ],\n  'fuchsia': [ 255 / 255, 0 / 255, 255 / 255 ],\n  'green': [ 0 / 255, 128 / 255, 0 / 255 ],\n  'lime': [ 0 / 255, 255 / 255, 0 / 255 ],\n  'olive': [ 128 / 255, 128 / 255, 0 / 255 ],\n  'yellow': [ 255 / 255, 255 / 255, 0 / 255 ],\n  'navy': [ 0 / 255, 0 / 255, 128 / 255 ],\n  'blue': [ 0 / 255, 0 / 255, 255 / 255 ],\n  'teal': [ 0 / 255, 128 / 255, 128 / 255 ],\n  'aqua': [ 0 / 255, 255 / 255, 255 / 255 ],\n  // extended color keywords\n  'aliceblue': [ 240 / 255, 248 / 255, 255 / 255 ],\n  'antiquewhite': [ 250 / 255, 235 / 255, 215 / 255 ],\n  // 'aqua': [ 0 / 255, 255 / 255, 255 / 255 ],\n  'aquamarine': [ 127 / 255, 255 / 255, 212 / 255 ],\n  'azure': [ 240 / 255, 255 / 255, 255 / 255 ],\n  'beige': [ 245 / 255, 245 / 255, 220 / 255 ],\n  'bisque': [ 255 / 255, 228 / 255, 196 / 255 ],\n  // 'black': [ 0 / 255, 0 / 255, 0 / 255 ],\n  'blanchedalmond': [ 255 / 255, 235 / 255, 205 / 255 ],\n  // 'blue': [ 0 / 255, 0 / 255, 255 / 255 ],\n  'blueviolet': [ 138 / 255, 43 / 255, 226 / 255 ],\n  'brown': [ 165 / 255, 42 / 255, 42 / 255 ],\n  'burlywood': [ 222 / 255, 184 / 255, 135 / 255 ],\n  'cadetblue': [ 95 / 255, 158 / 255, 160 / 255 ],\n  'chartreuse': [ 127 / 255, 255 / 255, 0 / 255 ],\n  'chocolate': [ 210 / 255, 105 / 255, 30 / 255 ],\n  'coral': [ 255 / 255, 127 / 255, 80 / 255 ],\n  'cornflowerblue': [ 100 / 255, 149 / 255, 237 / 255 ],\n  'cornsilk': [ 255 / 255, 248 / 255, 220 / 255 ],\n  'crimson': [ 220 / 255, 20 / 255, 60 / 255 ],\n  'cyan': [ 0 / 255, 255 / 255, 255 / 255 ],\n  'darkblue': [ 0 / 255, 0 / 255, 139 / 255 ],\n  'darkcyan': [ 0 / 255, 139 / 255, 139 / 255 ],\n  'darkgoldenrod': [ 184 / 255, 134 / 255, 11 / 255 ],\n  'darkgray': [ 169 / 255, 169 / 255, 169 / 255 ],\n  'darkgreen': [ 0 / 255, 100 / 255, 0 / 255 ],\n  'darkgrey': [ 169 / 255, 169 / 255, 169 / 255 ],\n  'darkkhaki': [ 189 / 255, 183 / 255, 107 / 255 ],\n  'darkmagenta': [ 139 / 255, 0 / 255, 139 / 255 ],\n  'darkolivegreen': [ 85 / 255, 107 / 255, 47 / 255 ],\n  'darkorange': [ 255 / 255, 140 / 255, 0 / 255 ],\n  'darkorchid': [ 153 / 255, 50 / 255, 204 / 255 ],\n  'darkred': [ 139 / 255, 0 / 255, 0 / 255 ],\n  'darksalmon': [ 233 / 255, 150 / 255, 122 / 255 ],\n  'darkseagreen': [ 143 / 255, 188 / 255, 143 / 255 ],\n  'darkslateblue': [ 72 / 255, 61 / 255, 139 / 255 ],\n  'darkslategray': [ 47 / 255, 79 / 255, 79 / 255 ],\n  'darkslategrey': [ 47 / 255, 79 / 255, 79 / 255 ],\n  'darkturquoise': [ 0 / 255, 206 / 255, 209 / 255 ],\n  'darkviolet': [ 148 / 255, 0 / 255, 211 / 255 ],\n  'deeppink': [ 255 / 255, 20 / 255, 147 / 255 ],\n  'deepskyblue': [ 0 / 255, 191 / 255, 255 / 255 ],\n  'dimgray': [ 105 / 255, 105 / 255, 105 / 255 ],\n  'dimgrey': [ 105 / 255, 105 / 255, 105 / 255 ],\n  'dodgerblue': [ 30 / 255, 144 / 255, 255 / 255 ],\n  'firebrick': [ 178 / 255, 34 / 255, 34 / 255 ],\n  'floralwhite': [ 255 / 255, 250 / 255, 240 / 255 ],\n  'forestgreen': [ 34 / 255, 139 / 255, 34 / 255 ],\n  // 'fuchsia': [ 255 / 255, 0 / 255, 255 / 255 ],\n  'gainsboro': [ 220 / 255, 220 / 255, 220 / 255 ],\n  'ghostwhite': [ 248 / 255, 248 / 255, 255 / 255 ],\n  'gold': [ 255 / 255, 215 / 255, 0 / 255 ],\n  'goldenrod': [ 218 / 255, 165 / 255, 32 / 255 ],\n  // 'gray': [ 128 / 255, 128 / 255, 128 / 255 ],\n  // 'green': [ 0 / 255, 128 / 255, 0 / 255 ],\n  'greenyellow': [ 173 / 255, 255 / 255, 47 / 255 ],\n  'grey': [ 128 / 255, 128 / 255, 128 / 255 ],\n  'honeydew': [ 240 / 255, 255 / 255, 240 / 255 ],\n  'hotpink': [ 255 / 255, 105 / 255, 180 / 255 ],\n  'indianred': [ 205 / 255, 92 / 255, 92 / 255 ],\n  'indigo': [ 75 / 255, 0 / 255, 130 / 255 ],\n  'ivory': [ 255 / 255, 255 / 255, 240 / 255 ],\n  'khaki': [ 240 / 255, 230 / 255, 140 / 255 ],\n  'lavender': [ 230 / 255, 230 / 255, 250 / 255 ],\n  'lavenderblush': [ 255 / 255, 240 / 255, 245 / 255 ],\n  'lawngreen': [ 124 / 255, 252 / 255, 0 / 255 ],\n  'lemonchiffon': [ 255 / 255, 250 / 255, 205 / 255 ],\n  'lightblue': [ 173 / 255, 216 / 255, 230 / 255 ],\n  'lightcoral': [ 240 / 255, 128 / 255, 128 / 255 ],\n  'lightcyan': [ 224 / 255, 255 / 255, 255 / 255 ],\n  'lightgoldenrodyellow': [ 250 / 255, 250 / 255, 210 / 255 ],\n  'lightgray': [ 211 / 255, 211 / 255, 211 / 255 ],\n  'lightgreen': [ 144 / 255, 238 / 255, 144 / 255 ],\n  'lightgrey': [ 211 / 255, 211 / 255, 211 / 255 ],\n  'lightpink': [ 255 / 255, 182 / 255, 193 / 255 ],\n  'lightsalmon': [ 255 / 255, 160 / 255, 122 / 255 ],\n  'lightseagreen': [ 32 / 255, 178 / 255, 170 / 255 ],\n  'lightskyblue': [ 135 / 255, 206 / 255, 250 / 255 ],\n  'lightslategray': [ 119 / 255, 136 / 255, 153 / 255 ],\n  'lightslategrey': [ 119 / 255, 136 / 255, 153 / 255 ],\n  'lightsteelblue': [ 176 / 255, 196 / 255, 222 / 255 ],\n  'lightyellow': [ 255 / 255, 255 / 255, 224 / 255 ],\n  // 'lime': [ 0 / 255, 255 / 255, 0 / 255 ],\n  'limegreen': [ 50 / 255, 205 / 255, 50 / 255 ],\n  'linen': [ 250 / 255, 240 / 255, 230 / 255 ],\n  'magenta': [ 255 / 255, 0 / 255, 255 / 255 ],\n  // 'maroon': [ 128 / 255, 0 / 255, 0 / 255 ],\n  'mediumaquamarine': [ 102 / 255, 205 / 255, 170 / 255 ],\n  'mediumblue': [ 0 / 255, 0 / 255, 205 / 255 ],\n  'mediumorchid': [ 186 / 255, 85 / 255, 211 / 255 ],\n  'mediumpurple': [ 147 / 255, 112 / 255, 219 / 255 ],\n  'mediumseagreen': [ 60 / 255, 179 / 255, 113 / 255 ],\n  'mediumslateblue': [ 123 / 255, 104 / 255, 238 / 255 ],\n  'mediumspringgreen': [ 0 / 255, 250 / 255, 154 / 255 ],\n  'mediumturquoise': [ 72 / 255, 209 / 255, 204 / 255 ],\n  'mediumvioletred': [ 199 / 255, 21 / 255, 133 / 255 ],\n  'midnightblue': [ 25 / 255, 25 / 255, 112 / 255 ],\n  'mintcream': [ 245 / 255, 255 / 255, 250 / 255 ],\n  'mistyrose': [ 255 / 255, 228 / 255, 225 / 255 ],\n  'moccasin': [ 255 / 255, 228 / 255, 181 / 255 ],\n  'navajowhite': [ 255 / 255, 222 / 255, 173 / 255 ],\n  // 'navy': [ 0 / 255, 0 / 255, 128 / 255 ],\n  'oldlace': [ 253 / 255, 245 / 255, 230 / 255 ],\n  // 'olive': [ 128 / 255, 128 / 255, 0 / 255 ],\n  'olivedrab': [ 107 / 255, 142 / 255, 35 / 255 ],\n  'orange': [ 255 / 255, 165 / 255, 0 / 255 ],\n  'orangered': [ 255 / 255, 69 / 255, 0 / 255 ],\n  'orchid': [ 218 / 255, 112 / 255, 214 / 255 ],\n  'palegoldenrod': [ 238 / 255, 232 / 255, 170 / 255 ],\n  'palegreen': [ 152 / 255, 251 / 255, 152 / 255 ],\n  'paleturquoise': [ 175 / 255, 238 / 255, 238 / 255 ],\n  'palevioletred': [ 219 / 255, 112 / 255, 147 / 255 ],\n  'papayawhip': [ 255 / 255, 239 / 255, 213 / 255 ],\n  'peachpuff': [ 255 / 255, 218 / 255, 185 / 255 ],\n  'peru': [ 205 / 255, 133 / 255, 63 / 255 ],\n  'pink': [ 255 / 255, 192 / 255, 203 / 255 ],\n  'plum': [ 221 / 255, 160 / 255, 221 / 255 ],\n  'powderblue': [ 176 / 255, 224 / 255, 230 / 255 ],\n  // 'purple': [ 128 / 255, 0 / 255, 128 / 255 ],\n  // 'red': [ 255 / 255, 0 / 255, 0 / 255 ],\n  'rosybrown': [ 188 / 255, 143 / 255, 143 / 255 ],\n  'royalblue': [ 65 / 255, 105 / 255, 225 / 255 ],\n  'saddlebrown': [ 139 / 255, 69 / 255, 19 / 255 ],\n  'salmon': [ 250 / 255, 128 / 255, 114 / 255 ],\n  'sandybrown': [ 244 / 255, 164 / 255, 96 / 255 ],\n  'seagreen': [ 46 / 255, 139 / 255, 87 / 255 ],\n  'seashell': [ 255 / 255, 245 / 255, 238 / 255 ],\n  'sienna': [ 160 / 255, 82 / 255, 45 / 255 ],\n  // 'silver': [ 192 / 255, 192 / 255, 192 / 255 ],\n  'skyblue': [ 135 / 255, 206 / 255, 235 / 255 ],\n  'slateblue': [ 106 / 255, 90 / 255, 205 / 255 ],\n  'slategray': [ 112 / 255, 128 / 255, 144 / 255 ],\n  'slategrey': [ 112 / 255, 128 / 255, 144 / 255 ],\n  'snow': [ 255 / 255, 250 / 255, 250 / 255 ],\n  'springgreen': [ 0 / 255, 255 / 255, 127 / 255 ],\n  'steelblue': [ 70 / 255, 130 / 255, 180 / 255 ],\n  'tan': [ 210 / 255, 180 / 255, 140 / 255 ],\n  // 'teal': [ 0 / 255, 128 / 255, 128 / 255 ],\n  'thistle': [ 216 / 255, 191 / 255, 216 / 255 ],\n  'tomato': [ 255 / 255, 99 / 255, 71 / 255 ],\n  'turquoise': [ 64 / 255, 224 / 255, 208 / 255 ],\n  'violet': [ 238 / 255, 130 / 255, 238 / 255 ],\n  'wheat': [ 245 / 255, 222 / 255, 179 / 255 ],\n  // 'white': [ 255 / 255, 255 / 255, 255 / 255 ],\n  'whitesmoke': [ 245 / 255, 245 / 255, 245 / 255 ],\n  // 'yellow': [ 255 / 255, 255 / 255, 0 / 255 ],\n  'yellowgreen': [ 154 / 255, 205 / 255, 50 / 255 ]\n}\n\n/**\n * Converts an CSS color name to RGB color.\n *\n * @param   String  s       The CSS color name\n * @return  Array           The RGB representation, or [0,0,0] default\n */\nfunction css2rgb (s) {\n  return cssColors[s.toLowerCase()]\n}\n\n// color( (array[r,g,b] | css-string) [,alpha] (,array[objects] | list of objects) )\n/** apply the given color to the input object(s)\n * @param {Object} color - either an array or a hex string of color values\n * @param {Object|Array} objects either a single or multiple CSG/CAG objects to color\n * @returns {CSG} new CSG object , with the given color\n *\n * @example\n * let redSphere = color([1,0,0,1], sphere())\n */\nfunction color (color) {\n  let object\n  let i = 1\n  let a = arguments\n\n  // assume first argument is RGB array\n  // but check if first argument is CSS string\n  if (typeof color === 'string') {\n    color = css2rgb(color)\n  }\n  // check if second argument is alpha\n  if (Number.isFinite(a[i])) {\n    color = color.concat(a[i])\n    i++\n  }\n  // check if next argument is an an array\n  if (Array.isArray(a[i])) {\n    a = a[i]\n    i = 0\n  } // use this as the list of objects\n  for (object = a[i++]; i < a.length; i++) {\n    object = object.union(a[i])\n  }\n  return object.setColor(color)\n}\n\n// from http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c\n/**\n * Converts an RGB color value to HSL. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes r, g, and b are contained in the set [0, 1] and\n * returns h, s, and l in the set [0, 1].\n *\n * @param   Number  r       The red color value\n * @param   Number  g       The green color value\n * @param   Number  b       The blue color value\n * @return  Array           The HSL representation\n */\nfunction rgb2hsl (r, g, b) {\n  if (r.length) {\n    b = r[2]\n    g = r[1]\n    r = r[0]\n  }\n  let max = Math.max(r, g, b)\n  let min = Math.min(r, g, b)\n  let h\n  let s\n  let l = (max + min) / 2\n\n  if (max === min) {\n    h = s = 0 // achromatic\n  } else {\n    let d = max - min\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n    switch (max) {\n      case r:\n        h = (g - b) / d + (g < b ? 6 : 0)\n        break\n      case g:\n        h = (b - r) / d + 2\n        break\n      case b:\n        h = (r - g) / d + 4\n        break\n    }\n    h /= 6\n  }\n\n  return [h, s, l]\n}\n\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h, s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param   Number  h       The hue\n * @param   Number  s       The saturation\n * @param   Number  l       The lightness\n * @return  Array           The RGB representation\n */\nfunction hsl2rgb (h, s, l) {\n  if (h.length) {\n    h = h[0]\n    s = h[1]\n    l = h[2]\n  }\n  let r\n  let g\n  let b\n\n  if (s === 0) {\n    r = g = b = l // achromatic\n  } else {\n    let q = l < 0.5 ? l * (1 + s) : l + s - l * s\n    let p = 2 * l - q\n    r = hue2rgb(p, q, h + 1 / 3)\n    g = hue2rgb(p, q, h)\n    b = hue2rgb(p, q, h - 1 / 3)\n  }\n\n  return [r, g, b]\n}\n\nfunction hue2rgb (p, q, t) {\n  if (t < 0) t += 1\n  if (t > 1) t -= 1\n  if (t < 1 / 6) return p + (q - p) * 6 * t\n  if (t < 1 / 2) return q\n  if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n  return p\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 1] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param   Number  r       The red color value\n * @param   Number  g       The green color value\n * @param   Number  b       The blue color value\n * @return  Array           The HSV representation\n */\n\nfunction rgb2hsv (r, g, b) {\n  if (r.length) {\n    r = r[0]\n    g = r[1]\n    b = r[2]\n  }\n  let max = Math.max(r, g, b)\n  let min = Math.min(r, g, b)\n  let h\n  let s\n  let v = max\n\n  let d = max - min\n  s = max === 0 ? 0 : d / max\n\n  if (max === min) {\n    h = 0 // achromatic\n  } else {\n    switch (max) {\n      case r:\n        h = (g - b) / d + (g < b ? 6 : 0)\n        break\n      case g:\n        h = (b - r) / d + 2\n        break\n      case b:\n        h = (r - g) / d + 4\n        break\n    }\n    h /= 6\n  }\n\n  return [h, s, v]\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 1].\n *\n * @param   Number  h       The hue\n * @param   Number  s       The saturation\n * @param   Number  v       The value\n * @return  Array           The RGB representation\n */\nfunction hsv2rgb (h, s, v) {\n  if (h.length) {\n    h = h[0]\n    s = h[1]\n    v = h[2]\n  }\n  let r, g, b\n\n  let i = Math.floor(h * 6)\n  let f = h * 6 - i\n  let p = v * (1 - s)\n  let q = v * (1 - f * s)\n  let t = v * (1 - (1 - f) * s)\n\n  switch (i % 6) {\n    case 0:\n      r = v, g = t, b = p\n      break\n    case 1:\n      r = q, g = v, b = p\n      break\n    case 2:\n      r = p, g = v, b = t\n      break\n    case 3:\n      r = p, g = q, b = v\n      break\n    case 4:\n      r = t, g = p, b = v\n      break\n    case 5:\n      r = v, g = p, b = q\n      break\n  }\n\n  return [r, g, b]\n}\n\n/**\n * Converts a HTML5 color value (string) to RGB values\n * See the color input type of HTML5 forms\n * Conversion formula:\n * - split the string; \"#RRGGBB\" into RGB components\n * - convert the HEX value into RGB values\n */\nfunction html2rgb (s) {\n  let r = 0\n  let g = 0\n  let b = 0\n  if (s.length === 7) {\n    r = parseInt('0x' + s.slice(1, 3)) / 255\n    g = parseInt('0x' + s.slice(3, 5)) / 255\n    b = parseInt('0x' + s.slice(5, 7)) / 255\n  }\n  return [r, g, b]\n}\n\n/**\n * Converts RGB color value to HTML5 color value (string)\n * Conversion forumla:\n * - convert R, G, B into HEX strings\n * - return HTML formatted string \"#RRGGBB\"\n */\nfunction rgb2html (r, g, b) {\n  if (r.length) {\n    r = r[0]\n    g = r[1]\n    b = r[2]\n  }\n  let s = '#' +\n  Number(0x1000000 + r * 255 * 0x10000 + g * 255 * 0x100 + b * 255).toString(16).substring(1, 7)\n  return s\n}\n\nmodule.exports = {\n  css2rgb,\n  color,\n  rgb2hsl,\n  hsl2rgb,\n  rgb2hsv,\n  hsv2rgb,\n  html2rgb,\n  rgb2html\n}\n\n},{}],26:[function(require,module,exports){\nfunction echo () {\n  console.warn('echo() will be deprecated in the near future: please use console.log/warn/error instead')\n  var s = '', a = arguments\n  for (var i = 0; i < a.length; i++) {\n    if (i) s += ', '\n    s += a[i]\n  }\n  // var t = (new Date()-global.time)/1000\n  // console.log(t,s)\n  console.log(s)\n}\n\nmodule.exports = {\n  echo\n}\n\n},{}],27:[function(require,module,exports){\nconst CSG = require('../core/CSG')\nconst {cube} = require('./primitives3d')\n\n// For debugging\n// Creates a new solid with a tiny cube at every vertex of the source solid\n// this is seperated from the CSG class itself because of the dependency on cube\nconst toPointCloud = function (csg, cuberadius) {\n  csg = csg.reTesselated()\n\n  let result = new CSG()\n\n    // make a list of all unique vertices\n    // For each vertex we also collect the list of normals of the planes touching the vertices\n  let vertexmap = {}\n  csg.polygons.map(function (polygon) {\n    polygon.vertices.map(function (vertex) {\n      vertexmap[vertex.getTag()] = vertex.pos\n    })\n  })\n\n  for (let vertextag in vertexmap) {\n    let pos = vertexmap[vertextag]\n    let _cube = cube({\n      center: pos,\n      radius: cuberadius\n    })\n    result = result.unionSub(_cube, false, false)\n  }\n  result = result.reTesselated()\n  return result\n}\n\nmodule.exports = {toPointCloud}\n\n},{\"../core/CSG\":47,\"./primitives3d\":42}],28:[function(require,module,exports){\nconst Vertex3 = require('../core/math/Vertex3')\nconst Vector3 = require('../core/math/Vector3')\nconst Polygon3 = require('../core/math/Polygon3')\n\n// FIXME: this is to have more readable/less extremely verbose code below\nconst vertexFromVectorArray = array => {\n  return new Vertex3(new Vector3(array))\n}\n\nconst polygonFromPoints = points => {\n  // EEK talk about wrapping wrappers !\n  const vertices = points.map(point => new Vertex3(new Vector3(point)))\n  return new Polygon3(vertices)\n}\n\n// Simplified, array vector rightMultiply1x3Vector\nconst rightMultiply1x3VectorToArray = (matrix, vector) => {\n  const [v0, v1, v2] = vector\n  const v3 = 1\n  let x = v0 * matrix.elements[0] + v1 * matrix.elements[1] + v2 * matrix.elements[2] + v3 * matrix.elements[3]\n  let y = v0 * matrix.elements[4] + v1 * matrix.elements[5] + v2 * matrix.elements[6] + v3 * matrix.elements[7]\n  let z = v0 * matrix.elements[8] + v1 * matrix.elements[9] + v2 * matrix.elements[10] + v3 * matrix.elements[11]\n  let w = v0 * matrix.elements[12] + v1 * matrix.elements[13] + v2 * matrix.elements[14] + v3 * matrix.elements[15]\n\n  // scale such that fourth element becomes 1:\n  if (w !== 1) {\n    const invw = 1.0 / w\n    x *= invw\n    y *= invw\n    z *= invw\n  }\n  return [x, y, z]\n}\n\nfunction clamp (value, min, max) {\n  return Math.min(Math.max(value, min), max)\n}\n\nconst cagToPointsArray = input => {\n  let points\n  if ('sides' in input) { // this is a cag\n    points = []\n    input.sides.forEach(side => {\n      points.push([side.vertex0.pos.x, side.vertex0.pos.y])\n      points.push([side.vertex1.pos.x, side.vertex1.pos.y])\n    })\n    // cag.sides.map(side => [side.vertex0.pos.x, side.vertex0.pos.y])\n    //, side.vertex1.pos.x, side.vertex1.pos.y])\n    // due to the logic of CAG.fromPoints()\n    // move the first point to the last\n    /* if (points.length > 0) {\n      points.push(points.shift())\n    } */\n  } else if ('points' in input) {\n    points = input.points.map(p => ([p.x, p.y]))\n  }\n\n  return points\n}\n\nconst degToRad = deg => (Math.PI / 180) * deg\n\nmodule.exports = {cagToPointsArray, clamp, rightMultiply1x3VectorToArray, polygonFromPoints}\n\n},{\"../core/math/Polygon3\":62,\"../core/math/Vector3\":65,\"../core/math/Vertex3\":67}],29:[function(require,module,exports){\n\nconst primitives3d = require('./primitives3d-api')\nconst primitives2d = require('./primitives2d-api')\nconst booleanOps = require('./ops-booleans')\nconst transformations = require('./ops-transformations')\nconst extrusions = require('./ops-extrusions')\nconst color = require('./color')\nconst maths = require('./maths')\nconst text = require('./text')\nconst { echo } = require('./debug')\n\n// these are 'external' to this api and we basically just re-export for old api compatibility\n// ...needs to be reviewed\nconst { CAG, CSG } = require('../../csg')\nconst { log } = require('./log') // FIXME: this is a duplicate of the one in openjscad itself,*/\n\n// mostly likely needs to be removed since it is in the OpenJsCad namespace anyway, leaving here\n// for now\n\nconst exportedApi = {\n  csg: {CAG, CSG},\n  primitives2d,\n  primitives3d,\n  booleanOps,\n  transformations,\n  extrusions,\n  color,\n  maths,\n  text,\n  OpenJsCad: {OpenJsCad: {log}},\n  debug: {echo}\n}\n\nmodule.exports = exportedApi\n\n},{\"../../csg\":22,\"./color\":25,\"./debug\":26,\"./log\":30,\"./maths\":31,\"./ops-booleans\":32,\"./ops-extrusions\":36,\"./ops-transformations\":37,\"./primitives2d-api\":39,\"./primitives3d-api\":41,\"./text\":44}],30:[function(require,module,exports){\nfunction log (txt) {\n  console.warn('log() will be deprecated in the near future: please use console.log/warn/error instead')\n  var timeInMs = Date.now()\n  var prevtime// OpenJsCad.log.prevLogTime\n  if (!prevtime) prevtime = timeInMs\n  var deltatime = timeInMs - prevtime\n  log.prevLogTime = timeInMs\n  var timefmt = (deltatime * 0.001).toFixed(3)\n  txt = '[' + timefmt + '] ' + txt\n  if ((typeof (console) === 'object') && (typeof (console.log) === 'function')) {\n    console.log(txt)\n  } else if ((typeof (self) === 'object') && (typeof (self.postMessage) === 'function')) {\n    self.postMessage({cmd: 'log', txt: txt})\n  } else throw new Error('Cannot log')\n}\n\n// See Processor.setStatus()\n// Note: leave for compatibility\nfunction status (s) {\n  log(s)\n}\n\nmodule.exports = {\n  log,\n  status\n}\n\n},{}],31:[function(require,module,exports){\n// -- Math functions (360 deg based vs 2pi)\nfunction sin (a) {\n  return Math.sin(a / 360 * Math.PI * 2)\n}\nfunction cos (a) {\n  return Math.cos(a / 360 * Math.PI * 2)\n}\nfunction asin (a) {\n  return Math.asin(a) / (Math.PI * 2) * 360\n}\nfunction acos (a) {\n  return Math.acos(a) / (Math.PI * 2) * 360\n}\nfunction tan (a) {\n  return Math.tan(a / 360 * Math.PI * 2)\n}\nfunction atan (a) {\n  return Math.atan(a) / (Math.PI * 2) * 360\n}\nfunction atan2 (a, b) {\n  return Math.atan2(a, b) / (Math.PI * 2) * 360\n}\nfunction ceil (a) {\n  return Math.ceil(a)\n}\nfunction floor (a) {\n  return Math.floor(a)\n}\nfunction abs (a) {\n  return Math.abs(a)\n}\nfunction min (a, b) {\n  return a < b ? a : b\n}\nfunction max (a, b) {\n  return a > b ? a : b\n}\nfunction rands (min, max, vn, seed) {\n  // -- seed is ignored for now, FIX IT (requires reimplementation of random())\n  //    see http://stackoverflow.com/questions/424292/how-to-create-my-own-javascript-random-number-generator-that-i-can-also-set-the\n  var v = new Array(vn)\n  for (var i = 0; i < vn; i++) {\n    v[i] = Math.random() * (max - min) + min\n  }\n}\nfunction log (a) {\n  return Math.log(a)\n}\nfunction lookup (ix, v) {\n  var r = 0\n  for (var i = 0; i < v.length; i++) {\n    var a0 = v[i]\n    if (a0[0] >= ix) {\n      i--\n      a0 = v[i]\n      var a1 = v[i + 1]\n      var m = 0\n      if (a0[0] !== a1[0]) {\n        m = abs((ix - a0[0]) / (a1[0] - a0[0]))\n      }\n      // echo(\">>\",i,ix,a0[0],a1[0],\";\",m,a0[1],a1[1])\n      if (m > 0) {\n        r = a0[1] * (1 - m) + a1[1] * m\n      } else {\n        r = a0[1]\n      }\n      return r\n    }\n  }\n  return r\n}\n\nfunction pow (a, b) {\n  return Math.pow(a, b)\n}\n\nfunction sign (a) {\n  return a < 0 ? -1 : (a > 1 ? 1 : 0)\n}\n\nfunction sqrt (a) {\n  return Math.sqrt(a)\n}\n\nfunction round (a) {\n  return floor(a + 0.5)\n}\n\nmodule.exports = {\n  sin,\n  cos,\n  asin,\n  acos,\n  tan,\n  atan,\n  atan2,\n  ceil,\n  floor,\n  abs,\n  min,\n  max,\n  rands,\n  log,\n  lookup,\n  pow,\n  sign,\n  sqrt,\n  round\n}\n\n},{}],32:[function(require,module,exports){\nconst {isCAG} = require('../core/utils')\n// boolean operations\n\n// FIXME should this be lazy ? in which case, how do we deal with 2D/3D combined\n// TODO we should have an option to set behaviour as first parameter\n/** union/ combine the given shapes\n * @param {Object(s)|Array} objects - objects to combine : can be given\n * - one by one: union(a,b,c) or\n * - as an array: union([a,b,c])\n * @returns {CSG} new CSG object, the union of all input shapes\n *\n * @example\n * let unionOfSpherAndCube = union(sphere(), cube())\n */\nfunction union () {\n  let options = {}\n  const defaults = {\n    extrude2d: false\n  }\n  let o\n  let i = 0\n  let a = arguments\n  if (a[0].length) a = a[0]\n  if ('extrude2d' in a[0]) { // first parameter is options\n    options = Object.assign({}, defaults, a[0])\n    o = a[i++]\n  }\n\n  o = a[i++]\n\n  // TODO: add option to be able to set this?\n  if ((typeof (a[i]) === 'object') && isCAG(a[i]) && options.extrude2d) {\n    o = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid, note: do not a[i] = a[i].extrude()\n  }\n  for (; i < a.length; i++) {\n    let obj = a[i]\n\n    if ((typeof (a[i]) === 'object') && isCAG(a[i]) && options.extrude2d) {\n      obj = a[i].extrude({offset: [0, 0, 0.1]}) // -- convert a 2D shape to a thin solid:\n    }\n    o = o.union(obj)\n  }\n  return o\n}\n\n/** difference/ subtraction of the given shapes ie:\n * cut out C From B From A ie : a - b - c etc\n * @param {Object(s)|Array} objects - objects to subtract\n * can be given\n * - one by one: difference(a,b,c) or\n * - as an array: difference([a,b,c])\n * @returns {CSG} new CSG object, the difference of all input shapes\n *\n * @example\n * let differenceOfSpherAndCube = difference(sphere(), cube())\n */\nfunction difference () {\n  let object\n  let i = 0\n  let a = arguments\n  if (a[0].length) a = a[0]\n  for (object = a[i++]; i < a.length; i++) {\n    if ( isCAG(a[i])) {\n      object = object.subtract(a[i])\n    } else {\n      object = object.subtract(a[i].setColor(1, 1, 0)) // -- color the cuts\n    }\n  }\n  return object\n}\n\n/** intersection of the given shapes: ie keep only the common parts between the given shapes\n * @param {Object(s)|Array} objects - objects to intersect\n * can be given\n * - one by one: intersection(a,b,c) or\n * - as an array: intersection([a,b,c])\n * @returns {CSG} new CSG object, the intersection of all input shapes\n *\n * @example\n * let intersectionOfSpherAndCube = intersection(sphere(), cube())\n */\nfunction intersection () {\n  let object\n  let i = 0\n  let a = arguments\n  if (a[0].length) a = a[0]\n  for (object = a[i++]; i < a.length; i++) {\n    if (isCAG(a[i])) {\n      object = object.intersect(a[i])\n    } else {\n      object = object.intersect(a[i].setColor(1, 1, 0)) // -- color the cuts\n    }\n  }\n  return object\n}\n\nmodule.exports = {\n  union,\n  difference,\n  intersection\n}\n\n},{\"../core/utils\":72}],33:[function(require,module,exports){\nconst Matrix4x4 = require('../core/math/Matrix4.js')\nconst Vector3D = require('../core/math/Vector3.js')\nconst {Connector} = require('../core/connectors.js')\nconst {fromPoints} = require('../core/CAGFactories')\nconst Vector2D = require('../core/math/Vector2')\n\n// Get the transformation that transforms this CSG such that it is lying on the z=0 plane,\n// as flat as possible (i.e. the least z-height).\n// So that it is in an orientation suitable for CNC milling\nconst getTransformationAndInverseTransformationToFlatLying = function (_csg) {\n  if (_csg.polygons.length === 0) {\n    let m = new Matrix4x4() // unity\n    return [m, m]\n  } else {\n          // get a list of unique planes in the CSG:\n    let csg = _csg.canonicalized()\n    let planemap = {}\n    csg.polygons.map(function (polygon) {\n      planemap[polygon.plane.getTag()] = polygon.plane\n    })\n          // try each plane in the CSG and find the plane that, when we align it flat onto z=0,\n          // gives the least height in z-direction.\n          // If two planes give the same height, pick the plane that originally had a normal closest\n          // to [0,0,-1].\n    let xvector = new Vector3D(1, 0, 0)\n    let yvector = new Vector3D(0, 1, 0)\n    let zvector = new Vector3D(0, 0, 1)\n    let z0connectorx = new Connector([0, 0, 0], [0, 0, -1], xvector)\n    let z0connectory = new Connector([0, 0, 0], [0, 0, -1], yvector)\n    let isfirst = true\n    let minheight = 0\n    let maxdotz = 0\n    let besttransformation, bestinversetransformation\n    for (let planetag in planemap) {\n      let plane = planemap[planetag]\n      let pointonplane = plane.normal.times(plane.w)\n      let transformation, inversetransformation\n              // We need a normal vecrtor for the transformation\n              // determine which is more perpendicular to the plane normal: x or y?\n              // we will align this as much as possible to the x or y axis vector\n      let xorthogonality = plane.normal.cross(xvector).length()\n      let yorthogonality = plane.normal.cross(yvector).length()\n      if (xorthogonality > yorthogonality) {\n                  // x is better:\n        let planeconnector = new Connector(pointonplane, plane.normal, xvector)\n        transformation = planeconnector.getTransformationTo(z0connectorx, false, 0)\n        inversetransformation = z0connectorx.getTransformationTo(planeconnector, false, 0)\n      } else {\n                  // y is better:\n        let planeconnector = new Connector(pointonplane, plane.normal, yvector)\n        transformation = planeconnector.getTransformationTo(z0connectory, false, 0)\n        inversetransformation = z0connectory.getTransformationTo(planeconnector, false, 0)\n      }\n      let transformedcsg = csg.transform(transformation)\n      let dotz = -plane.normal.dot(zvector)\n      let bounds = transformedcsg.getBounds()\n      let zheight = bounds[1].z - bounds[0].z\n      let isbetter = isfirst\n      if (!isbetter) {\n        if (zheight < minheight) {\n          isbetter = true\n        } else if (zheight === minheight) {\n          if (dotz > maxdotz) isbetter = true\n        }\n      }\n      if (isbetter) {\n                  // translate the transformation around the z-axis and onto the z plane:\n        let translation = new Vector3D([-0.5 * (bounds[1].x + bounds[0].x), -0.5 * (bounds[1].y + bounds[0].y), -bounds[0].z])\n        transformation = transformation.multiply(Matrix4x4.translation(translation))\n        inversetransformation = Matrix4x4.translation(translation.negated()).multiply(inversetransformation)\n        minheight = zheight\n        maxdotz = dotz\n        besttransformation = transformation\n        bestinversetransformation = inversetransformation\n      }\n      isfirst = false\n    }\n    return [besttransformation, bestinversetransformation]\n  }\n}\n\nconst getTransformationToFlatLying = function (csg) {\n  let result = csg.getTransformationAndInverseTransformationToFlatLying()\n  return result[0]\n}\n\nconst lieFlat = function (csg) {\n  let transformation = csg.getTransformationToFlatLying()\n  return csg.transform(transformation)\n}\n\n/** cag = cag.overCutInsideCorners(cutterradius);\n * Using a CNC router it's impossible to cut out a true sharp inside corner. The inside corner\n * will be rounded due to the radius of the cutter. This function compensates for this by creating\n * an extra cutout at each inner corner so that the actual cut out shape will be at least as large\n * as needed.\n * @param {Object} _cag - input cag\n * @param {Float} cutterradius - radius to cut inside corners by\n * @returns {CAG} cag with overcutInsideCorners\n */\nconst overCutInsideCorners = function (_cag, cutterradius) {\n  let cag = _cag.canonicalized()\n  // for each vertex determine the 'incoming' side and 'outgoing' side:\n  let pointmap = {} // tag => {pos: coord, from: [], to: []}\n  cag.sides.map(function (side) {\n    if (!(side.vertex0.getTag() in pointmap)) {\n      pointmap[side.vertex0.getTag()] = {\n        pos: side.vertex0.pos,\n        from: [],\n        to: []\n      }\n    }\n    pointmap[side.vertex0.getTag()].to.push(side.vertex1.pos)\n    if (!(side.vertex1.getTag() in pointmap)) {\n      pointmap[side.vertex1.getTag()] = {\n        pos: side.vertex1.pos,\n        from: [],\n        to: []\n      }\n    }\n    pointmap[side.vertex1.getTag()].from.push(side.vertex0.pos)\n  })\n          // overcut all sharp corners:\n  let cutouts = []\n  for (let pointtag in pointmap) {\n    let pointobj = pointmap[pointtag]\n    if ((pointobj.from.length === 1) && (pointobj.to.length === 1)) {\n                  // ok, 1 incoming side and 1 outgoing side:\n      let fromcoord = pointobj.from[0]\n      let pointcoord = pointobj.pos\n      let tocoord = pointobj.to[0]\n      let v1 = pointcoord.minus(fromcoord).unit()\n      let v2 = tocoord.minus(pointcoord).unit()\n      let crossproduct = v1.cross(v2)\n      let isInnerCorner = (crossproduct < 0.001)\n      if (isInnerCorner) {\n                      // yes it's a sharp corner:\n        let alpha = v2.angleRadians() - v1.angleRadians() + Math.PI\n        if (alpha < 0) {\n          alpha += 2 * Math.PI\n        } else if (alpha >= 2 * Math.PI) {\n          alpha -= 2 * Math.PI\n        }\n        let midvector = v2.minus(v1).unit()\n        let circlesegmentangle = 30 / 180 * Math.PI // resolution of the circle: segments of 30 degrees\n                      // we need to increase the radius slightly so that our imperfect circle will contain a perfect circle of cutterradius\n        let radiuscorrected = cutterradius / Math.cos(circlesegmentangle / 2)\n        let circlecenter = pointcoord.plus(midvector.times(radiuscorrected))\n                      // we don't need to create a full circle; a pie is enough. Find the angles for the pie:\n        let startangle = alpha + midvector.angleRadians()\n        let deltaangle = 2 * (Math.PI - alpha)\n        let numsteps = 2 * Math.ceil(deltaangle / circlesegmentangle / 2) // should be even\n                      // build the pie:\n        let points = [circlecenter]\n        for (let i = 0; i <= numsteps; i++) {\n          let angle = startangle + i / numsteps * deltaangle\n          let p = Vector2D.fromAngleRadians(angle).times(radiuscorrected).plus(circlecenter)\n          points.push(p)\n        }\n        cutouts.push(fromPoints(points))\n      }\n    }\n  }\n  return cag.subtract(cutouts)\n}\n\nmodule.exports = {lieFlat, getTransformationToFlatLying, getTransformationAndInverseTransformationToFlatLying, overCutInsideCorners}\n\n},{\"../core/CAGFactories\":46,\"../core/connectors.js\":53,\"../core/math/Matrix4.js\":57,\"../core/math/Vector2\":64,\"../core/math/Vector3.js\":65}],34:[function(require,module,exports){\nconst {EPS} = require('../core/constants')\nconst Plane = require('../core/math/Plane')\nconst Vector2 = require('../core/math/Vector2')\nconst Vertex3 = require('../core/math/Vertex3')\nconst Polygon3 = require('../core/math/Polygon3')\nconst OrthoNormalBasis = require('../core/math/OrthoNormalBasis')\n\n/** cuts a csg along a orthobasis\n * @param  {CSG} csg the csg object to cut\n * @param  {Orthobasis} orthobasis the orthobasis to cut along\n */\nconst sectionCut = function (csg, orthobasis) {\n  let plane1 = orthobasis.plane\n  let plane2 = orthobasis.plane.flipped()\n  plane1 = new Plane(plane1.normal, plane1.w)\n  plane2 = new Plane(plane2.normal, plane2.w + (5 * EPS))\n  let cut3d = csg.cutByPlane(plane1)\n  cut3d = cut3d.cutByPlane(plane2)\n  return cut3d.projectToOrthoNormalBasis(orthobasis)\n}\n\n/** Cut the solid by a plane. Returns the solid on the back side of the plane\n * @param  {Plane} plane\n * @returns {CSG} the solid on the back side of the plane\n */\nconst cutByPlane = function (csg, plane) {\n  if (csg.polygons.length === 0) {\n    const CSG = require('../core/CSG') // FIXME: circular dependency ! CSG => cutByPlane => CSG\n    return new CSG()\n  }\n  // Ideally we would like to do an intersection with a polygon of inifinite size\n  // but this is not supported by our implementation. As a workaround, we will create\n  // a cube, with one face on the plane, and a size larger enough so that the entire\n  // solid fits in the cube.\n  // find the max distance of any vertex to the center of the plane:\n  let planecenter = plane.normal.times(plane.w)\n  let maxdistance = 0\n  csg.polygons.map(function (polygon) {\n    polygon.vertices.map(function (vertex) {\n      let distance = vertex.pos.distanceToSquared(planecenter)\n      if (distance > maxdistance) maxdistance = distance\n    })\n  })\n  maxdistance = Math.sqrt(maxdistance)\n  maxdistance *= 1.01 // make sure it's really larger\n  // Now build a polygon on the plane, at any point farther than maxdistance from the plane center:\n  let vertices = []\n  let orthobasis = new OrthoNormalBasis(plane)\n  vertices.push(new Vertex3(orthobasis.to3D(new Vector2(maxdistance, -maxdistance))))\n  vertices.push(new Vertex3(orthobasis.to3D(new Vector2(-maxdistance, -maxdistance))))\n  vertices.push(new Vertex3(orthobasis.to3D(new Vector2(-maxdistance, maxdistance))))\n  vertices.push(new Vertex3(orthobasis.to3D(new Vector2(maxdistance, maxdistance))))\n  const polygon = new Polygon3(vertices, null, plane.flipped())\n\n  // and extrude the polygon into a cube, backwards of the plane:\n  const cube = polygon.extrude(plane.normal.times(-maxdistance))\n\n  // Now we can do the intersection:\n  let result = csg.intersect(cube)\n  result.properties = csg.properties // keep original properties\n  return result\n}\n\nmodule.exports = {sectionCut, cutByPlane}\n\n},{\"../core/CSG\":47,\"../core/constants\":54,\"../core/math/OrthoNormalBasis\":58,\"../core/math/Plane\":60,\"../core/math/Polygon3\":62,\"../core/math/Vector2\":64,\"../core/math/Vertex3\":67}],35:[function(require,module,exports){\n\nconst {EPS, angleEPS} = require('../core/constants')\nconst Vertex = require('../core/math/Vertex3')\nconst Vector2D = require('../core/math/Vector2')\nconst Polygon = require('../core/math/Polygon3')\nconst {fnNumberSort, isCSG} = require('../core/utils')\nconst {fromPoints, fromPointsNoCheck} = require('../core/CAGFactories')\n\nconst expand = function (shape, radius, resolution) {\n  let result\n  if (isCSG(shape)) {\n    result = shape.union(expandedShellOfCCSG(shape, radius, resolution))\n    result = result.reTesselated()\n    result.properties = shape.properties // keep original properties\n  } else {\n    result = shape.union(expandedShellOfCAG(shape, radius, resolution))\n  }\n  return result\n}\n\nconst contract = function (shape, radius, resolution) {\n  let result\n  if (isCSG(shape)) {\n    result = shape.subtract(expandedShellOfCCSG(shape, radius, resolution))\n    result = result.reTesselated()\n    result.properties = shape.properties // keep original properties\n  } else {\n    result = shape.subtract(expandedShellOfCAG(shape, radius, resolution))\n  }\n  return result\n}\n\nconst expandedShellOfCAG = function (_cag, radius, resolution) {\n  const CAG = require('../core/CAG') // FIXME, circular dependency !!\n  resolution = resolution || 8\n  if (resolution < 4) resolution = 4\n  let cags = []\n  let pointmap = {}\n  let cag = _cag.canonicalized()\n  cag.sides.map(function (side) {\n    let d = side.vertex1.pos.minus(side.vertex0.pos)\n    let dl = d.length()\n    if (dl > EPS) {\n      d = d.times(1.0 / dl)\n      let normal = d.normal().times(radius)\n      let shellpoints = [\n        side.vertex1.pos.plus(normal),\n        side.vertex1.pos.minus(normal),\n        side.vertex0.pos.minus(normal),\n        side.vertex0.pos.plus(normal)\n      ]\n      //      let newcag = fromPointsNoCheck(shellpoints);\n      let newcag = fromPoints(shellpoints)\n      cags.push(newcag)\n      for (let step = 0; step < 2; step++) {\n        let p1 = (step === 0) ? side.vertex0.pos : side.vertex1.pos\n        let p2 = (step === 0) ? side.vertex1.pos : side.vertex0.pos\n        let tag = p1.x + ' ' + p1.y\n        if (!(tag in pointmap)) {\n          pointmap[tag] = []\n        }\n        pointmap[tag].push({\n          'p1': p1,\n          'p2': p2\n        })\n      }\n    }\n  })\n  for (let tag in pointmap) {\n    let m = pointmap[tag]\n    let angle1, angle2\n    let pcenter = m[0].p1\n    if (m.length === 2) {\n      let end1 = m[0].p2\n      let end2 = m[1].p2\n      angle1 = end1.minus(pcenter).angleDegrees()\n      angle2 = end2.minus(pcenter).angleDegrees()\n      if (angle2 < angle1) angle2 += 360\n      if (angle2 >= (angle1 + 360)) angle2 -= 360\n      if (angle2 < angle1 + 180) {\n        let t = angle2\n        angle2 = angle1 + 360\n        angle1 = t\n      }\n      angle1 += 90\n      angle2 -= 90\n    } else {\n      angle1 = 0\n      angle2 = 360\n    }\n    let fullcircle = (angle2 > angle1 + 359.999)\n    if (fullcircle) {\n      angle1 = 0\n      angle2 = 360\n    }\n    if (angle2 > (angle1 + angleEPS)) {\n      let points = []\n      if (!fullcircle) {\n        points.push(pcenter)\n      }\n      let numsteps = Math.round(resolution * (angle2 - angle1) / 360)\n      if (numsteps < 1) numsteps = 1\n      for (let step = 0; step <= numsteps; step++) {\n        let angle = angle1 + step / numsteps * (angle2 - angle1)\n        if (step === numsteps) angle = angle2 // prevent rounding errors\n        let point = pcenter.plus(Vector2D.fromAngleDegrees(angle).times(radius))\n        if ((!fullcircle) || (step > 0)) {\n          points.push(point)\n        }\n      }\n      let newcag = fromPointsNoCheck(points)\n      cags.push(newcag)\n    }\n  }\n  let result = new CAG()\n  result = result.union(cags)\n  return result\n}\n\n/**\n * Create the expanded shell of the solid:\n * All faces are extruded to get a thickness of 2*radius\n * Cylinders are constructed around every side\n * Spheres are placed on every vertex\n * unionWithThis: if true, the resulting solid will be united with 'this' solid;\n * the result is a true expansion of the solid\n * If false, returns only the shell\n * @param  {Float} radius\n * @param  {Integer} resolution\n * @param  {Boolean} unionWithThis\n */\nconst expandedShellOfCCSG = function (_csg, radius, resolution, unionWithThis) {\n  const CSG = require('../core/CSG') // FIXME: circular dependency ! CSG => this => CSG\n  const {fromPolygons} = require('../core/CSGFactories') // FIXME: circular dependency !\n  // const {sphere} = require('./primitives3d') // FIXME: circular dependency !\n  let csg = _csg.reTesselated()\n  let result\n  if (unionWithThis) {\n    result = csg\n  } else {\n    result = new CSG()\n  }\n\n  // first extrude all polygons:\n  csg.polygons.map(function (polygon) {\n    let extrudevector = polygon.plane.normal.unit().times(2 * radius)\n    let translatedpolygon = polygon.translate(extrudevector.times(-0.5))\n    let extrudedface = translatedpolygon.extrude(extrudevector)\n    result = result.unionSub(extrudedface, false, false)\n  })\n\n    // Make a list of all unique vertex pairs (i.e. all sides of the solid)\n    // For each vertex pair we collect the following:\n    //   v1: first coordinate\n    //   v2: second coordinate\n    //   planenormals: array of normal vectors of all planes touching this side\n  let vertexpairs = {} // map of 'vertex pair tag' to {v1, v2, planenormals}\n  csg.polygons.map(function (polygon) {\n    let numvertices = polygon.vertices.length\n    let prevvertex = polygon.vertices[numvertices - 1]\n    let prevvertextag = prevvertex.getTag()\n    for (let i = 0; i < numvertices; i++) {\n      let vertex = polygon.vertices[i]\n      let vertextag = vertex.getTag()\n      let vertextagpair\n      if (vertextag < prevvertextag) {\n        vertextagpair = vertextag + '-' + prevvertextag\n      } else {\n        vertextagpair = prevvertextag + '-' + vertextag\n      }\n      let obj\n      if (vertextagpair in vertexpairs) {\n        obj = vertexpairs[vertextagpair]\n      } else {\n        obj = {\n          v1: prevvertex,\n          v2: vertex,\n          planenormals: []\n        }\n        vertexpairs[vertextagpair] = obj\n      }\n      obj.planenormals.push(polygon.plane.normal)\n\n      prevvertextag = vertextag\n      prevvertex = vertex\n    }\n  })\n\n  // now construct a cylinder on every side\n  // The cylinder is always an approximation of a true cylinder: it will have <resolution> polygons\n  // around the sides. We will make sure though that the cylinder will have an edge at every\n  // face that touches this side. This ensures that we will get a smooth fill even\n  // if two edges are at, say, 10 degrees and the resolution is low.\n  // Note: the result is not retesselated yet but it really should be!\n  for (let vertextagpair in vertexpairs) {\n    let vertexpair = vertexpairs[vertextagpair]\n    let startpoint = vertexpair.v1.pos\n    let endpoint = vertexpair.v2.pos\n                // our x,y and z vectors:\n    let zbase = endpoint.minus(startpoint).unit()\n    let xbase = vertexpair.planenormals[0].unit()\n    let ybase = xbase.cross(zbase)\n\n      // make a list of angles that the cylinder should traverse:\n    let angles = []\n\n    // first of all equally spaced around the cylinder:\n    for (let i = 0; i < resolution; i++) {\n      angles.push(i * Math.PI * 2 / resolution)\n    }\n\n    // and also at every normal of all touching planes:\n    for (let i = 0, iMax = vertexpair.planenormals.length; i < iMax; i++) {\n      let planenormal = vertexpair.planenormals[i]\n      let si = ybase.dot(planenormal)\n      let co = xbase.dot(planenormal)\n      let angle = Math.atan2(si, co)\n\n      if (angle < 0) angle += Math.PI * 2\n      angles.push(angle)\n      angle = Math.atan2(-si, -co)\n      if (angle < 0) angle += Math.PI * 2\n      angles.push(angle)\n    }\n\n    // this will result in some duplicate angles but we will get rid of those later.\n    // Sort:\n    angles = angles.sort(fnNumberSort)\n\n    // Now construct the cylinder by traversing all angles:\n    let numangles = angles.length\n    let prevp1\n    let prevp2\n    let startfacevertices = []\n    let endfacevertices = []\n    let polygons = []\n    for (let i = -1; i < numangles; i++) {\n      let angle = angles[(i < 0) ? (i + numangles) : i]\n      let si = Math.sin(angle)\n      let co = Math.cos(angle)\n      let p = xbase.times(co * radius).plus(ybase.times(si * radius))\n      let p1 = startpoint.plus(p)\n      let p2 = endpoint.plus(p)\n      let skip = false\n      if (i >= 0) {\n        if (p1.distanceTo(prevp1) < EPS) {\n          skip = true\n        }\n      }\n      if (!skip) {\n        if (i >= 0) {\n          startfacevertices.push(new Vertex(p1))\n          endfacevertices.push(new Vertex(p2))\n          let polygonvertices = [\n            new Vertex(prevp2),\n            new Vertex(p2),\n            new Vertex(p1),\n            new Vertex(prevp1)\n          ]\n          let polygon = new Polygon(polygonvertices)\n          polygons.push(polygon)\n        }\n        prevp1 = p1\n        prevp2 = p2\n      }\n    }\n    endfacevertices.reverse()\n    polygons.push(new Polygon(startfacevertices))\n    polygons.push(new Polygon(endfacevertices))\n    let cylinder = fromPolygons(polygons)\n    result = result.unionSub(cylinder, false, false)\n  }\n\n        // make a list of all unique vertices\n        // For each vertex we also collect the list of normals of the planes touching the vertices\n  let vertexmap = {}\n  csg.polygons.map(function (polygon) {\n    polygon.vertices.map(function (vertex) {\n      let vertextag = vertex.getTag()\n      let obj\n      if (vertextag in vertexmap) {\n        obj = vertexmap[vertextag]\n      } else {\n        obj = {\n          pos: vertex.pos,\n          normals: []\n        }\n        vertexmap[vertextag] = obj\n      }\n      obj.normals.push(polygon.plane.normal)\n    })\n  })\n\n        // and build spheres at each vertex\n        // We will try to set the x and z axis to the normals of 2 planes\n        // This will ensure that our sphere tesselation somewhat matches 2 planes\n  for (let vertextag in vertexmap) {\n    let vertexobj = vertexmap[vertextag]\n            // use the first normal to be the x axis of our sphere:\n    let xaxis = vertexobj.normals[0].unit()\n            // and find a suitable z axis. We will use the normal which is most perpendicular to the x axis:\n    let bestzaxis = null\n    let bestzaxisorthogonality = 0\n    for (let i = 1; i < vertexobj.normals.length; i++) {\n      let normal = vertexobj.normals[i].unit()\n      let cross = xaxis.cross(normal)\n      let crosslength = cross.length()\n      if (crosslength > 0.05) {\n        if (crosslength > bestzaxisorthogonality) {\n          bestzaxisorthogonality = crosslength\n          bestzaxis = normal\n        }\n      }\n    }\n    if (!bestzaxis) {\n      bestzaxis = xaxis.randomNonParallelVector()\n    }\n    let yaxis = xaxis.cross(bestzaxis).unit()\n    let zaxis = yaxis.cross(xaxis)\n    let _sphere = CSG.sphere({\n      center: vertexobj.pos,\n      radius: radius,\n      resolution: resolution,\n      axes: [xaxis, yaxis, zaxis]\n    })\n    result = result.unionSub(_sphere, false, false)\n  }\n\n  return result\n}\n\nmodule.exports = {\n  expand,\n  contract,\n  expandedShellOfCAG,\n  expandedShellOfCCSG\n}\n\n},{\"../core/CAG\":45,\"../core/CAGFactories\":46,\"../core/CSG\":47,\"../core/CSGFactories\":48,\"../core/constants\":54,\"../core/math/Polygon3\":62,\"../core/math/Vector2\":64,\"../core/math/Vertex3\":67,\"../core/utils\":72}],36:[function(require,module,exports){\nconst {EPS, defaultResolution3D} = require('../core/constants')\nconst OrthoNormalBasis = require('../core/math/OrthoNormalBasis')\nconst {parseOptionAs3DVector, parseOptionAsBool, parseOptionAsFloat, parseOptionAsInt} = require('./optionParsers')\nconst Vector3D = require('../core/math/Vector3')\nconst Matrix4 = require('../core/math/Matrix4')\nconst Path2D = require('../core/math/Path2')\nconst {Connector} = require('../core/connectors')\nconst {fromPolygons} = require('../core/CSGFactories')\nconst {cagToPointsArray, clamp, rightMultiply1x3VectorToArray, polygonFromPoints} = require('./helpers')\nconst {fromPoints} = require('../core/CAGFactories')\n\n/** extrude the CAG in a certain plane.\n * Giving just a plane is not enough, multiple different extrusions in the same plane would be possible\n * by rotating around the plane's origin. An additional right-hand vector should be specified as well,\n * and this is exactly a OrthoNormalBasis.\n * @param  {CAG} cag the cag to extrude\n * @param  {Orthonormalbasis} orthonormalbasis characterizes the plane in which to extrude\n * @param  {Float} depth thickness of the extruded shape. Extrusion is done upwards from the plane\n *  (unless symmetrical option is set, see below)\n * @param  {Object} [options] - options for construction\n * @param {Boolean} [options.symmetrical=true] - extrude symmetrically in two directions about the plane\n */\nconst extrudeInOrthonormalBasis = function (cag, orthonormalbasis, depth, options) {\n      // first extrude in the regular Z plane:\n  if (!(orthonormalbasis instanceof OrthoNormalBasis)) {\n    throw new Error('extrudeInPlane: the first parameter should be a OrthoNormalBasis')\n  }\n  let extruded = cag.extrude({\n    offset: [0, 0, depth]\n  })\n  if (parseOptionAsBool(options, 'symmetrical', false)) {\n    extruded = extruded.translate([0, 0, -depth / 2])\n  }\n  let matrix = orthonormalbasis.getInverseProjectionMatrix()\n  extruded = extruded.transform(matrix)\n  return extruded\n}\n\n/** Extrude in a standard cartesian plane, specified by two axis identifiers. Each identifier can be\n * one of [\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"]\n * The 2d x axis will map to the first given 3D axis, the 2d y axis will map to the second.\n * See OrthoNormalBasis.GetCartesian for details.\n * @param  {CAG} cag the cag to extrude\n * @param  {String} axis1 the first axis\n * @param  {String} axis2 the second axis\n * @param  {Float} depth thickness of the extruded shape. Extrusion is done upwards from the plane\n * @param  {Object} [options] - options for construction\n * @param {Boolean} [options.symmetrical=true] - extrude symmetrically in two directions about the plane\n */\nconst extrudeInPlane = function (cag, axis1, axis2, depth, options) {\n  return extrudeInOrthonormalBasis(cag, OrthoNormalBasis.GetCartesian(axis1, axis2), depth, options)\n}\n\n/** linear extrusion of 2D shape, with optional twist\n * @param  {CAG} cag the cag to extrude\n * @param  {Object} [options] - options for construction\n * @param {Array} [options.offset=[0,0,1]] - The 2d shape is placed in in z=0 plane and extruded into direction <offset>\n * (a 3D vector as a 3 component array)\n * @param {Boolean} [options.twiststeps=defaultResolution3D] - twiststeps determines the resolution of the twist (should be >= 1)\n * @param {Boolean} [options.twistangle=0] - twistangle The final face is rotated <twistangle> degrees. Rotation is done around the origin of the 2d shape (i.e. x=0, y=0)\n * @returns {CSG} the extrude shape, as a CSG object\n * @example extruded=cag.extrude({offset: [0,0,10], twistangle: 360, twiststeps: 100});\n*/\nconst extrude = function (cag, options) {\n  const CSG = require('../core/CSG') // FIXME: circular dependencies CAG=>CSG=>CAG\n  if (cag.sides.length === 0) {\n    // empty! : FIXME: should this throw ?\n    return new CSG()\n  }\n  let offsetVector = parseOptionAs3DVector(options, 'offset', [0, 0, 1])\n  let twistangle = parseOptionAsFloat(options, 'twistangle', 0)\n  let twiststeps = parseOptionAsInt(options, 'twiststeps', defaultResolution3D)\n  if (offsetVector.z === 0) {\n    throw new Error('offset cannot be orthogonal to Z axis')\n  }\n  if (twistangle === 0 || twiststeps < 1) {\n    twiststeps = 1\n  }\n  let normalVector = Vector3D.Create(0, 1, 0)\n\n  let polygons = []\n  // bottom and top\n  polygons = polygons.concat(cag._toPlanePolygons({\n    translation: [0, 0, 0],\n    normalVector: normalVector,\n    flipped: !(offsetVector.z < 0)}\n  ))\n  polygons = polygons.concat(cag._toPlanePolygons({\n    translation: offsetVector,\n    normalVector: normalVector.rotateZ(twistangle),\n    flipped: offsetVector.z < 0}))\n  // walls\n  for (let i = 0; i < twiststeps; i++) {\n    let c1 = new Connector(offsetVector.times(i / twiststeps), [0, 0, offsetVector.z],\n              normalVector.rotateZ(i * twistangle / twiststeps))\n    let c2 = new Connector(offsetVector.times((i + 1) / twiststeps), [0, 0, offsetVector.z],\n              normalVector.rotateZ((i + 1) * twistangle / twiststeps))\n    polygons = polygons.concat(cag._toWallPolygons({toConnector1: c1, toConnector2: c2}))\n  }\n\n  return fromPolygons(polygons)\n}\n\n// THIS IS AN OLD untested !!! version of rotate extrude\n/** Extrude to into a 3D solid by rotating the origin around the Y axis.\n * (and turning everything into XY plane)\n * @param {Object} options - options for construction\n * @param {Number} [options.angle=360] - angle of rotation\n * @param {Number} [options.resolution=defaultResolution3D] - number of polygons per 360 degree revolution\n * @returns {CSG} new 3D solid\n */\nconst rotateExtrude = function (cag, options) { // FIXME options should be optional\n  let alpha = parseOptionAsFloat(options, 'angle', 360)\n  let resolution = parseOptionAsInt(options, 'resolution', defaultResolution3D)\n\n  alpha = alpha > 360 ? alpha % 360 : alpha\n  let origin = [0, 0, 0]\n  let axisV = Vector3D.Create(0, 1, 0)\n  let normalV = [0, 0, 1]\n  let polygons = []\n  // planes only needed if alpha > 0\n  let connS = new Connector(origin, axisV, normalV)\n  if (alpha > 0 && alpha < 360) {\n          // we need to rotate negative to satisfy wall function condition of\n          // building in the direction of axis vector\n    let connE = new Connector(origin, axisV.rotateZ(-alpha), normalV)\n    polygons = polygons.concat(\n              cag._toPlanePolygons({toConnector: connS, flipped: true}))\n    polygons = polygons.concat(\n              cag._toPlanePolygons({toConnector: connE}))\n  }\n  let connT1 = connS\n  let connT2\n  let step = alpha / resolution\n  for (let a = step; a <= alpha + EPS; a += step) { // FIXME Should this be angelEPS?\n    connT2 = new Connector(origin, axisV.rotateZ(-a), normalV)\n    polygons = polygons.concat(cag._toWallPolygons(\n              {toConnector1: connT1, toConnector2: connT2}))\n    connT1 = connT2\n  }\n  return fromPolygons(polygons).reTesselated()\n}\n\n// FIXME: right now linear & rotate extrude take params first, while rectangular_extrude\n// takes params second ! confusing and incoherent ! needs to be changed (BREAKING CHANGE !)\n\n/** linear extrusion of the input 2d shape\n * @param {Object} [options] - options for construction\n * @param {Float} [options.height=1] - height of the extruded shape\n * @param {Integer} [options.slices=10] - number of intermediary steps/slices\n * @param {Integer} [options.twist=0] - angle (in degrees to twist the extusion by)\n * @param {Boolean} [options.center=false] - whether to center extrusion or not\n * @param {CAG} baseShape input 2d shape\n * @returns {CSG} new extruded shape\n *\n * @example\n * let revolved = linear_extrude({height: 10}, square())\n */\nfunction linear_extrude (params, baseShape) {\n  const defaults = {\n    height: 1,\n    slices: 10,\n    twist: 0,\n    center: false\n  }\n  /* convexity = 10, */\n  const {height, twist, slices, center} = Object.assign({}, defaults, params)\n\n  // if(params.convexity) convexity = params.convexity      // abandoned\n  let output = baseShape.extrude({offset: [0, 0, height], twistangle: twist, twiststeps: slices})\n  if (center === true) {\n    const b = output.getBounds() // b[0] = min, b[1] = max\n    const offset = (b[1].plus(b[0])).times(-0.5)\n    output = output.translate(offset)\n  }\n  return output\n}\n\n/** rotate extrusion / revolve of the given 2d shape\n * @param {Object} [options] - options for construction\n * @param {Integer} [options.fn=1] - resolution/number of segments of the extrusion\n * @param {Float} [options.startAngle=1] - start angle of the extrusion, in degrees\n * @param {Float} [options.angle=1] - angle of the extrusion, in degrees\n * @param {Float} [options.overflow='cap'] - what to do with points outside of bounds (+ / - x) :\n * defaults to capping those points to 0 (only supported behaviour for now)\n * @param {CAG} baseShape input 2d shape\n * @returns {CSG} new extruded shape\n *\n * @example\n * let revolved = rotate_extrude({fn: 10}, square())\n */\nfunction rotate_extrude (params, baseShape) {\n  // note, we should perhaps alias this to revolve() as well\n  const defaults = {\n    fn: 32,\n    startAngle: 0,\n    angle: 360,\n    overflow: 'cap'\n  }\n  params = Object.assign({}, defaults, params)\n  let {fn, startAngle, angle, overflow} = params\n  if (overflow !== 'cap') {\n    throw new Error('only capping of overflowing points is supported !')\n  }\n\n  if (arguments.length < 2) { // FIXME: what the hell ??? just put params second !\n    baseShape = params\n  }\n  // are we dealing with a positive or negative angle (for normals flipping)\n  const flipped = angle > 0\n  // limit actual angle between 0 & 360, regardless of direction\n  const totalAngle = flipped ? clamp((startAngle + angle), 0, 360) : clamp((startAngle + angle), -360, 0)\n  // adapt to the totalAngle : 1 extra segment per 45 degs if not 360 deg extrusion\n  // needs to be at least one and higher then the input resolution\n  const segments = Math.max(\n    Math.floor(Math.abs(totalAngle) / 45),\n    1,\n    fn\n  )\n  // maximum distance per axis between two points before considering them to be the same\n  const overlapTolerance = 0.00001\n  // convert baseshape to just an array of points, easier to deal with\n  let shapePoints = cagToPointsArray(baseShape)\n\n  // determine if the rotate_extrude can be computed in the first place\n  // ie all the points have to be either x > 0 or x < 0\n\n  // generic solution to always have a valid solid, even if points go beyond x/ -x\n  // 1. split points up between all those on the 'left' side of the axis (x<0) & those on the 'righ' (x>0)\n  // 2. for each set of points do the extrusion operation IN OPOSITE DIRECTIONS\n  // 3. union the two resulting solids\n\n  // 1. alt : OR : just cap of points at the axis ?\n\n  // console.log('shapePoints BEFORE', shapePoints, baseShape.sides)\n\n  const pointsWithNegativeX = shapePoints.filter(x => x[0] < 0)\n  const pointsWithPositiveX = shapePoints.filter(x => x[0] >= 0)\n  const arePointsWithNegAndPosX = pointsWithNegativeX.length > 0 && pointsWithPositiveX.length > 0\n\n  if (arePointsWithNegAndPosX && overflow === 'cap') {\n    if (pointsWithNegativeX.length > pointsWithPositiveX.length) {\n      shapePoints = shapePoints.map(function (point) {\n        return [Math.min(point[0], 0), point[1]]\n      })\n    } else if (pointsWithPositiveX.length >= pointsWithNegativeX.length) {\n      shapePoints = shapePoints.map(function (point) {\n        return [Math.max(point[0], 0), point[1]]\n      })\n    }\n  }\n\n  // console.log('negXs', pointsWithNegativeX, 'pointsWithPositiveX', pointsWithPositiveX, 'arePointsWithNegAndPosX', arePointsWithNegAndPosX)\n //  console.log('shapePoints AFTER', shapePoints, baseShape.sides)\n\n  let polygons = []\n\n  // for each of the intermediary steps in the extrusion\n  for (let i = 1; i < segments + 1; i++) {\n    // for each side of the 2d shape\n    for (let j = 0; j < shapePoints.length - 1; j++) {\n      // 2 points of a side\n      const curPoint = shapePoints[j]\n      const nextPoint = shapePoints[j + 1]\n\n      // compute matrix for current and next segment angle\n      let prevMatrix = Matrix4.rotationZ((i - 1) / segments * angle + startAngle)\n      let curMatrix = Matrix4.rotationZ(i / segments * angle + startAngle)\n\n      const pointA = rightMultiply1x3VectorToArray(prevMatrix, [curPoint[0], 0, curPoint[1]])\n      const pointAP = rightMultiply1x3VectorToArray(curMatrix, [curPoint[0], 0, curPoint[1]])\n      const pointB = rightMultiply1x3VectorToArray(prevMatrix, [nextPoint[0], 0, nextPoint[1]])\n      const pointBP = rightMultiply1x3VectorToArray(curMatrix, [nextPoint[0], 0, nextPoint[1]])\n\n      // console.log(`point ${j} edge connecting ${j} to ${j + 1}`)\n      let overlappingPoints = false\n      if (Math.abs(pointA[0] - pointAP[0]) < overlapTolerance && Math.abs(pointB[1] - pointBP[1]) < overlapTolerance) {\n        // console.log('identical / overlapping points (from current angle and next one), what now ?')\n        overlappingPoints = true\n      }\n\n      // we do not generate a single quad because:\n      // 1. it does not allow eliminating unneeded triangles in case of overlapping points\n      // 2. the current cleanup routines of csg.js create degenerate shapes from those quads\n      // let polyPoints = [pointA, pointB, pointBP, pointAP]\n      // polygons.push(polygonFromPoints(polyPoints))\n\n      if (flipped) {\n        // CW\n        polygons.push(polygonFromPoints([pointA, pointB, pointBP]))\n        if (!overlappingPoints) {\n          polygons.push(polygonFromPoints([pointBP, pointAP, pointA]))\n        }\n      } else {\n        // CCW\n        if (!overlappingPoints) {\n          polygons.push(polygonFromPoints([pointA, pointAP, pointBP]))\n        }\n        polygons.push(polygonFromPoints([pointBP, pointB, pointA]))\n      }\n    }\n    // if we do not do a full extrusion, we want caps at both ends (closed volume)\n    if (Math.abs(angle) < 360) {\n      // we need to recreate the side with capped points where applicable\n      const sideShape = fromPoints(shapePoints)\n      const endMatrix = Matrix4.rotationX(90).multiply(\n        Matrix4.rotationZ(-startAngle)\n      )\n      const endCap = sideShape._toPlanePolygons({flipped: flipped})\n        .map(x => x.transform(endMatrix))\n\n      const startMatrix = Matrix4.rotationX(90).multiply(\n        Matrix4.rotationZ(-angle - startAngle)\n      )\n      const startCap = sideShape._toPlanePolygons({flipped: !flipped})\n        .map(x => x.transform(startMatrix))\n      polygons = polygons.concat(endCap).concat(startCap)\n    }\n  }\n  return fromPolygons(polygons).reTesselated().canonicalized()\n}\n\n/** rectangular extrusion of the given array of points\n * @param {Array} basePoints array of points (nested) to extrude from\n * layed out like [ [0,0], [10,0], [5,10], [0,10] ]\n * @param {Object} [options] - options for construction\n * @param {Float} [options.h=1] - height of the extruded shape\n * @param {Float} [options.w=10] - width of the extruded shape\n * @param {Integer} [options.fn=1] - resolution/number of segments of the extrusion\n * @param {Boolean} [options.closed=false] - whether to close the input path for the extrusion or not\n * @param {Boolean} [options.round=true] - whether to round the extrusion or not\n * @returns {CSG} new extruded shape\n *\n * @example\n * let revolved = rectangular_extrude({height: 10}, square())\n */\nfunction rectangular_extrude (basePoints, params) {\n  const defaults = {\n    w: 1,\n    h: 1,\n    fn: 8,\n    closed: false,\n    round: true\n  }\n  const {w, h, fn, closed, round} = Object.assign({}, defaults, params)\n  return new Path2D(basePoints, closed).rectangularExtrude(w, h, fn, round)\n}\n\nmodule.exports = {\n  extrudeInOrthonormalBasis,\n  extrudeInPlane,\n  extrude,\n  linear_extrude,\n  rotate_extrude,\n  rotateExtrude,\n  rectangular_extrude\n}\n\n},{\"../core/CAGFactories\":46,\"../core/CSG\":47,\"../core/CSGFactories\":48,\"../core/connectors\":53,\"../core/constants\":54,\"../core/math/Matrix4\":57,\"../core/math/OrthoNormalBasis\":58,\"../core/math/Path2\":59,\"../core/math/Vector3\":65,\"./helpers\":28,\"./optionParsers\":38}],37:[function(require,module,exports){\nconst Matrix4 = require('../core/math/Matrix4')\nconst Plane = require('../core/math/Plane')\nconst Vector3 = require('../core/math/Vector3')\nconst { union } = require('./ops-booleans')\nconst { fromPoints } = require('../core/CAGFactories')\nconst { isCAG } = require('../core/utils')\n// -- 3D transformations (OpenSCAD like notion)\n\n/** translate an object in 2D/3D space\n * @param {Object} vector - 3D vector to translate the given object(s) by\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to translate\n * @returns {CSG} new CSG object , translated by the given amount\n *\n * @example\n * let movedSphere = translate([10,2,0], sphere())\n */\nfunction translate (vector, ...objects) {      // v, obj or array\n  // workaround needed to determine if we are dealing with an array of objects\n  const _objects = (objects.length >= 1 && objects[0].length) ? objects[0] : objects\n  let object = _objects[0]\n\n  if (_objects.length > 1) {\n    for (let i = 1; i < _objects.length; i++) { // FIXME/ why is union really needed ??\n      object = object.union(_objects[i])\n    }\n  }\n  return object.translate(vector)\n}\n\n/** scale an object in 2D/3D space\n * @param {Float|Array} scale - either an array or simple number to scale object(s) by\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to scale\n * @returns {CSG} new CSG object , scaled by the given amount\n *\n * @example\n * let scaledSphere = scale([0.2,15,1], sphere())\n */\nfunction scale (scale, ...objects) {         // v, obj or array\n  const _objects = (objects.length >= 1 && objects[0].length) ? objects[0] : objects\n  let object = _objects[0]\n\n  if (_objects.length > 1) {\n    for (let i = 1; i < _objects.length; i++) { // FIXME/ why is union really needed ??\n      object = object.union(_objects[i])\n    }\n  }\n  return object.scale(scale)\n}\n\n/** rotate an object in 2D/3D space\n * @param {Float|Array} rotation - either an array or simple number to rotate object(s) by\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to rotate\n * @returns {CSG} new CSG object , rotated by the given amount\n *\n * @example\n * let rotatedSphere = rotate([0.2,15,1], sphere())\n */\nfunction rotate () {\n  let o\n  let i\n  let v\n  let r = 1\n  let a = arguments\n  if (!a[0].length) {        // rotate(r,[x,y,z],o)\n    r = a[0]\n    v = a[1]\n    i = 2\n    if (a[2].length) { a = a[2]; i = 0 }\n  } else {                   // rotate([x,y,z],o)\n    v = a[0]\n    i = 1\n    if (a[1].length) { a = a[1]; i = 0 }\n  }\n  for (o = a[i++]; i < a.length; i++) {\n    o = o.union(a[i])\n  }\n  if (r !== 1) {\n    return o.rotate([0, 0, 0], v, r)\n  } else {\n    return o.rotateX(v[0]).rotateY(v[1]).rotateZ(v[2])\n  }\n}\n\n/** apply the given matrix transform to the given objects\n * @param {Array} matrix - the 4x4 matrix to apply, as a simple 1d array of 16 elements\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to transform\n * @returns {CSG} new CSG object , transformed\n *\n * @example\n * const angle = 45\n * let transformedShape = transform([\n * cos(angle), -sin(angle), 0, 10,\n * sin(angle),  cos(angle), 0, 20,\n * 0         ,           0, 1, 30,\n * 0,           0, 0,  1\n * ], sphere())\n */\nfunction transform (matrix, ...objects) { // v, obj or array\n  const _objects = (objects.length >= 1 && objects[0].length) ? objects[0] : objects\n  let object = _objects[0]\n\n  if (_objects.length > 1) {\n    for (let i = 1; i < _objects.length; i++) { // FIXME/ why is union really needed ??\n      object = object.union(_objects[i])\n    }\n  }\n\n  let transformationMatrix\n  if (!Array.isArray(matrix)) {\n    throw new Error('Matrix needs to be an array')\n  }\n  matrix.forEach(element => {\n    if (!Number.isFinite(element)) {\n      throw new Error('you can only use a flat array of valid, finite numbers (float and integers)')\n    }\n  })\n  transformationMatrix = new Matrix4(matrix)\n  return object.transform(transformationMatrix)\n}\n\n\n/**\n * Center the given object(s) about the given axes\n * @param {Array|Boolean} axes=[true,true,true]|true  - an array of boolean values that indicate the axes (X,Y,Z) to center upon. A single boolean is also allowed.\n * @param {...Object} object one or more objects to center, i.e. objects are CSG or CAG\n * @returns {CSG} new CSG object , translated by the given amount\n *\n * @example\n * let csg = center([true,false,false], sphere()) // center about the X axis\n */\nfunction center (axes, ...objects) {\n  const _objects = (objects.length >= 1 && objects[0].length) ? objects[0] : objects\n  let object = _objects[0]\n\n  if (_objects.length > 1) {\n    for (let i = 1; i < _objects.length; i++) { // FIXME/ why is union really needed ??\n      object = object.union(_objects[i])\n    }\n  }\n  if (! Array.isArray(axes)) {\n    axes = [axes,axes,axes]\n  }\n  return object.center(axes)\n}\n\n/** mirror an object in 2D/3D space\n * @param {Array} vector - the axes to mirror the object(s) by\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to mirror\n * @returns {CSG} new CSG object , mirrored\n *\n * @example\n * let rotatedSphere = mirror([0.2,15,1], sphere())\n */\nfunction mirror (vector, ...objects) {\n  const _objects = (objects.length >= 1 && objects[0].length) ? objects[0] : objects\n  let object = _objects[0]\n\n  if (_objects.length > 1) {\n    for (let i = 1; i < _objects.length; i++) { // FIXME/ why is union really needed ??\n      object = object.union(_objects[i])\n    }\n  }\n  const plane = new Plane(new Vector3(vector[0], vector[1], vector[2]).unit(), 0)\n  return object.mirrored(plane)\n}\n\n/** expand an object in 2D/3D space\n * @param {float} radius - the radius to expand by\n * @param {Object} object a CSG/CAG objects to expand\n * @returns {CSG/CAG} new CSG/CAG object , expanded\n *\n * @example\n * let expanededShape = expand([0.2,15,1], sphere())\n */\nfunction expand (radius, n, object) {\n  return object.expand(radius, n)\n}\n\n/** contract an object(s) in 2D/3D space\n * @param {float} radius - the radius to contract by\n * @param {Object} object a CSG/CAG objects to contract\n * @returns {CSG/CAG} new CSG/CAG object , contracted\n *\n * @example\n * let contractedShape = contract([0.2,15,1], sphere())\n */\nfunction contract (radius, n, object) {\n  return object.contract(radius, n)\n}\n\n/** create a minkowski sum of the given shapes\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to create a hull around\n * @returns {CSG} new CSG object , mirrored\n *\n * @example\n * let hulled = hull(rect(), circle())\n */\nfunction minkowski () {\n  console.log('minkowski() not yet implemented')\n}\n\n/** create a convex hull of the given shapes\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to create a hull around\n * @returns {CSG} new CSG object , a hull around the given shapes\n *\n * @example\n * let hulled = hull(rect(), circle())\n */\nfunction hull () {\n  let pts = []\n\n  let a = arguments\n  if (a[0].length) a = a[0]\n  let done = []\n\n  for (let i = 0; i < a.length; i++) {              // extract all points of the CAG in the argument list\n    let cag = a[i]\n    if (!isCAG(cag)) {\n      throw new Error('ERROR: hull() accepts only 2D forms / CAG')\n    }\n    for (let j = 0; j < cag.sides.length; j++) {\n      let x = cag.sides[j].vertex0.pos.x\n      let y = cag.sides[j].vertex0.pos.y\n      // avoid some coord to appear multiple times\n      if (done['' + x + ',' + y]) {\n        continue\n      }\n      pts.push({ x: x, y: y })\n      done['' + x + ',' + y]++\n         // echo(x,y);\n    }\n  }\n   // echo(pts.length+\" points in\",pts);\n\n   // from http://www.psychedelicdevelopment.com/grahamscan/\n   //    see also at https://github.com/bkiers/GrahamScan/blob/master/src/main/cg/GrahamScan.java\n  let ConvexHullPoint = function (i, a, d) {\n    this.index = i\n    this.angle = a\n    this.distance = d\n\n    this.compare = function (p) {\n      if (this.angle < p.angle) {\n        return -1\n      } else if (this.angle > p.angle) {\n        return 1\n      } else {\n        if (this.distance < p.distance) {\n          return -1\n        } else if (this.distance > p.distance) {\n          return 1\n        }\n      }\n      return 0\n    }\n  }\n\n  let ConvexHull = function () {\n    this.points = null\n    this.indices = null\n\n    this.getIndices = function () {\n      return this.indices\n    }\n\n    this.clear = function () {\n      this.indices = null\n      this.points = null\n    }\n\n    this.ccw = function (p1, p2, p3) {\n      let ccw = (this.points[p2].x - this.points[p1].x) * (this.points[p3].y - this.points[p1].y) -\n                   (this.points[p2].y - this.points[p1].y) * (this.points[p3].x - this.points[p1].x)\n      // we need this, otherwise sorting never ends, see https://github.com/Spiritdude/OpenJSCAD.org/issues/18\n      if (ccw < 1e-5) {\n        return 0\n      }\n      return ccw\n    }\n\n    this.angle = function (o, a) {\n         // return Math.atan((this.points[a].y-this.points[o].y) / (this.points[a].x - this.points[o].x));\n      return Math.atan2((this.points[a].y - this.points[o].y), (this.points[a].x - this.points[o].x))\n    }\n\n    this.distance = function (a, b) {\n      return ((this.points[b].x - this.points[a].x) * (this.points[b].x - this.points[a].x) +\n                 (this.points[b].y - this.points[a].y) * (this.points[b].y - this.points[a].y))\n    }\n\n    this.compute = function (_points) {\n      this.indices = null\n      if (_points.length < 3) {\n        return\n      }\n      this.points = _points\n\n         // Find the lowest point\n      let min = 0\n      for (let i = 1; i < this.points.length; i++) {\n        if (this.points[i].y === this.points[min].y) {\n          if (this.points[i].x < this.points[min].x) {\n            min = i\n          }\n        } else if (this.points[i].y < this.points[min].y) {\n          min = i\n        }\n      }\n\n         // Calculate angle and distance from base\n      let al = []\n      let ang = 0.0\n      let dist = 0.0\n      for (let i = 0; i < this.points.length; i++) {\n        if (i === min) {\n          continue\n        }\n        ang = this.angle(min, i)\n        if (ang < 0) {\n          ang += Math.PI\n        }\n        dist = this.distance(min, i)\n        al.push(new ConvexHullPoint(i, ang, dist))\n      }\n\n      al.sort(function (a, b) { return a.compare(b) })\n\n         // Create stack\n      let stack = new Array(this.points.length + 1)\n      let j = 2\n      for (let i = 0; i < this.points.length; i++) {\n        if (i === min) {\n          continue\n        }\n        stack[j] = al[j - 2].index\n        j++\n      }\n      stack[0] = stack[this.points.length]\n      stack[1] = min\n\n      let tmp\n      let M = 2\n      for (let i = 3; i <= this.points.length; i++) {\n        while (this.ccw(stack[M - 1], stack[M], stack[i]) <= 0) {\n          M--\n        }\n        M++\n        tmp = stack[i]\n        stack[i] = stack[M]\n        stack[M] = tmp\n      }\n\n      this.indices = new Array(M)\n      for (let i = 0; i < M; i++) {\n        this.indices[i] = stack[i + 1]\n      }\n    }\n  }\n\n  let hull = new ConvexHull()\n\n  hull.compute(pts)\n  let indices = hull.getIndices()\n\n  if (indices && indices.length > 0) {\n    let ch = []\n    for (let i = 0; i < indices.length; i++) {\n      ch.push(pts[indices[i]])\n    }\n    return fromPoints(ch)\n  }\n}\n\n/** create a chain hull of the given shapes\n * Originally \"Whosa whatsis\" suggested \"Chain Hull\" ,\n * as described at https://plus.google.com/u/0/105535247347788377245/posts/aZGXKFX1ACN\n * essentially hull A+B, B+C, C+D and then union those\n * @param {Object(s)|Array} objects either a single or multiple CSG/CAG objects to create a chain hull around\n * @returns {CSG} new CSG object ,which a chain hull of the inputs\n *\n * @example\n * let hulled = chain_hull(rect(), circle())\n */\nfunction chain_hull (params, objects) {\n  /*\n  const defaults = {\n    closed: false\n  }\n  const closed = Object.assign({}, defaults, params) */\n  let a = arguments\n  let closed = false\n  let j = 0\n\n  if (a[j].closed !== undefined) {\n    closed = a[j++].closed\n  }\n\n  if (a[j].length) { a = a[j] }\n\n  let hulls = []\n  let hullsAmount = a.length - (closed ? 0 : 1)\n  for (let i = 0; i < hullsAmount; i++) {\n    hulls.push(hull(a[i], a[(i + 1) % a.length]))\n  }\n  return union(hulls)\n}\n\nmodule.exports = {\n  translate,\n  center,\n  scale,\n  rotate,\n  transform,\n  mirror,\n  expand,\n  contract,\n  minkowski,\n  hull,\n  chain_hull\n}\n\n},{\"../core/CAGFactories\":46,\"../core/math/Matrix4\":57,\"../core/math/Plane\":60,\"../core/math/Vector3\":65,\"../core/utils\":72,\"./ops-booleans\":32}],38:[function(require,module,exports){\nconst Vector3D = require('../core/math/Vector3')\nconst Vector2D = require('../core/math/Vector2')\n\n// Parse an option from the options object\n// If the option is not present, return the default value\nconst parseOption = function (options, optionname, defaultvalue) {\n  var result = defaultvalue\n  if (options && optionname in options) {\n    result = options[optionname]\n  }\n  return result\n}\n\n  // Parse an option and force into a Vector3D. If a scalar is passed it is converted\n  // into a vector with equal x,y,z\nconst parseOptionAs3DVector = function (options, optionname, defaultvalue) {\n  var result = parseOption(options, optionname, defaultvalue)\n  result = new Vector3D(result)\n  return result\n}\n\nconst parseOptionAs3DVectorList = function (options, optionname, defaultvalue) {\n  var result = parseOption(options, optionname, defaultvalue)\n  return result.map(function (res) {\n    return new Vector3D(res)\n  })\n}\n\n  // Parse an option and force into a Vector2D. If a scalar is passed it is converted\n  // into a vector with equal x,y\nconst parseOptionAs2DVector = function (options, optionname, defaultvalue) {\n  var result = parseOption(options, optionname, defaultvalue)\n  result = new Vector2D(result)\n  return result\n}\n\nconst parseOptionAsFloat = function (options, optionname, defaultvalue) {\n  var result = parseOption(options, optionname, defaultvalue)\n  if (typeof (result) === 'string') {\n    result = Number(result)\n  }\n  if (isNaN(result) || typeof (result) !== 'number') {\n    throw new Error('Parameter ' + optionname + ' should be a number')\n  }\n  return result\n}\n\nconst parseOptionAsInt = function (options, optionname, defaultvalue) {\n  var result = parseOption(options, optionname, defaultvalue)\n  result = Number(Math.floor(result))\n  if (isNaN(result)) {\n    throw new Error('Parameter ' + optionname + ' should be a number')\n  }\n  return result\n}\n\nconst parseOptionAsBool = function (options, optionname, defaultvalue) {\n  var result = parseOption(options, optionname, defaultvalue)\n  if (typeof (result) === 'string') {\n    if (result === 'true') result = true\n    else if (result === 'false') result = false\n    else if (result === 0) result = false\n  }\n  result = !!result\n  return result\n}\n\nmodule.exports = {\n  parseOption,\n  parseOptionAsInt,\n  parseOptionAsFloat,\n  parseOptionAsBool,\n  parseOptionAs3DVector,\n  parseOptionAs2DVector,\n  parseOptionAs3DVectorList\n}\n\n},{\"../core/math/Vector2\":64,\"../core/math/Vector3\":65}],39:[function(require,module,exports){\nconst {CAG} = require('../../csg')// we have to import from top level otherwise prototypes are not complete..\nconst {fromPoints} = require('../core/CAGFactories')\n\n/** Construct a square/rectangle\n * @param {Object} [options] - options for construction\n * @param {Float} [options.size=1] - size of the square, either as array or scalar\n * @param {Boolean} [options.center=true] - wether to center the square/rectangle or not\n * @returns {CAG} new square\n *\n * @example\n * let square1 = square({\n *   size: 10\n * })\n */\nfunction square () {\n  let v = [1, 1]\n  let off\n  let a = arguments\n  let params = a[0]\n\n  if (params && Number.isFinite(params)) v = [params, params]\n  if (params && params.length) {\n    v = a[0]\n    params = a[1]\n  }\n  if (params && params.size && params.size.length) v = params.size\n\n  off = [v[0] / 2, v[1] / 2]\n  if (params && params.center === true) off = [0, 0]\n\n  return CAG.rectangle({center: off, radius: [v[0] / 2, v[1] / 2]})\n}\n\n/** Construct a circle\n * @param {Object} [options] - options for construction\n * @param {Float} [options.r=1] - radius of the circle\n * @param {Integer} [options.fn=32] - segments of circle (ie quality/ resolution)\n * @param {Boolean} [options.center=true] - wether to center the circle or not\n * @returns {CAG} new circle\n *\n * @example\n * let circle1 = circle({\n *   r: 10\n * })\n */\nfunction circle (params) {\n  const defaults = {\n    r: 1,\n    fn: 32,\n    center: false\n  }\n  let {r, fn, center} = Object.assign({}, defaults, params)\n  if (params && !params.r && !params.fn && !params.center) r = params\n  let offset = center === true ? [0, 0] : [r, r]\n  return CAG.circle({center: offset, radius: r, resolution: fn})\n}\n\n/** Construct a polygon either from arrays of paths and points,\n * or just arrays of points nested paths (multiple paths) and flat paths are supported\n * @param {Object} [options] - options for construction or either flat or nested array of points\n * @param {Array} [options.points] - points of the polygon : either flat or nested array of points\n * @param {Array} [options.paths] - paths of the polygon : either flat or nested array of points index\n * @returns {CAG} new polygon\n *\n * @example\n * let roof = [[10,11], [0,11], [5,20]]\n * let wall = [[0,0], [10,0], [10,10], [0,10]]\n *\n * let poly = polygon(roof)\n * or\n * let poly = polygon([roof, wall])\n * or\n * let poly = polygon({ points: roof })\n * or\n * let poly = polygon({ points: [roof, wall] })\n * or\n * let poly = polygon({ points: roof, path: [0, 1, 2] })\n * or\n * let poly = polygon({ points: [roof, wall], path: [[0, 1, 2], [3, 4, 5, 6]] })\n * or\n * let poly = polygon({ points: roof.concat(wall), paths: [[0, 1, 2], [3, 4, 5], [3, 6, 5]] })\n */\nfunction polygon (params) { // array of po(ints) and pa(ths)\n  let points = []\n  if (params.paths && params.paths.length && params.paths[0].length) { // pa(th): [[0,1,2],[2,3,1]] (two paths)\n    if (typeof params.points[0][0] !== 'number') { // flatten points array\n      params.points = params.points.reduce((a, b) => a.concat(b))\n    }\n    params.paths.forEach((path, i) => {\n      points.push([])\n      path.forEach(j => points[i].push(params.points[j]))\n    })\n  } else if (params.paths && params.paths.length) { // pa(th): [0,1,2,3,4] (single path)\n    params.paths.forEach(i => points.push(params.points[i]))\n  } else { // pa(th) = po(ints)\n    if (params.length) {\n      points = params\n    } else {\n      points = params.points\n    }\n  }\n  return fromPoints(points)\n}\n\n// FIXME: errr this is kinda just a special case of a polygon , why do we need it ?\n/** Construct a triangle\n * @returns {CAG} new triangle\n *\n * @example\n * let triangle = trangle({\n *   length: 10\n * })\n */\nfunction triangle () {\n  let a = arguments\n  if (a[0] && a[0].length) a = a[0]\n  return fromPoints(a)\n}\n\nmodule.exports = {\n  circle,\n  square,\n  polygon,\n  triangle\n}\n\n},{\"../../csg\":22,\"../core/CAGFactories\":46}],40:[function(require,module,exports){\nconst CAG = require('../core/CAG')\nconst {parseOptionAs2DVector, parseOptionAsFloat, parseOptionAsInt} = require('./optionParsers')\nconst {defaultResolution2D} = require('../core/constants')\nconst Vector2D = require('../core/math/Vector2')\nconst Vertex2 = require('../core/math/Vertex2')\nconst Path2D = require('../core/math/Path2')\nconst {fromCompactBinary, fromPoints, fromPath2, fromSides} = require('../core/CAGFactories')\n\n/** Construct a circle.\n * @param {Object} [options] - options for construction\n * @param {Vector2D} [options.center=[0,0]] - center of circle\n * @param {Number} [options.radius=1] - radius of circle\n * @param {Number} [options.resolution=defaultResolution2D] - number of sides per 360 rotation\n * @returns {CAG} new CAG object\n */\nconst circle = function (options) {\n  options = options || {}\n  let center = parseOptionAs2DVector(options, 'center', [0, 0])\n  let radius = parseOptionAsFloat(options, 'radius', 1)\n  let resolution = parseOptionAsInt(options, 'resolution', defaultResolution2D)\n  let points = []\n  for (let i = 0; i < resolution; i++) {\n    let radians = 2 * Math.PI * i / resolution\n    let point = Vector2D.fromAngleRadians(radians).times(radius).plus(center)\n    points.push(point)\n  }\n  return fromPoints(points)\n}\n\n/** Construct an ellispe.\n * @param {Object} [options] - options for construction\n * @param {Vector2D} [options.center=[0,0]] - center of ellipse\n * @param {Vector2D} [options.radius=[1,1]] - radius of ellipse, width and height\n * @param {Number} [options.resolution=defaultResolution2D] - number of sides per 360 rotation\n * @returns {CAG} new CAG object\n */\nconst ellipse = function (options) {\n  options = options || {}\n  let c = parseOptionAs2DVector(options, 'center', [0, 0])\n  let r = parseOptionAs2DVector(options, 'radius', [1, 1])\n  r = r.abs() // negative radii make no sense\n  let res = parseOptionAsInt(options, 'resolution', defaultResolution2D)\n\n  let e2 = new Path2D([[c.x, c.y + r.y]])\n  e2 = e2.appendArc([c.x, c.y - r.y], {\n    xradius: r.x,\n    yradius: r.y,\n    xaxisrotation: 0,\n    resolution: res,\n    clockwise: true,\n    large: false\n  })\n  e2 = e2.appendArc([c.x, c.y + r.y], {\n    xradius: r.x,\n    yradius: r.y,\n    xaxisrotation: 0,\n    resolution: res,\n    clockwise: true,\n    large: false\n  })\n  e2 = e2.close()\n  return fromPath2(e2)\n}\n\n/** Construct a rectangle.\n * @param {Object} [options] - options for construction\n * @param {Vector2D} [options.center=[0,0]] - center of rectangle\n * @param {Vector2D} [options.radius=[1,1]] - radius of rectangle, width and height\n * @param {Vector2D} [options.corner1=[0,0]] - bottom left corner of rectangle (alternate)\n * @param {Vector2D} [options.corner2=[0,0]] - upper right corner of rectangle (alternate)\n * @returns {CAG} new CAG object\n */\nconst rectangle = function (options) {\n  options = options || {}\n  let c, r\n  if (('corner1' in options) || ('corner2' in options)) {\n    if (('center' in options) || ('radius' in options)) {\n      throw new Error('rectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter')\n    }\n    let corner1 = parseOptionAs2DVector(options, 'corner1', [0, 0])\n    let corner2 = parseOptionAs2DVector(options, 'corner2', [1, 1])\n    c = corner1.plus(corner2).times(0.5)\n    r = corner2.minus(corner1).times(0.5)\n  } else {\n    c = parseOptionAs2DVector(options, 'center', [0, 0])\n    r = parseOptionAs2DVector(options, 'radius', [1, 1])\n  }\n  r = r.abs() // negative radii make no sense\n  let rswap = new Vector2D(r.x, -r.y)\n  let points = [\n    c.plus(r), c.plus(rswap), c.minus(r), c.minus(rswap)\n  ]\n  return fromPoints(points)\n}\n\n/** Construct a rounded rectangle.\n * @param {Object} [options] - options for construction\n * @param {Vector2D} [options.center=[0,0]] - center of rounded rectangle\n * @param {Vector2D} [options.radius=[1,1]] - radius of rounded rectangle, width and height\n * @param {Vector2D} [options.corner1=[0,0]] - bottom left corner of rounded rectangle (alternate)\n * @param {Vector2D} [options.corner2=[0,0]] - upper right corner of rounded rectangle (alternate)\n * @param {Number} [options.roundradius=0.2] - round radius of corners\n * @param {Number} [options.resolution=defaultResolution2D] - number of sides per 360 rotation\n * @returns {CAG} new CAG object\n *\n * @example\n * let r = roundedRectangle({\n *   center: [0, 0],\n *   radius: [5, 10],\n *   roundradius: 2,\n *   resolution: 36,\n * });\n */\nconst roundedRectangle = function (options) {\n  options = options || {}\n  let center, radius\n  if (('corner1' in options) || ('corner2' in options)) {\n    if (('center' in options) || ('radius' in options)) {\n      throw new Error('roundedRectangle: should either give a radius and center parameter, or a corner1 and corner2 parameter')\n    }\n    let corner1 = parseOptionAs2DVector(options, 'corner1', [0, 0])\n    let corner2 = parseOptionAs2DVector(options, 'corner2', [1, 1])\n    center = corner1.plus(corner2).times(0.5)\n    radius = corner2.minus(corner1).times(0.5)\n  } else {\n    center = parseOptionAs2DVector(options, 'center', [0, 0])\n    radius = parseOptionAs2DVector(options, 'radius', [1, 1])\n  }\n  radius = radius.abs() // negative radii make no sense\n  let roundradius = parseOptionAsFloat(options, 'roundradius', 0.2)\n  let resolution = parseOptionAsInt(options, 'resolution', defaultResolution2D)\n  let maxroundradius = Math.min(radius.x, radius.y)\n  maxroundradius -= 0.1\n  roundradius = Math.min(roundradius, maxroundradius)\n  roundradius = Math.max(0, roundradius)\n  radius = new Vector2D(radius.x - roundradius, radius.y - roundradius)\n  let rect = rectangle({\n    center: center,\n    radius: radius\n  })\n  if (roundradius > 0) {\n    rect = rect.expand(roundradius, resolution)\n  }\n  return rect\n}\n\n/** Reconstruct a CAG from the output of toCompactBinary().\n * @param {CompactBinary} bin - see toCompactBinary()\n * @returns {CAG} new CAG object\n */\n/*fromCompactBinary = function (bin) {\n  if (bin['class'] !== 'CAG') throw new Error('Not a CAG')\n  let vertices = []\n  let vertexData = bin.vertexData\n  let numvertices = vertexData.length / 2\n  let arrayindex = 0\n  for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n    let x = vertexData[arrayindex++]\n    let y = vertexData[arrayindex++]\n    let pos = new Vector2D(x, y)\n    let vertex = new Vertex2(pos)\n    vertices.push(vertex)\n  }\n\n  let sides = []\n  let numsides = bin.sideVertexIndices.length / 2\n  arrayindex = 0\n  for (let sideindex = 0; sideindex < numsides; sideindex++) {\n    let vertexindex0 = bin.sideVertexIndices[arrayindex++]\n    let vertexindex1 = bin.sideVertexIndices[arrayindex++]\n    let side = new Side(vertices[vertexindex0], vertices[vertexindex1])\n    sides.push(side)\n  }\n  let cag = fromSides(sides)\n  cag.isCanonicalized = true\n  return cag\n}*/\n\nmodule.exports = {\n  circle,\n  ellipse,\n  rectangle,\n  roundedRectangle,\n  fromCompactBinary\n}\n\n},{\"../core/CAG\":45,\"../core/CAGFactories\":46,\"../core/constants\":54,\"../core/math/Path2\":59,\"../core/math/Vector2\":64,\"../core/math/Vertex2\":66,\"./optionParsers\":38}],41:[function(require,module,exports){\n\n/// //////////FUNCTIONAL API\nconst {CSG} = require('../../csg')\nconst { circle } = require('./primitives2d-api')\nconst { rotate_extrude } = require('./ops-extrusions')\nconst { translate, scale } = require('./ops-transformations')\nconst Polygon3 = require('../core/math/Polygon3')\nconst Vector3 = require('../core/math/Vector3')\nconst Vertex3 = require('../core/math/Vertex3')\n\n/** Construct a cuboid\n * @param {Object} [options] - options for construction\n * @param {Float} [options.size=1] - size of the side of the cuboid : can be either:\n * - a scalar : ie a single float, in which case all dimensions will be the same\n * - or an array: to specify different dimensions along x/y/z\n * @param {Integer} [options.fn=32] - segments of the sphere (ie quality/resolution)\n * @param {Integer} [options.fno=32] - segments of extrusion (ie quality)\n * @param {String} [options.type='normal'] - type of sphere : either 'normal' or 'geodesic'\n * @returns {CSG} new sphere\n *\n * @example\n * let cube1 = cube({\n *   r: 10,\n *   fn: 20\n * })\n */\nfunction cube (params) {\n  const defaults = {\n    size: 1,\n    offset: [0, 0, 0],\n    round: false,\n    radius: 0,\n    fn: 8\n  }\n\n  let {round, radius, fn, size} = Object.assign({}, defaults, params)\n  let offset = [0, 0, 0]\n  let v = null\n  if (params && params.length) v = params\n  if (params && params.size && params.size.length) v = params.size // { size: [1,2,3] }\n  if (params && params.size && !params.size.length) size = params.size // { size: 1 }\n  if (params && (typeof params !== 'object')) size = params// (2)\n  if (params && params.round === true) {\n    round = true\n    radius = v && v.length ? (v[0] + v[1] + v[2]) / 30 : size / 10\n  }\n  if (params && params.radius) {\n    round = true\n    radius = params.radius\n  }\n\n  let x = size\n  let y = size\n  let z = size\n  if (v && v.length) {\n    [x, y, z] = v\n  }\n  offset = [x / 2, y / 2, z / 2] // center: false default\n  let object = round\n    ? CSG.roundedCube({radius: [x / 2, y / 2, z / 2], roundradius: radius, resolution: fn})\n    : CSG.cube({radius: [x / 2, y / 2, z / 2]})\n  if (params && params.center && params.center.length) {\n    offset = [params.center[0] ? 0 : x / 2, params.center[1] ? 0 : y / 2, params.center[2] ? 0 : z / 2]\n  } else if (params && params.center === true) {\n    offset = [0, 0, 0]\n  } else if (params && params.center === false) {\n    offset = [x / 2, y / 2, z / 2]\n  }\n  return (offset[0] || offset[1] || offset[2]) ? translate(offset, object) : object\n}\n\n/** Construct a sphere\n * @param {Object} [options] - options for construction\n * @param {Float} [options.r=1] - radius of the sphere\n * @param {Integer} [options.fn=32] - segments of the sphere (ie quality/resolution)\n * @param {Integer} [options.fno=32] - segments of extrusion (ie quality)\n * @param {String} [options.type='normal'] - type of sphere : either 'normal' or 'geodesic'\n * @returns {CSG} new sphere\n *\n * @example\n * let sphere1 = sphere({\n *   r: 10,\n *   fn: 20\n * })\n */\nfunction sphere (params) {\n  const defaults = {\n    r: 1,\n    fn: 32,\n    type: 'normal'\n  }\n\n  let {r, fn, type} = Object.assign({}, defaults, params)\n  let offset = [0, 0, 0] // center: false (default)\n  if (params && (typeof params !== 'object')) {\n    r = params\n  }\n  // let zoffset = 0 // sphere() in openscad has no center:true|false\n\n  let output = type === 'geodesic' ? geodesicSphere(params) : CSG.sphere({radius: r, resolution: fn})\n\n  // preparing individual x,y,z center\n  if (params && params.center && params.center.length) {\n    offset = [params.center[0] ? 0 : r, params.center[1] ? 0 : r, params.center[2] ? 0 : r]\n  } else if (params && params.center === true) {\n    offset = [0, 0, 0]\n  } else if (params && params.center === false) {\n    offset = [r, r, r]\n  }\n  return (offset[0] || offset[1] || offset[2]) ? translate(offset, output) : output\n}\n\nfunction geodesicSphere (params) {\n  const defaults = {\n    r: 1,\n    fn: 5\n  }\n  let {r, fn} = Object.assign({}, defaults, params)\n\n  let ci = [ // hard-coded data of icosahedron (20 faces, all triangles)\n    [0.850651, 0.000000, -0.525731],\n    [0.850651, -0.000000, 0.525731],\n    [-0.850651, -0.000000, 0.525731],\n    [-0.850651, 0.000000, -0.525731],\n    [0.000000, -0.525731, 0.850651],\n    [0.000000, 0.525731, 0.850651],\n    [0.000000, 0.525731, -0.850651],\n    [0.000000, -0.525731, -0.850651],\n    [-0.525731, -0.850651, -0.000000],\n    [0.525731, -0.850651, -0.000000],\n    [0.525731, 0.850651, 0.000000],\n    [-0.525731, 0.850651, 0.000000]]\n\n  let ti = [ [0, 9, 1], [1, 10, 0], [6, 7, 0], [10, 6, 0], [7, 9, 0], [5, 1, 4], [4, 1, 9], [5, 10, 1], [2, 8, 3], [3, 11, 2], [2, 5, 4],\n    [4, 8, 2], [2, 11, 5], [3, 7, 6], [6, 11, 3], [8, 7, 3], [9, 8, 4], [11, 10, 5], [10, 11, 6], [8, 9, 7]]\n\n  let geodesicSubDivide = function (p, fn, offset) {\n    let p1 = p[0]\n    let p2 = p[1]\n    let p3 = p[2]\n    let n = offset\n    let c = []\n    let f = []\n\n    //           p3\n    //           /\\\n    //          /__\\     fn = 3\n    //      i  /\\  /\\\n    //        /__\\/__\\       total triangles = 9 (fn*fn)\n    //       /\\  /\\  /\\\n    //     0/__\\/__\\/__\\\n    //    p1 0   j      p2\n\n    for (let i = 0; i < fn; i++) {\n      for (let j = 0; j < fn - i; j++) {\n        let t0 = i / fn\n        let t1 = (i + 1) / fn\n        let s0 = j / (fn - i)\n        let s1 = (j + 1) / (fn - i)\n        let s2 = fn - i - 1 ? j / (fn - i - 1) : 1\n        let q = []\n\n        q[0] = mix3(mix3(p1, p2, s0), p3, t0)\n        q[1] = mix3(mix3(p1, p2, s1), p3, t0)\n        q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n        // -- normalize\n        for (let k = 0; k < 3; k++) {\n          let r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n          for (let l = 0; l < 3; l++) {\n            q[k][l] /= r\n          }\n        }\n        c.push(q[0], q[1], q[2])\n        f.push([n, n + 1, n + 2]); n += 3\n\n        if (j < fn - i - 1) {\n          let s3 = fn - i - 1 ? (j + 1) / (fn - i - 1) : 1\n          q[0] = mix3(mix3(p1, p2, s1), p3, t0)\n          q[1] = mix3(mix3(p1, p2, s3), p3, t1)\n          q[2] = mix3(mix3(p1, p2, s2), p3, t1)\n\n          // -- normalize\n          for (let k = 0; k < 3; k++) {\n            let r = Math.sqrt(q[k][0] * q[k][0] + q[k][1] * q[k][1] + q[k][2] * q[k][2])\n            for (let l = 0; l < 3; l++) {\n              q[k][l] /= r\n            }\n          }\n          c.push(q[0], q[1], q[2])\n          f.push([n, n + 1, n + 2]); n += 3\n        }\n      }\n    }\n    return { points: c, triangles: f, offset: n }\n  }\n\n  const mix3 = function (a, b, f) {\n    let _f = 1 - f\n    let c = []\n    for (let i = 0; i < 3; i++) {\n      c[i] = a[i] * _f + b[i] * f\n    }\n    return c\n  }\n\n  if (params) {\n    if (params.fn) fn = Math.floor(params.fn / 6)\n  }\n\n  if (fn <= 0) fn = 1\n\n  let c = []\n  let f = []\n  let offset = 0\n\n  for (let i = 0; i < ti.length; i++) {\n    let g = geodesicSubDivide([ ci[ti[i][0]], ci[ti[i][1]], ci[ti[i][2]]], fn, offset)\n    c = c.concat(g.points)\n    f = f.concat(g.triangles)\n    offset = g.offset\n  }\n  return scale(r, polyhedron({points: c, triangles: f}))\n}\n\n/** Construct a cylinder\n * @param {Object} [options] - options for construction\n * @param {Float} [options.r=1] - radius of the cylinder\n * @param {Float} [options.r1=1] - radius of the top of the cylinder\n * @param {Float} [options.r2=1] - radius of the bottom of the cylinder\n * @param {Float} [options.d=1] - diameter of the cylinder\n * @param {Float} [options.d1=1] - diameter of the top of the cylinder\n * @param {Float} [options.d2=1] - diameter of the bottom of the cylinder\n * @param {Integer} [options.fn=32] - number of sides of the cylinder (ie quality/resolution)\n * @returns {CSG} new cylinder\n *\n * @example\n * let cylinder = cylinder({\n *   d: 10,\n *   fn: 20\n * })\n */\nfunction cylinder (params) {\n  const defaults = {\n    r: 1,\n    r1: 1,\n    r2: 1,\n    h: 1,\n    fn: 32,\n    round: false\n  }\n  let {r1, r2, h, fn, round} = Object.assign({}, defaults, params)\n  let offset = [0, 0, 0]\n  let a = arguments\n  if (params && params.d) {\n    r1 = r2 = params.d / 2\n  }\n  if (params && params.r) {\n    r1 = params.r\n    r2 = params.r\n  }\n  if (params && params.h) {\n    h = params.h\n  }\n  if (params && (params.r1 || params.r2)) {\n    r1 = params.r1\n    r2 = params.r2\n    if (params.h) h = params.h\n  }\n  if (params && (params.d1 || params.d2)) {\n    r1 = params.d1 / 2\n    r2 = params.d2 / 2\n  }\n\n  if (a && a[0] && a[0].length) {\n    a = a[0]\n    r1 = a[0]\n    r2 = a[1]\n    h = a[2]\n    if (a.length === 4) fn = a[3]\n  }\n\n  let object\n  if (params && (params.start && params.end)) {\n    object = round\n      ? CSG.roundedCylinder({start: params.start, end: params.end, radiusStart: r1, radiusEnd: r2, resolution: fn})\n      : CSG.cylinder({start: params.start, end: params.end, radiusStart: r1, radiusEnd: r2, resolution: fn})\n  } else {\n    object = round\n      ? CSG.roundedCylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn})\n      : CSG.cylinder({start: [0, 0, 0], end: [0, 0, h], radiusStart: r1, radiusEnd: r2, resolution: fn})\n    let r = r1 > r2 ? r1 : r2\n    if (params && params.center && params.center.length) { // preparing individual x,y,z center\n      offset = [params.center[0] ? 0 : r, params.center[1] ? 0 : r, params.center[2] ? -h / 2 : 0]\n    } else if (params && params.center === true) {\n      offset = [0, 0, -h / 2]\n    } else if (params && params.center === false) {\n      offset = [0, 0, 0]\n    }\n    object = (offset[0] || offset[1] || offset[2]) ? translate(offset, object) : object\n  }\n  return object\n}\n\n/** Construct a torus\n * @param {Object} [options] - options for construction\n * @param {Float} [options.ri=1] - radius of base circle\n * @param {Float} [options.ro=4] - radius offset\n * @param {Integer} [options.fni=16] - segments of base circle (ie quality)\n * @param {Integer} [options.fno=32] - segments of extrusion (ie quality)\n * @param {Integer} [options.roti=0] - rotation angle of base circle\n * @returns {CSG} new torus\n *\n * @example\n * let torus1 = torus({\n *   ri: 10\n * })\n */\nfunction torus (params) {\n  const defaults = {\n    ri: 1,\n    ro: 4,\n    fni: 16,\n    fno: 32,\n    roti: 0\n  }\n  params = Object.assign({}, defaults, params)\n\n  /* possible enhancements ? declarative limits\n  const limits = {\n    fni: {min: 3},\n    fno: {min: 3}\n  } */\n\n  let {ri, ro, fni, fno, roti} = params\n\n  if (fni < 3) fni = 3\n  if (fno < 3) fno = 3\n\n  let baseCircle = circle({r: ri, fn: fni, center: true})\n\n  if (roti) baseCircle = baseCircle.rotateZ(roti)\n  let result = rotate_extrude({fn: fno}, translate([ro, 0, 0], baseCircle))\n  // result = result.union(result)\n  return result\n}\n\n/** Construct a polyhedron from the given triangles/ polygons/points\n * @param {Object} [options] - options for construction\n * @param {Array} [options.triangles] - triangles to build the polyhedron from\n * @param {Array} [options.polygons] - polygons to build the polyhedron from\n * @param {Array} [options.points] - points to build the polyhedron from\n * @param {Array} [options.colors] - colors to apply to the polyhedron\n * @returns {CSG} new polyhedron\n *\n * @example\n * let torus1 = polyhedron({\n *   points: [...]\n * })\n */\nfunction polyhedron (params) {\n  let pgs = []\n  let ref = params.triangles || params.polygons\n  let colors = params.colors || null\n\n  for (let i = 0; i < ref.length; i++) {\n    let pp = []\n    for (let j = 0; j < ref[i].length; j++) {\n      pp[j] = params.points[ref[i][j]]\n    }\n\n    let v = []\n    for (let j = ref[i].length - 1; j >= 0; j--) { // --- we reverse order for examples of OpenSCAD work\n      v.push(new Vertex3(new Vector3(pp[j][0], pp[j][1], pp[j][2])))\n    }\n    let s = Polygon3.defaultShared\n    if (colors && colors[i]) {\n      s = Polygon3.Shared.fromColor(colors[i])\n    }\n    pgs.push(new Polygon3(v, s))\n  }\n\n  // forced to import here, otherwise out of order imports mess things up\n  const {fromPolygons} = require('../core/CSGFactories')\n  return fromPolygons(pgs)\n}\n\nmodule.exports = {\n  cube,\n  sphere,\n  cylinder,\n  geodesicSphere,\n  torus,\n  polyhedron\n}\n\n},{\"../../csg\":22,\"../core/CSGFactories\":48,\"../core/math/Polygon3\":62,\"../core/math/Vector3\":65,\"../core/math/Vertex3\":67,\"./ops-extrusions\":36,\"./ops-transformations\":37,\"./primitives2d-api\":39}],42:[function(require,module,exports){\nconst {parseOption, parseOptionAs3DVector, parseOptionAs2DVector, parseOptionAs3DVectorList, parseOptionAsFloat, parseOptionAsInt} = require('./optionParsers')\nconst {defaultResolution3D, defaultResolution2D, EPS} = require('../core/constants')\nconst Vector3 = require('../core/math/Vector3')\nconst Vertex3 = require('../core/math/Vertex3')\nconst Polygon3 = require('../core/math/Polygon3')\nconst {Connector} = require('../core/connectors')\nconst Properties = require('../core/Properties')\nconst {fromPolygons} = require('../core/CSGFactories')\n\n/** Construct an axis-aligned solid cuboid.\n * @param {Object} [options] - options for construction\n * @param {Vector3} [options.center=[0,0,0]] - center of cube\n * @param {Vector3} [options.radius=[1,1,1]] - radius of cube, single scalar also possible\n * @returns {CSG} new 3D solid\n *\n * @example\n * let cube = CSG.cube({\n *   center: [5, 5, 5],\n *   radius: 5, // scalar radius\n * });\n */\nconst cube = function (options) {\n  let c\n  let r\n  let corner1\n  let corner2\n  options = options || {}\n  if (('corner1' in options) || ('corner2' in options)) {\n    if (('center' in options) || ('radius' in options)) {\n      throw new Error('cube: should either give a radius and center parameter, or a corner1 and corner2 parameter')\n    }\n    corner1 = parseOptionAs3DVector(options, 'corner1', [0, 0, 0])\n    corner2 = parseOptionAs3DVector(options, 'corner2', [1, 1, 1])\n    c = corner1.plus(corner2).times(0.5)\n    r = corner2.minus(corner1).times(0.5)\n  } else {\n    c = parseOptionAs3DVector(options, 'center', [0, 0, 0])\n    r = parseOptionAs3DVector(options, 'radius', [1, 1, 1])\n  }\n  r = r.abs() // negative radii make no sense\n  let result = fromPolygons([\n    [\n            [0, 4, 6, 2],\n            [-1, 0, 0]\n    ],\n    [\n            [1, 3, 7, 5],\n            [+1, 0, 0]\n    ],\n    [\n            [0, 1, 5, 4],\n            [0, -1, 0]\n    ],\n    [\n            [2, 6, 7, 3],\n            [0, +1, 0]\n    ],\n    [\n            [0, 2, 3, 1],\n            [0, 0, -1]\n    ],\n    [\n            [4, 5, 7, 6],\n            [0, 0, +1]\n    ]\n  ].map(function (info) {\n    let vertices = info[0].map(function (i) {\n      let pos = new Vector3(\n                c.x + r.x * (2 * !!(i & 1) - 1), c.y + r.y * (2 * !!(i & 2) - 1), c.z + r.z * (2 * !!(i & 4) - 1))\n      return new Vertex3(pos)\n    })\n    return new Polygon3(vertices, null /* , plane */)\n  }))\n  result.properties.cube = new Properties()\n  result.properties.cube.center = new Vector3(c)\n    // add 6 connectors, at the centers of each face:\n  result.properties.cube.facecenters = [\n    new Connector(new Vector3([r.x, 0, 0]).plus(c), [1, 0, 0], [0, 0, 1]),\n    new Connector(new Vector3([-r.x, 0, 0]).plus(c), [-1, 0, 0], [0, 0, 1]),\n    new Connector(new Vector3([0, r.y, 0]).plus(c), [0, 1, 0], [0, 0, 1]),\n    new Connector(new Vector3([0, -r.y, 0]).plus(c), [0, -1, 0], [0, 0, 1]),\n    new Connector(new Vector3([0, 0, r.z]).plus(c), [0, 0, 1], [1, 0, 0]),\n    new Connector(new Vector3([0, 0, -r.z]).plus(c), [0, 0, -1], [1, 0, 0])\n  ]\n  return result\n}\n\n/** Construct a solid sphere\n * @param {Object} [options] - options for construction\n * @param {Vector3} [options.center=[0,0,0]] - center of sphere\n * @param {Number} [options.radius=1] - radius of sphere\n * @param {Number} [options.resolution=defaultResolution3D] - number of polygons per 360 degree revolution\n * @param {Array} [options.axes] -  an array with 3 vectors for the x, y and z base vectors\n * @returns {CSG} new 3D solid\n *\n *\n * @example\n * let sphere = CSG.sphere({\n *   center: [0, 0, 0],\n *   radius: 2,\n *   resolution: 32,\n * });\n*/\nconst sphere = function (options) {\n  options = options || {}\n  let center = parseOptionAs3DVector(options, 'center', [0, 0, 0])\n  let radius = parseOptionAsFloat(options, 'radius', 1)\n  let resolution = parseOptionAsInt(options, 'resolution', defaultResolution3D)\n  let xvector, yvector, zvector\n  if ('axes' in options) {\n    xvector = options.axes[0].unit().times(radius)\n    yvector = options.axes[1].unit().times(radius)\n    zvector = options.axes[2].unit().times(radius)\n  } else {\n    xvector = new Vector3([1, 0, 0]).times(radius)\n    yvector = new Vector3([0, -1, 0]).times(radius)\n    zvector = new Vector3([0, 0, 1]).times(radius)\n  }\n  if (resolution < 4) resolution = 4\n  let qresolution = Math.round(resolution / 4)\n  let prevcylinderpoint\n  let polygons = []\n  for (let slice1 = 0; slice1 <= resolution; slice1++) {\n    let angle = Math.PI * 2.0 * slice1 / resolution\n    let cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)))\n    if (slice1 > 0) {\n            // cylinder vertices:\n      let vertices = []\n      let prevcospitch, prevsinpitch\n      for (let slice2 = 0; slice2 <= qresolution; slice2++) {\n        let pitch = 0.5 * Math.PI * slice2 / qresolution\n        let cospitch = Math.cos(pitch)\n        let sinpitch = Math.sin(pitch)\n        if (slice2 > 0) {\n          vertices = []\n          vertices.push(new Vertex3(center.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))))\n          vertices.push(new Vertex3(center.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))))\n          if (slice2 < qresolution) {\n            vertices.push(new Vertex3(center.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))))\n          }\n          vertices.push(new Vertex3(center.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))))\n          polygons.push(new Polygon3(vertices))\n          vertices = []\n          vertices.push(new Vertex3(center.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))))\n          vertices.push(new Vertex3(center.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))))\n          if (slice2 < qresolution) {\n            vertices.push(new Vertex3(center.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))))\n          }\n          vertices.push(new Vertex3(center.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))))\n          vertices.reverse()\n          polygons.push(new Polygon3(vertices))\n        }\n        prevcospitch = cospitch\n        prevsinpitch = sinpitch\n      }\n    }\n    prevcylinderpoint = cylinderpoint\n  }\n  let result = fromPolygons(polygons)\n  result.properties.sphere = new Properties()\n  result.properties.sphere.center = new Vector3(center)\n  result.properties.sphere.facepoint = center.plus(xvector)\n  return result\n}\n\n/** Construct a solid cylinder.\n * @param {Object} [options] - options for construction\n * @param {Vector} [options.start=[0,-1,0]] - start point of cylinder\n * @param {Vector} [options.end=[0,1,0]] - end point of cylinder\n * @param {Number} [options.radius=1] - radius of cylinder, must be scalar\n * @param {Number} [options.resolution=defaultResolution3D] - number of polygons per 360 degree revolution\n * @returns {CSG} new 3D solid\n *\n * @example\n * let cylinder = CSG.cylinder({\n *   start: [0, -10, 0],\n *   end: [0, 10, 0],\n *   radius: 10,\n *   resolution: 16\n * });\n */\nconst cylinder = function (options) {\n  let s = parseOptionAs3DVector(options, 'start', [0, -1, 0])\n  let e = parseOptionAs3DVector(options, 'end', [0, 1, 0])\n  let r = parseOptionAsFloat(options, 'radius', 1)\n  let rEnd = parseOptionAsFloat(options, 'radiusEnd', r)\n  let rStart = parseOptionAsFloat(options, 'radiusStart', r)\n  let alpha = parseOptionAsFloat(options, 'sectorAngle', 360)\n  alpha = alpha > 360 ? alpha % 360 : alpha\n\n  if ((rEnd < 0) || (rStart < 0)) {\n    throw new Error('Radius should be non-negative')\n  }\n  if ((rEnd === 0) && (rStart === 0)) {\n    throw new Error('Either radiusStart or radiusEnd should be positive')\n  }\n\n  let slices = parseOptionAsInt(options, 'resolution', defaultResolution2D) // FIXME is this 3D?\n  let ray = e.minus(s)\n  let axisZ = ray.unit() //, isY = (Math.abs(axisZ.y) > 0.5);\n  let axisX = axisZ.randomNonParallelVector().unit()\n\n    //  let axisX = new Vector3(isY, !isY, 0).cross(axisZ).unit();\n  let axisY = axisX.cross(axisZ).unit()\n  let start = new Vertex3(s)\n  let end = new Vertex3(e)\n  let polygons = []\n\n  function point (stack, slice, radius) {\n    let angle = slice * Math.PI * alpha / 180\n    let out = axisX.times(Math.cos(angle)).plus(axisY.times(Math.sin(angle)))\n    let pos = s.plus(ray.times(stack)).plus(out.times(radius))\n    return new Vertex3(pos)\n  }\n  if (alpha > 0) {\n    for (let i = 0; i < slices; i++) {\n      let t0 = i / slices\n      let t1 = (i + 1) / slices\n      if (rEnd === rStart) {\n        polygons.push(new Polygon3([start, point(0, t0, rEnd), point(0, t1, rEnd)]))\n        polygons.push(new Polygon3([point(0, t1, rEnd), point(0, t0, rEnd), point(1, t0, rEnd), point(1, t1, rEnd)]))\n        polygons.push(new Polygon3([end, point(1, t1, rEnd), point(1, t0, rEnd)]))\n      } else {\n        if (rStart > 0) {\n          polygons.push(new Polygon3([start, point(0, t0, rStart), point(0, t1, rStart)]))\n          polygons.push(new Polygon3([point(0, t0, rStart), point(1, t0, rEnd), point(0, t1, rStart)]))\n        }\n        if (rEnd > 0) {\n          polygons.push(new Polygon3([end, point(1, t1, rEnd), point(1, t0, rEnd)]))\n          polygons.push(new Polygon3([point(1, t0, rEnd), point(1, t1, rEnd), point(0, t1, rStart)]))\n        }\n      }\n    }\n    if (alpha < 360) {\n      polygons.push(new Polygon3([start, end, point(0, 0, rStart)]))\n      polygons.push(new Polygon3([point(0, 0, rStart), end, point(1, 0, rEnd)]))\n      polygons.push(new Polygon3([start, point(0, 1, rStart), end]))\n      polygons.push(new Polygon3([point(0, 1, rStart), point(1, 1, rEnd), end]))\n    }\n  }\n  let result = fromPolygons(polygons)\n  result.properties.cylinder = new Properties()\n  result.properties.cylinder.start = new Connector(s, axisZ.negated(), axisX)\n  result.properties.cylinder.end = new Connector(e, axisZ, axisX)\n  let cylCenter = s.plus(ray.times(0.5))\n  let fptVec = axisX.rotate(s, axisZ, -alpha / 2).times((rStart + rEnd) / 2)\n  let fptVec90 = fptVec.cross(axisZ)\n    // note this one is NOT a face normal for a cone. - It's horizontal from cyl perspective\n  result.properties.cylinder.facepointH = new Connector(cylCenter.plus(fptVec), fptVec, axisZ)\n  result.properties.cylinder.facepointH90 = new Connector(cylCenter.plus(fptVec90), fptVec90, axisZ)\n  return result\n}\n\n/** Construct a cylinder with rounded ends.\n * @param {Object} [options] - options for construction\n * @param {Vector3} [options.start=[0,-1,0]] - start point of cylinder\n * @param {Vector3} [options.end=[0,1,0]] - end point of cylinder\n * @param {Number} [options.radius=1] - radius of rounded ends, must be scalar\n * @param {Vector3} [options.normal] - vector determining the starting angle for tesselation. Should be non-parallel to start.minus(end)\n * @param {Number} [options.resolution=defaultResolution3D] - number of polygons per 360 degree revolution\n * @returns {CSG} new 3D solid\n *\n * @example\n * let cylinder = CSG.roundedCylinder({\n *   start: [0, -10, 0],\n *   end: [0, 10, 0],\n *   radius: 2,\n *   resolution: 16\n * });\n */\nconst roundedCylinder = function (options) {\n  let p1 = parseOptionAs3DVector(options, 'start', [0, -1, 0])\n  let p2 = parseOptionAs3DVector(options, 'end', [0, 1, 0])\n  let radius = parseOptionAsFloat(options, 'radius', 1)\n  let direction = p2.minus(p1)\n  let defaultnormal\n  if (Math.abs(direction.x) > Math.abs(direction.y)) {\n    defaultnormal = new Vector3(0, 1, 0)\n  } else {\n    defaultnormal = new Vector3(1, 0, 0)\n  }\n  let normal = parseOptionAs3DVector(options, 'normal', defaultnormal)\n  let resolution = parseOptionAsInt(options, 'resolution', defaultResolution3D)\n  if (resolution < 4) resolution = 4\n  let polygons = []\n  let qresolution = Math.floor(0.25 * resolution)\n  let length = direction.length()\n  if (length < EPS) {\n    return sphere({\n      center: p1,\n      radius: radius,\n      resolution: resolution\n    })\n  }\n  let zvector = direction.unit().times(radius)\n  let xvector = zvector.cross(normal).unit().times(radius)\n  let yvector = xvector.cross(zvector).unit().times(radius)\n  let prevcylinderpoint\n  for (let slice1 = 0; slice1 <= resolution; slice1++) {\n    let angle = Math.PI * 2.0 * slice1 / resolution\n    let cylinderpoint = xvector.times(Math.cos(angle)).plus(yvector.times(Math.sin(angle)))\n    if (slice1 > 0) {\n            // cylinder vertices:\n      let vertices = []\n      vertices.push(new Vertex3(p1.plus(cylinderpoint)))\n      vertices.push(new Vertex3(p1.plus(prevcylinderpoint)))\n      vertices.push(new Vertex3(p2.plus(prevcylinderpoint)))\n      vertices.push(new Vertex3(p2.plus(cylinderpoint)))\n      polygons.push(new Polygon3(vertices))\n      let prevcospitch, prevsinpitch\n      for (let slice2 = 0; slice2 <= qresolution; slice2++) {\n        let pitch = 0.5 * Math.PI * slice2 / qresolution\n                // let pitch = Math.asin(slice2/qresolution);\n        let cospitch = Math.cos(pitch)\n        let sinpitch = Math.sin(pitch)\n        if (slice2 > 0) {\n          vertices = []\n          vertices.push(new Vertex3(p1.plus(prevcylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))))\n          vertices.push(new Vertex3(p1.plus(cylinderpoint.times(prevcospitch).minus(zvector.times(prevsinpitch)))))\n          if (slice2 < qresolution) {\n            vertices.push(new Vertex3(p1.plus(cylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))))\n          }\n          vertices.push(new Vertex3(p1.plus(prevcylinderpoint.times(cospitch).minus(zvector.times(sinpitch)))))\n          polygons.push(new Polygon3(vertices))\n          vertices = []\n          vertices.push(new Vertex3(p2.plus(prevcylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))))\n          vertices.push(new Vertex3(p2.plus(cylinderpoint.times(prevcospitch).plus(zvector.times(prevsinpitch)))))\n          if (slice2 < qresolution) {\n            vertices.push(new Vertex3(p2.plus(cylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))))\n          }\n          vertices.push(new Vertex3(p2.plus(prevcylinderpoint.times(cospitch).plus(zvector.times(sinpitch)))))\n          vertices.reverse()\n          polygons.push(new Polygon3(vertices))\n        }\n        prevcospitch = cospitch\n        prevsinpitch = sinpitch\n      }\n    }\n    prevcylinderpoint = cylinderpoint\n  }\n  let result = fromPolygons(polygons)\n  let ray = zvector.unit()\n  let axisX = xvector.unit()\n  result.properties.roundedCylinder = new Properties()\n  result.properties.roundedCylinder.start = new Connector(p1, ray.negated(), axisX)\n  result.properties.roundedCylinder.end = new Connector(p2, ray, axisX)\n  result.properties.roundedCylinder.facepoint = p1.plus(xvector)\n  return result\n}\n\n/** Construct an elliptic cylinder.\n * @param {Object} [options] - options for construction\n * @param {Vector3} [options.start=[0,-1,0]] - start point of cylinder\n * @param {Vector3} [options.end=[0,1,0]] - end point of cylinder\n * @param {Vector2D} [options.radius=[1,1]] - radius of rounded ends, must be two dimensional array\n * @param {Vector2D} [options.radiusStart=[1,1]] - OPTIONAL radius of rounded start, must be two dimensional array\n * @param {Vector2D} [options.radiusEnd=[1,1]] - OPTIONAL radius of rounded end, must be two dimensional array\n * @param {Number} [options.resolution=defaultResolution2D] - number of polygons per 360 degree revolution\n * @returns {CSG} new 3D solid\n *\n * @example\n *     let cylinder = CSG.cylinderElliptic({\n *       start: [0, -10, 0],\n *       end: [0, 10, 0],\n *       radiusStart: [10,5],\n *       radiusEnd: [8,3],\n *       resolution: 16\n *     });\n */\n\nconst cylinderElliptic = function (options) {\n  let s = parseOptionAs3DVector(options, 'start', [0, -1, 0])\n  let e = parseOptionAs3DVector(options, 'end', [0, 1, 0])\n  let r = parseOptionAs2DVector(options, 'radius', [1, 1])\n  let rEnd = parseOptionAs2DVector(options, 'radiusEnd', r)\n  let rStart = parseOptionAs2DVector(options, 'radiusStart', r)\n\n  if ((rEnd._x < 0) || (rStart._x < 0) || (rEnd._y < 0) || (rStart._y < 0)) {\n    throw new Error('Radius should be non-negative')\n  }\n  if ((rEnd._x === 0 || rEnd._y === 0) && (rStart._x === 0 || rStart._y === 0)) {\n    throw new Error('Either radiusStart or radiusEnd should be positive')\n  }\n\n  let slices = parseOptionAsInt(options, 'resolution', defaultResolution2D) // FIXME is this correct?\n  let ray = e.minus(s)\n  let axisZ = ray.unit() //, isY = (Math.abs(axisZ.y) > 0.5);\n  let axisX = axisZ.randomNonParallelVector().unit()\n\n    //  let axisX = new Vector3(isY, !isY, 0).cross(axisZ).unit();\n  let axisY = axisX.cross(axisZ).unit()\n  let start = new Vertex3(s)\n  let end = new Vertex3(e)\n  let polygons = []\n\n  function point (stack, slice, radius) {\n    let angle = slice * Math.PI * 2\n    let out = axisX.times(radius._x * Math.cos(angle)).plus(axisY.times(radius._y * Math.sin(angle)))\n    let pos = s.plus(ray.times(stack)).plus(out)\n    return new Vertex3(pos)\n  }\n  for (let i = 0; i < slices; i++) {\n    let t0 = i / slices\n    let t1 = (i + 1) / slices\n\n    if (rEnd._x === rStart._x && rEnd._y === rStart._y) {\n      polygons.push(new Polygon3([start, point(0, t0, rEnd), point(0, t1, rEnd)]))\n      polygons.push(new Polygon3([point(0, t1, rEnd), point(0, t0, rEnd), point(1, t0, rEnd), point(1, t1, rEnd)]))\n      polygons.push(new Polygon3([end, point(1, t1, rEnd), point(1, t0, rEnd)]))\n    } else {\n      if (rStart._x > 0) {\n        polygons.push(new Polygon3([start, point(0, t0, rStart), point(0, t1, rStart)]))\n        polygons.push(new Polygon3([point(0, t0, rStart), point(1, t0, rEnd), point(0, t1, rStart)]))\n      }\n      if (rEnd._x > 0) {\n        polygons.push(new Polygon3([end, point(1, t1, rEnd), point(1, t0, rEnd)]))\n        polygons.push(new Polygon3([point(1, t0, rEnd), point(1, t1, rEnd), point(0, t1, rStart)]))\n      }\n    }\n  }\n  let result = fromPolygons(polygons)\n  result.properties.cylinder = new Properties()\n  result.properties.cylinder.start = new Connector(s, axisZ.negated(), axisX)\n  result.properties.cylinder.end = new Connector(e, axisZ, axisX)\n  result.properties.cylinder.facepoint = s.plus(axisX.times(rStart))\n  return result\n}\n\n/** Construct an axis-aligned solid rounded cuboid.\n * @param {Object} [options] - options for construction\n * @param {Vector3} [options.center=[0,0,0]] - center of rounded cube\n * @param {Vector3} [options.radius=[1,1,1]] - radius of rounded cube, single scalar is possible\n * @param {Number} [options.roundradius=0.2] - radius of rounded edges\n * @param {Number} [options.resolution=defaultResolution3D] - number of polygons per 360 degree revolution\n * @returns {CSG} new 3D solid\n *\n * @example\n * let cube = CSG.roundedCube({\n *   center: [2, 0, 2],\n *   radius: 15,\n *   roundradius: 2,\n *   resolution: 36,\n * });\n */\nconst roundedCube = function (options) {\n  let minRR = 1e-2 // minroundradius 1e-3 gives rounding errors already\n  let center\n  let cuberadius\n  let corner1\n  let corner2\n  options = options || {}\n  if (('corner1' in options) || ('corner2' in options)) {\n    if (('center' in options) || ('radius' in options)) {\n      throw new Error('roundedCube: should either give a radius and center parameter, or a corner1 and corner2 parameter')\n    }\n    corner1 = parseOptionAs3DVector(options, 'corner1', [0, 0, 0])\n    corner2 = parseOptionAs3DVector(options, 'corner2', [1, 1, 1])\n    center = corner1.plus(corner2).times(0.5)\n    cuberadius = corner2.minus(corner1).times(0.5)\n  } else {\n    center = parseOptionAs3DVector(options, 'center', [0, 0, 0])\n    cuberadius = parseOptionAs3DVector(options, 'radius', [1, 1, 1])\n  }\n  cuberadius = cuberadius.abs() // negative radii make no sense\n  let resolution = parseOptionAsInt(options, 'resolution', defaultResolution3D)\n  if (resolution < 4) resolution = 4\n  if (resolution % 2 === 1 && resolution < 8) resolution = 8 // avoid ugly\n  let roundradius = parseOptionAs3DVector(options, 'roundradius', [0.2, 0.2, 0.2])\n    // slight hack for now - total radius stays ok\n  roundradius = Vector3.Create(Math.max(roundradius.x, minRR), Math.max(roundradius.y, minRR), Math.max(roundradius.z, minRR))\n  let innerradius = cuberadius.minus(roundradius)\n  if (innerradius.x < 0 || innerradius.y < 0 || innerradius.z < 0) {\n    throw new Error('roundradius <= radius!')\n  }\n  let res = sphere({radius: 1, resolution: resolution})\n  res = res.scale(roundradius)\n  innerradius.x > EPS && (res = res.stretchAtPlane([1, 0, 0], [0, 0, 0], 2 * innerradius.x))\n  innerradius.y > EPS && (res = res.stretchAtPlane([0, 1, 0], [0, 0, 0], 2 * innerradius.y))\n  innerradius.z > EPS && (res = res.stretchAtPlane([0, 0, 1], [0, 0, 0], 2 * innerradius.z))\n  res = res.translate([-innerradius.x + center.x, -innerradius.y + center.y, -innerradius.z + center.z])\n  res = res.reTesselated()\n  res.properties.roundedCube = new Properties()\n  res.properties.roundedCube.center = new Vertex3(center)\n  res.properties.roundedCube.facecenters = [\n    new Connector(new Vector3([cuberadius.x, 0, 0]).plus(center), [1, 0, 0], [0, 0, 1]),\n    new Connector(new Vector3([-cuberadius.x, 0, 0]).plus(center), [-1, 0, 0], [0, 0, 1]),\n    new Connector(new Vector3([0, cuberadius.y, 0]).plus(center), [0, 1, 0], [0, 0, 1]),\n    new Connector(new Vector3([0, -cuberadius.y, 0]).plus(center), [0, -1, 0], [0, 0, 1]),\n    new Connector(new Vector3([0, 0, cuberadius.z]).plus(center), [0, 0, 1], [1, 0, 0]),\n    new Connector(new Vector3([0, 0, -cuberadius.z]).plus(center), [0, 0, -1], [1, 0, 0])\n  ]\n  return res\n}\n\n/** Create a polyhedron using Openscad style arguments.\n * Define face vertices clockwise looking from outside.\n * @param {Object} [options] - options for construction\n * @returns {CSG} new 3D solid\n */\nconst polyhedron = function (options) {\n  options = options || {}\n  if (('points' in options) !== ('faces' in options)) {\n    throw new Error(\"polyhedron needs 'points' and 'faces' arrays\")\n  }\n  let vertices = parseOptionAs3DVectorList(options, 'points', [\n            [1, 1, 0],\n            [1, -1, 0],\n            [-1, -1, 0],\n            [-1, 1, 0],\n            [0, 0, 1]\n  ])\n        .map(function (pt) {\n          return new Vertex3(pt)\n        })\n  let faces = parseOption(options, 'faces', [\n            [0, 1, 4],\n            [1, 2, 4],\n            [2, 3, 4],\n            [3, 0, 4],\n            [1, 0, 3],\n            [2, 1, 3]\n  ])\n    // Openscad convention defines inward normals - so we have to invert here\n  faces.forEach(function (face) {\n    face.reverse()\n  })\n  let polygons = faces.map(function (face) {\n    return new Polygon3(face.map(function (idx) {\n      return vertices[idx]\n    }))\n  })\n\n    // TODO: facecenters as connectors? probably overkill. Maybe centroid\n    // the re-tesselation here happens because it's so easy for a user to\n    // create parametrized polyhedrons that end up with 1-2 dimensional polygons.\n    // These will create infinite loops at CSG.Tree()\n  return fromPolygons(polygons).reTesselated()\n}\n\nmodule.exports = {\n  cube,\n  sphere,\n  roundedCube,\n  cylinder,\n  roundedCylinder,\n  cylinderElliptic,\n  polyhedron\n}\n\n},{\"../core/CSGFactories\":48,\"../core/Properties\":52,\"../core/connectors\":53,\"../core/constants\":54,\"../core/math/Polygon3\":62,\"../core/math/Vector3\":65,\"../core/math/Vertex3\":67,\"./optionParsers\":38}],43:[function(require,module,exports){\nconst Polygon = require('../core/math/Polygon3')\nconst {fromPolygons} = require('../core/CSGFactories')\nconst {fnSortByIndex} = require('../core/utils')\n\n// FIXME: WHY is this for 3D polygons and not for 2D shapes ?\n/**\n * Creates solid from slices (Polygon) by generating walls\n * @param {Object} options Solid generating options\n *  - numslices {Number} Number of slices to be generated\n *  - callback(t, slice) {Function} Callback function generating slices.\n *          arguments: t = [0..1], slice = [0..numslices - 1]\n *          return: Polygon or null to skip\n *  - loop {Boolean} no flats, only walls, it's used to generate solids like a tor\n */\nconst solidFromSlices = function (polygon, options) {\n  let polygons = []\n  let csg = null\n  let prev = null\n  let bottom = null\n  let top = null\n  let numSlices = 2\n  let bLoop = false\n  let fnCallback\n  let flipped = null\n\n  if (options) {\n    bLoop = Boolean(options['loop'])\n\n    if (options.numslices) { numSlices = options.numslices }\n\n    if (options.callback) {\n      fnCallback = options.callback\n    }\n  }\n  if (!fnCallback) {\n    let square = Polygon.createFromPoints([\n                  [0, 0, 0],\n                  [1, 0, 0],\n                  [1, 1, 0],\n                  [0, 1, 0]\n    ])\n    fnCallback = function (t, slice) {\n      return t === 0 || t === 1 ? square.translate([0, 0, t]) : null\n    }\n  }\n  for (let i = 0, iMax = numSlices - 1; i <= iMax; i++) {\n    csg = fnCallback.call(polygon, i / iMax, i)\n    if (csg) {\n      if (!(csg instanceof Polygon)) {\n        throw new Error('Polygon.solidFromSlices callback error: Polygon expected')\n      }\n      csg.checkIfConvex()\n\n      if (prev) { // generate walls\n        if (flipped === null) { // not generated yet\n          flipped = prev.plane.signedDistanceToPoint(csg.vertices[0].pos) < 0\n        }\n        _addWalls(polygons, prev, csg, flipped)\n      } else { // the first - will be a bottom\n        bottom = csg\n      }\n      prev = csg\n    } // callback can return null to skip that slice\n  }\n  top = csg\n\n  if (bLoop) {\n    let bSameTopBottom = bottom.vertices.length === top.vertices.length &&\n                  bottom.vertices.every(function (v, index) {\n                    return v.pos.equals(top.vertices[index].pos)\n                  })\n    // if top and bottom are not the same -\n    // generate walls between them\n    if (!bSameTopBottom) {\n      _addWalls(polygons, top, bottom, flipped)\n    } // else - already generated\n  } else {\n    // save top and bottom\n    // TODO: flip if necessary\n    polygons.unshift(flipped ? bottom : bottom.flipped())\n    polygons.push(flipped ? top.flipped() : top)\n  }\n  return fromPolygons(polygons)\n}\n\n/**\n * @param walls Array of wall polygons\n * @param bottom Bottom polygon\n * @param top Top polygon\n */\nconst _addWalls = function (walls, bottom, top, bFlipped) {\n  let bottomPoints = bottom.vertices.slice(0) // make a copy\n  let topPoints = top.vertices.slice(0) // make a copy\n  let color = top.shared || null\n\n        // check if bottom perimeter is closed\n  if (!bottomPoints[0].pos.equals(bottomPoints[bottomPoints.length - 1].pos)) {\n    bottomPoints.push(bottomPoints[0])\n  }\n\n        // check if top perimeter is closed\n  if (!topPoints[0].pos.equals(topPoints[topPoints.length - 1].pos)) {\n    topPoints.push(topPoints[0])\n  }\n  if (bFlipped) {\n    bottomPoints = bottomPoints.reverse()\n    topPoints = topPoints.reverse()\n  }\n\n  let iTopLen = topPoints.length - 1\n  let iBotLen = bottomPoints.length - 1\n  let iExtra = iTopLen - iBotLen// how many extra triangles we need\n  let bMoreTops = iExtra > 0\n  let bMoreBottoms = iExtra < 0\n\n  let aMin = [] // indexes to start extra triangles (polygon with minimal square)\n        // init - we need exactly /iExtra/ small triangles\n  for (let i = Math.abs(iExtra); i > 0; i--) {\n    aMin.push({\n      len: Infinity,\n      index: -1\n    })\n  }\n\n  let len\n  if (bMoreBottoms) {\n    for (let i = 0; i < iBotLen; i++) {\n      len = bottomPoints[i].pos.distanceToSquared(bottomPoints[i + 1].pos)\n                // find the element to replace\n      for (let j = aMin.length - 1; j >= 0; j--) {\n        if (aMin[j].len > len) {\n          aMin[j].len = len\n          aMin.index = j\n          break\n        }\n      } // for\n    }\n  } else if (bMoreTops) {\n    for (let i = 0; i < iTopLen; i++) {\n      len = topPoints[i].pos.distanceToSquared(topPoints[i + 1].pos)\n                // find the element to replace\n      for (let j = aMin.length - 1; j >= 0; j--) {\n        if (aMin[j].len > len) {\n          aMin[j].len = len\n          aMin.index = j\n          break\n        }\n      } // for\n    }\n  } // if\n  // sort by index\n  aMin.sort(fnSortByIndex)\n  let getTriangle = function addWallsPutTriangle (pointA, pointB, pointC, color) {\n    return new Polygon([pointA, pointB, pointC], color)\n  // return bFlipped ? triangle.flipped() : triangle;\n  }\n\n  let bpoint = bottomPoints[0]\n  let tpoint = topPoints[0]\n  let secondPoint\n  let nBotFacet\n  let nTopFacet // length of triangle facet side\n  for (let iB = 0, iT = 0, iMax = iTopLen + iBotLen; iB + iT < iMax;) {\n    if (aMin.length) {\n      if (bMoreTops && iT === aMin[0].index) { // one vertex is on the bottom, 2 - on the top\n        secondPoint = topPoints[++iT]\n                    // console.log('<<< extra top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n        walls.push(getTriangle(\n                        secondPoint, tpoint, bpoint, color\n                    ))\n        tpoint = secondPoint\n        aMin.shift()\n        continue\n      } else if (bMoreBottoms && iB === aMin[0].index) {\n        secondPoint = bottomPoints[++iB]\n        walls.push(getTriangle(\n                        tpoint, bpoint, secondPoint, color\n                    ))\n        bpoint = secondPoint\n        aMin.shift()\n        continue\n      }\n    }\n            // choose the shortest path\n    if (iB < iBotLen) { // one vertex is on the top, 2 - on the bottom\n      nBotFacet = tpoint.pos.distanceToSquared(bottomPoints[iB + 1].pos)\n    } else {\n      nBotFacet = Infinity\n    }\n    if (iT < iTopLen) { // one vertex is on the bottom, 2 - on the top\n      nTopFacet = bpoint.pos.distanceToSquared(topPoints[iT + 1].pos)\n    } else {\n      nTopFacet = Infinity\n    }\n    if (nBotFacet <= nTopFacet) {\n      secondPoint = bottomPoints[++iB]\n      walls.push(getTriangle(\n                    tpoint, bpoint, secondPoint, color\n                ))\n      bpoint = secondPoint\n    } else if (iT < iTopLen) { // nTopFacet < Infinity\n      secondPoint = topPoints[++iT]\n                // console.log('<<< top: ' + secondPoint + ', ' + tpoint + ', bottom: ' + bpoint);\n      walls.push(getTriangle(\n                    secondPoint, tpoint, bpoint, color\n                ))\n      tpoint = secondPoint\n    };\n  }\n  return walls\n}\n\nmodule.exports = solidFromSlices\n\n},{\"../core/CSGFactories\":48,\"../core/math/Polygon3\":62,\"../core/utils\":72}],44:[function(require,module,exports){\nconst defaultFont = require('../fonts/single-line/hershey/simplex.js')\nconst { union } = require('./ops-booleans')\n\nconst defaultsVectorParams = {\n  xOffset: 0,\n  yOffset: 0,\n  input: '?',\n  align: 'left',\n  font: defaultFont,\n  height: 14, // == old vector_xxx simplex font height\n  lineSpacing: 2.142857142857143, // == 30/14 == old vector_xxx ratio\n  letterSpacing: 1,\n  extrudeOffset: 0\n}\n\n// vectorsXXX parameters handler\nfunction vectorParams (options, input) {\n  if (!input && typeof options === 'string') {\n    options = { input: options }\n  }\n  options = options || {}\n  let params = Object.assign({}, defaultsVectorParams, options)\n  params.input = input || params.input\n  return params\n}\n\n// translate text line\nfunction translateLine (options, line) {\n  const { x, y } = Object.assign({ x: 0, y: 0 }, options || {})\n  let segments = line.segments\n  let segment = null\n  let point = null\n  for (let i = 0, il = segments.length; i < il; i++) {\n    segment = segments[i]\n    for (let j = 0, jl = segment.length; j < jl; j++) {\n      point = segment[j]\n      segment[j] = [point[0] + x, point[1] + y]\n    }\n  }\n  return line\n}\n\n/** Represents a character as segments\n* @typedef {Object} VectorCharObject\n* @property {Float} width - character width\n* @property {Float} height - character height (uppercase)\n* @property {Array} segments - character segments [[[x, y], ...], ...]\n*/\n\n/** Construct a {@link VectorCharObject} from a ascii character whose code is between 31 and 127,\n* if the character is not supported it is replaced by a question mark.\n* @param {Object|String} [options] - options for construction or ascii character\n* @param {Float} [options.xOffset=0] - x offset\n* @param {Float} [options.yOffset=0] - y offset\n* @param {Float} [options.height=21] - font size (uppercase height)\n* @param {Float} [options.extrudeOffset=0] - width of the extrusion that will be applied (manually) after the creation of the character\n* @param {String} [options.input='?'] - ascii character (ignored/overwrited if provided as seconds parameter)\n* @param {String} [char='?'] - ascii character\n* @returns {VectorCharObject}\n*\n* @example\n* let vectorCharObject = vectorChar()\n* or\n* let vectorCharObject = vectorChar('A')\n* or\n* let vectorCharObject = vectorChar({ xOffset: 57 }, 'C')\n* or\n* let vectorCharObject = vectorChar({ xOffset: 78, input: '!' })\n*/\nfunction vectorChar (options, char) {\n  let {\n    xOffset, yOffset, input, font, height, extrudeOffset\n  } = vectorParams(options, char)\n  let code = input.charCodeAt(0)\n  if (!code || !font[code]) {\n    code = 63 // 63 => ?\n  }\n  let glyph = [].concat(font[code])\n  let ratio = (height - extrudeOffset) / font.height\n  let extrudeYOffset = (extrudeOffset / 2)\n  let width = glyph.shift() * ratio\n  let segments = []\n  let polyline = []\n  for (let i = 0, il = glyph.length; i < il; i += 2) {\n    gx = ratio * glyph[i] + xOffset\n    gy = ratio * glyph[i + 1] + yOffset + extrudeYOffset\n    if (glyph[i] !== undefined) {\n      polyline.push([ gx, gy ])\n      continue\n    }\n    segments.push(polyline)\n    polyline = []\n    i--\n  }\n  if (polyline.length) {\n    segments.push(polyline)\n  }\n  return { width, height, segments }\n}\n\n/** Construct an array of character segments from a ascii string whose characters code is between 31 and 127,\n* if one character is not supported it is replaced by a question mark.\n* @param {Object|String} [options] - options for construction or ascii string\n* @param {Float} [options.xOffset=0] - x offset\n* @param {Float} [options.yOffset=0] - y offset\n* @param {Float} [options.height=21] - font size (uppercase height)\n* @param {Float} [options.lineSpacing=1.4] - line spacing expressed as a percentage of font size\n* @param {Float} [options.letterSpacing=1] - extra letter spacing expressed as a percentage of font size\n* @param {String} [options.align='left'] - multi-line text alignement: left, center or right\n* @param {Float} [options.extrudeOffset=0] - width of the extrusion that will be applied (manually) after the creation of the character\n* @param {String} [options.input='?'] - ascii string (ignored/overwrited if provided as seconds parameter)\n* @param {String} [text='?'] - ascii string\n* @returns {Array} characters segments [[[x, y], ...], ...]\n*\n* @example\n* let textSegments = vectorText()\n* or\n* let textSegments = vectorText('OpenJSCAD')\n* or\n* let textSegments = vectorText({ yOffset: -50 }, 'OpenJSCAD')\n* or\n* let textSegments = vectorText({ yOffset: -80, input: 'OpenJSCAD' })\n*/\nfunction vectorText (options, text) {\n  let {\n    xOffset, yOffset, input, font, height, align, extrudeOffset, lineSpacing, letterSpacing\n  } = vectorParams(options, text)\n  let [ x, y ] = [ xOffset, yOffset ]\n  let [ i, il, char, vect, width, diff ] = []\n  let line = { width: 0, segments: [] }\n  let lines = []\n  let output = []\n  let maxWidth = 0\n  let lineStart = x\n  const pushLine = () => {\n    lines.push(line)\n    maxWidth = Math.max(maxWidth, line.width)\n    line = { width: 0, segments: [] }\n  }\n  for (i = 0, il = input.length; i < il; i++) {\n    char = input[i]\n    vect = vectorChar({ xOffset: x, yOffset: y, font, height, extrudeOffset }, char)\n    if (char === '\\n') {\n      x = lineStart\n      y -= vect.height * lineSpacing\n      pushLine()\n      continue\n    }\n    width = vect.width * letterSpacing\n    line.width += width\n    x += width\n    if (char !== ' ') {\n      line.segments = line.segments.concat(vect.segments)\n    }\n  }\n  if (line.segments.length) {\n    pushLine()\n  }\n  for (i = 0, il = lines.length; i < il; i++) {\n    line = lines[i]\n    if (maxWidth > line.width) {\n      diff = maxWidth - line.width\n      if (align === 'right') {\n        line = translateLine({ x: diff }, line)\n      } else if (align === 'center') {\n        line = translateLine({ x: diff / 2 }, line)\n      }\n    }\n    output = output.concat(line.segments)\n  }\n  return output\n}\n\n/** Construct a {@link VectorCharObject} from a ascii character whose code is between 31 and 127,\n* if the character is not supported it is replaced by a question mark.\n* @param {Float} x - x offset\n* @param {Float} y - y offset\n* @param {String} char - ascii character\n* @returns {VectorCharObject}\n* @deprecated >= v2\n\n* @example\n* let vectorCharObject = vector_char(36, 0, 'B')\n*/\nfunction vector_char (x, y, char) {\n  return vectorChar({ xOffset: x, yOffset: y }, char)\n}\n\n/** Construct an array of character segments from a ascii string whose characters code is between 31 and 127,\n* if one character is not supported it is replaced by a question mark.\n* @param {Float} x - x offset\n* @param {Float} y - y offset\n* @param {String} text - ascii string\n* @returns {Array} characters segments [[[x, y], ...], ...]\n* @deprecated >= v2\n*\n* @example\n* let textSegments = vector_text(0, -20, 'OpenJSCAD')\n*/\nfunction vector_text (x, y, text) {\n  return vectorText({ xOffset: x, yOffset: y }, text)\n}\n\nmodule.exports = {\n  vector_char,\n  vector_text,\n  vectorChar,\n  vectorText\n}\n\n},{\"../fonts/single-line/hershey/simplex.js\":81,\"./ops-booleans\":32}],45:[function(require,module,exports){\nconst {Connector} = require('./connectors')\nconst Vertex3D = require('./math/Vertex3')\nconst Vector2D = require('./math/Vector2')\nconst Vector3D = require('./math/Vector3')\nconst Polygon = require('./math/Polygon3')\n\nconst {fromPolygons} = require('./CSGFactories')\nconst {fromSides, fromFakeCSG} = require('./CAGFactories')\n\nconst canonicalize = require('./utils/canonicalize')\nconst retesselate = require('./utils/retesellate')\nconst {isCAGValid, isSelfIntersecting, hasPointInside} = require('./utils/cagValidation')\nconst {area, getBounds} = require('./utils/cagMeasurements')\n\n// all of these are good candidates for elimination in this scope, since they are part of a functional api\nconst {overCutInsideCorners} = require('../api/ops-cnc')\nconst {extrudeInOrthonormalBasis, extrudeInPlane, extrude, rotateExtrude} = require('../api/ops-extrusions')\nconst cagoutlinePaths = require('../api/cagOutlinePaths')\nconst center = require('../api/center')\nconst {expand, contract, expandedShellOfCAG} = require('../api/ops-expandContract')\n/**\n * Class CAG\n * Holds a solid area geometry like CSG but 2D.\n * Each area consists of a number of sides.\n * Each side is a line between 2 points.\n * @constructor\n */\nlet CAG = function () {\n  this.sides = []\n  this.isCanonicalized = false\n}\n\nCAG.prototype = {\n  union: function (cag) {\n    let cags\n    if (cag instanceof Array) {\n      cags = cag\n    } else {\n      cags = [cag]\n    }\n    let r = this._toCSGWall(-1, 1)\n    r = r.union(\n            cags.map(function (cag) {\n              return cag._toCSGWall(-1, 1).reTesselated()\n            }), false, false)\n    return fromFakeCSG(r).canonicalized()\n  },\n\n  subtract: function (cag) {\n    let cags\n    if (cag instanceof Array) {\n      cags = cag\n    } else {\n      cags = [cag]\n    }\n    let r = this._toCSGWall(-1, 1)\n    cags.map(function (cag) {\n      r = r.subtractSub(cag._toCSGWall(-1, 1), false, false)\n    })\n    r = r.reTesselated()\n    r = r.canonicalized()\n    r = fromFakeCSG(r)\n    r = r.canonicalized()\n    return r\n  },\n\n  intersect: function (cag) {\n    let cags\n    if (cag instanceof Array) {\n      cags = cag\n    } else {\n      cags = [cag]\n    }\n    let r = this._toCSGWall(-1, 1)\n    cags.map(function (cag) {\n      r = r.intersectSub(cag._toCSGWall(-1, 1), false, false)\n    })\n    r = r.reTesselated()\n    r = r.canonicalized()\n    r = fromFakeCSG(r)\n    r = r.canonicalized()\n    return r\n  },\n\n  transform: function (matrix4x4) {\n    let ismirror = matrix4x4.isMirroring()\n    let newsides = this.sides.map(function (side) {\n      return side.transform(matrix4x4)\n    })\n    let result = fromSides(newsides)\n    if (ismirror) {\n      result = result.flipped()\n    }\n    return result\n  },\n\n  flipped: function () {\n    let newsides = this.sides.map(function (side) {\n      return side.flipped()\n    })\n    newsides.reverse()\n    return fromSides(newsides)\n  },\n\n  // ALIAS !\n  center: function (axes) {\n    return center({axes: axes}, [this])\n  },\n\n  // ALIAS !\n  expandedShell: function (radius, resolution) {\n    return expandedShellOfCAG(this, radius, resolution)\n  },\n\n  // ALIAS !\n  expand: function (radius, resolution) {\n    return expand(this, radius, resolution)\n  },\n\n  contract: function (radius, resolution) {\n    return contract(this, radius, resolution)\n  },\n\n  // ALIAS !\n  area: function () {\n    return area(this)\n  },\n\n  // ALIAS !\n  getBounds: function () {\n    return getBounds(this)\n  },\n  // ALIAS !\n  isSelfIntersecting: function (debug) {\n    return isSelfIntersecting(this, debug)\n  },\n  // extrusion: all aliases to simple functions\n  extrudeInOrthonormalBasis: function (orthonormalbasis, depth, options) {\n    return extrudeInOrthonormalBasis(this, orthonormalbasis, depth, options)\n  },\n\n  // ALIAS !\n  extrudeInPlane: function (axis1, axis2, depth, options) {\n    return extrudeInPlane(this, axis1, axis2, depth, options)\n  },\n\n  // ALIAS !\n  extrude: function (options) {\n    return extrude(this, options)\n  },\n\n  // ALIAS !\n  rotateExtrude: function (options) { // FIXME options should be optional\n    return rotateExtrude(this, options)\n  },\n\n  // ALIAS !\n  check: function () {\n    return isCAGValid(this)\n  },\n\n  // ALIAS !\n  canonicalized: function () {\n    return canonicalize(this)\n  },\n\n  // ALIAS !\n  reTesselated: function () {\n    return retesselate(this)\n  },\n\n  // ALIAS !\n  getOutlinePaths: function () {\n    return cagoutlinePaths(this)\n  },\n\n  // ALIAS !\n  overCutInsideCorners: function (cutterradius) {\n    return overCutInsideCorners(this, cutterradius)\n  },\n\n  // ALIAS !\n  hasPointInside: function (point) {\n    return hasPointInside(this, point)\n  },\n\n  // All the toXXX functions\n  toString: function () {\n    let result = 'CAG (' + this.sides.length + ' sides):\\n'\n    this.sides.map(function (side) {\n      result += '  ' + side.toString() + '\\n'\n    })\n    return result\n  },\n\n  _toCSGWall: function (z0, z1) {\n    let polygons = this.sides.map(function (side) {\n      return side.toPolygon3D(z0, z1)\n    })\n    return fromPolygons(polygons)\n  },\n\n  _toVector3DPairs: function (m) {\n        // transform m\n    let pairs = this.sides.map(function (side) {\n      let p0 = side.vertex0.pos\n      let p1 = side.vertex1.pos\n      return [Vector3D.Create(p0.x, p0.y, 0),\n        Vector3D.Create(p1.x, p1.y, 0)]\n    })\n    if (typeof m !== 'undefined') {\n      pairs = pairs.map(function (pair) {\n        return pair.map(function (v) {\n          return v.transform(m)\n        })\n      })\n    }\n    return pairs\n  },\n\n  /*\n    * transform a cag into the polygons of a corresponding 3d plane, positioned per options\n    * Accepts a connector for plane positioning, or optionally\n    * single translation, axisVector, normalVector arguments\n    * (toConnector has precedence over single arguments if provided)\n    */\n  _toPlanePolygons: function (options) {\n    const defaults = {\n      flipped: false\n    }\n    options = Object.assign({}, defaults, options)\n    let {flipped} = options\n    // reference connector for transformation\n    let origin = [0, 0, 0]\n    let defaultAxis = [0, 0, 1]\n    let defaultNormal = [0, 1, 0]\n    let thisConnector = new Connector(origin, defaultAxis, defaultNormal)\n    // translated connector per options\n    let translation = options.translation || origin\n    let axisVector = options.axisVector || defaultAxis\n    let normalVector = options.normalVector || defaultNormal\n    // will override above if options has toConnector\n    let toConnector = options.toConnector ||\n            new Connector(translation, axisVector, normalVector)\n    // resulting transform\n    let m = thisConnector.getTransformationTo(toConnector, false, 0)\n    // create plane as a (partial non-closed) CSG in XY plane\n    let bounds = this.getBounds()\n    bounds[0] = bounds[0].minus(new Vector2D(1, 1))\n    bounds[1] = bounds[1].plus(new Vector2D(1, 1))\n    let csgshell = this._toCSGWall(-1, 1)\n    let csgplane = fromPolygons([new Polygon([\n      new Vertex3D(new Vector3D(bounds[0].x, bounds[0].y, 0)),\n      new Vertex3D(new Vector3D(bounds[1].x, bounds[0].y, 0)),\n      new Vertex3D(new Vector3D(bounds[1].x, bounds[1].y, 0)),\n      new Vertex3D(new Vector3D(bounds[0].x, bounds[1].y, 0))\n    ])])\n    if (flipped) {\n      csgplane = csgplane.invert()\n    }\n    // intersectSub -> prevent premature retesselate/canonicalize\n    csgplane = csgplane.intersectSub(csgshell)\n    // only keep the polygons in the z plane:\n    let polys = csgplane.polygons.filter(function (polygon) {\n      return Math.abs(polygon.plane.normal.z) > 0.99\n    })\n    // finally, position the plane per passed transformations\n    return polys.map(function (poly) {\n      return poly.transform(m)\n    })\n  },\n\n  /*\n    * given 2 connectors, this returns all polygons of a \"wall\" between 2\n    * copies of this cag, positioned in 3d space as \"bottom\" and\n    * \"top\" plane per connectors toConnector1, and toConnector2, respectively\n    */\n  _toWallPolygons: function (options) {\n        // normals are going to be correct as long as toConn2.point - toConn1.point\n        // points into cag normal direction (check in caller)\n        // arguments: options.toConnector1, options.toConnector2, options.cag\n        //     walls go from toConnector1 to toConnector2\n        //     optionally, target cag to point to - cag needs to have same number of sides as this!\n    let origin = [0, 0, 0]\n    let defaultAxis = [0, 0, 1]\n    let defaultNormal = [0, 1, 0]\n    let thisConnector = new Connector(origin, defaultAxis, defaultNormal)\n        // arguments:\n    let toConnector1 = options.toConnector1\n        // let toConnector2 = new Connector([0, 0, -30], defaultAxis, defaultNormal);\n    let toConnector2 = options.toConnector2\n    if (!(toConnector1 instanceof Connector && toConnector2 instanceof Connector)) {\n      throw new Error('could not parse Connector arguments toConnector1 or toConnector2')\n    }\n    if (options.cag) {\n      if (options.cag.sides.length !== this.sides.length) {\n        throw new Error('target cag needs same sides count as start cag')\n      }\n    }\n        // target cag is same as this unless specified\n    let toCag = options.cag || this\n    let m1 = thisConnector.getTransformationTo(toConnector1, false, 0)\n    let m2 = thisConnector.getTransformationTo(toConnector2, false, 0)\n    let vps1 = this._toVector3DPairs(m1)\n    let vps2 = toCag._toVector3DPairs(m2)\n\n    let polygons = []\n    vps1.forEach(function (vp1, i) {\n      polygons.push(new Polygon([\n        new Vertex3D(vps2[i][1]), new Vertex3D(vps2[i][0]), new Vertex3D(vp1[0])]))\n      polygons.push(new Polygon([\n        new Vertex3D(vps2[i][1]), new Vertex3D(vp1[0]), new Vertex3D(vp1[1])]))\n    })\n    return polygons\n  },\n\n    /**\n     * Convert to a list of points.\n     * @return {points[]} list of points in 2D space\n     */\n  toPoints: function () {\n    let points = this.sides.map(function (side) {\n      let v0 = side.vertex0\n      // let v1 = side.vertex1\n      return v0.pos\n    })\n    // due to the logic of fromPoints()\n    // move the first point to the last\n    if (points.length > 0) {\n      points.push(points.shift())\n    }\n    return points\n  },\n\n    /** Convert to compact binary form.\n   * See fromCompactBinary.\n   * @return {CompactBinary}\n   */\n  toCompactBinary: function () {\n    let cag = this.canonicalized()\n    let numsides = cag.sides.length\n    let vertexmap = {}\n    let vertices = []\n    let numvertices = 0\n    let sideVertexIndices = new Uint32Array(2 * numsides)\n    let sidevertexindicesindex = 0\n    cag.sides.map(function (side) {\n      [side.vertex0, side.vertex1].map(function (v) {\n        let vertextag = v.getTag()\n        let vertexindex\n        if (!(vertextag in vertexmap)) {\n          vertexindex = numvertices++\n          vertexmap[vertextag] = vertexindex\n          vertices.push(v)\n        } else {\n          vertexindex = vertexmap[vertextag]\n        }\n        sideVertexIndices[sidevertexindicesindex++] = vertexindex\n      })\n    })\n    let vertexData = new Float64Array(numvertices * 2)\n    let verticesArrayIndex = 0\n    vertices.map(function (v) {\n      let pos = v.pos\n      vertexData[verticesArrayIndex++] = pos._x\n      vertexData[verticesArrayIndex++] = pos._y\n    })\n    let result = {\n      'class': 'CAG',\n      sideVertexIndices: sideVertexIndices,\n      vertexData: vertexData\n    }\n    return result\n  }\n}\n\nmodule.exports = CAG\n\n},{\"../api/cagOutlinePaths\":23,\"../api/center\":24,\"../api/ops-cnc\":33,\"../api/ops-expandContract\":35,\"../api/ops-extrusions\":36,\"./CAGFactories\":46,\"./CSGFactories\":48,\"./connectors\":53,\"./math/Polygon3\":62,\"./math/Vector2\":64,\"./math/Vector3\":65,\"./math/Vertex3\":67,\"./utils/cagMeasurements\":73,\"./utils/cagValidation\":74,\"./utils/canonicalize\":75,\"./utils/retesellate\":79}],46:[function(require,module,exports){\nconst Side = require('./math/Side')\nconst Vector2D = require('./math/Vector2')\nconst Vertex2 = require('./math/Vertex2')\nconst {areaEPS} = require('./constants')\nconst {isSelfIntersecting, contains} = require('./utils/cagValidation')\nconst {union, difference} = require('../api/ops-booleans')\n\n/** Construct a CAG from a list of `Side` instances.\n * @param {Side[]} sides - list of sides\n * @returns {CAG} new CAG object\n */\nconst fromSides = function (sides) {\n  const CAG = require('./CAG') // circular dependency CAG => fromSides => CAG\n  let cag = new CAG()\n  cag.sides = sides\n  return cag\n}\n\n// Converts a CSG to a  The CSG must consist of polygons with only z coordinates +1 and -1\n// as constructed by _toCSGWall(-1, 1). This is so we can use the 3D union(), intersect() etc\nconst fromFakeCSG = function (csg) {\n  let sides = csg.polygons.map(function (p) {\n    return Side._fromFakePolygon(p)\n  })\n  .filter(function (s) {\n    return s !== null\n  })\n  return fromSides(sides)\n}\n\n/** Construct a CAG from a list of points (a polygon) or an nested array of points.\n * The rotation direction of the points is not relevant.\n * The points can define a convex or a concave polygon.\n * The polygon must not self intersect.\n * Hole detection follows the even/odd rule,\n * which means that the order of the paths is not important.\n * @param {points[]|Array.<points[]>} points - (nested) list of points in 2D space\n * @returns {CAG} new CAG object\n */\nconst fromPoints = function (points) {\n  if (!points) {\n    throw new Error('points parameter must be defined')\n  }\n  if (!Array.isArray(points)) {\n    throw new Error('points parameter must be an array')\n  }\n  if (points[0].x !== undefined || typeof points[0][0] === 'number') {\n    return fromPointsArray(points)\n  }\n  if (typeof points[0][0] === 'object') {\n    return fromNestedPointsArray(points)\n  }\n  throw new Error('Unsupported points list format')\n}\n\n// Do not export the two following function (code splitting for fromPoints())\nconst fromPointsArray = function (points) {\n  if (points.length < 3) {\n    throw new Error('CAG shape needs at least 3 points')\n  }\n  let sides = []\n  let prevvertex = new Vertex2(new Vector2D(points[points.length - 1]))\n  points.map(function (point) {\n    let vertex = new Vertex2(new Vector2D(point))\n    sides.push(new Side(prevvertex, vertex))\n    prevvertex = vertex\n  })\n  let result = fromSides(sides)\n  if (isSelfIntersecting(result)) {\n    throw new Error('Polygon is self intersecting!')\n  }\n  let area = result.area()\n  if (Math.abs(area) < areaEPS) {\n    throw new Error('Degenerate polygon!')\n  }\n  if (area < 0) {\n    result = result.flipped()\n  }\n  return result.canonicalized()\n}\n\nconst fromNestedPointsArray = function (points) {\n  if (points.length === 1) {\n    return fromPoints(points[0])\n  }\n  // First pass: create a collection of CAG paths\n  let paths = []\n  points.forEach(path => {\n    paths.push(fromPointsArray(path))\n  })\n  // Second pass: make a tree of paths\n  let tree = {}\n    // for each polygon extract parents and childs polygons\n  paths.forEach((p1, i) => {\n    // check for intersection\n    paths.forEach((p2, y) => {\n      if (p1 !== p2) {\n        // create default node\n        tree[i] || (tree[i] = { parents: [], isHole: false })\n        tree[y] || (tree[y] = { parents: [], isHole: false })\n        // check if polygon2 stay in poylgon1\n        if (contains(p2, p1)) {\n          // push parent and child; odd parents number ==> hole\n          tree[i].parents.push(y)\n          tree[i].isHole = !! (tree[i].parents.length % 2)\n          tree[y].isHole = !! (tree[y].parents.length % 2)\n        }\n      }\n    })\n  })\n  // Third pass: subtract holes\n  let path = null\n  for (key in tree) {\n    path = tree[key]\n    if (path.isHole) {\n      delete tree[key] // remove holes for final pass\n      path.parents.forEach(parentKey => {\n        paths[parentKey] = difference(paths[parentKey], paths[key])\n      })\n    }\n  }\n  // Fourth and last pass: create final CAG object\n  let cag = fromSides([])\n  for (key in tree) {\n    cag = union(cag, paths[key])\n  }\n  return cag\n}\n\n/** Reconstruct a CAG from an object with identical property names.\n * @param {Object} obj - anonymous object, typically from JSON\n * @returns {CAG} new CAG object\n */\nconst fromObject = function (obj) {\n  let sides = obj.sides.map(function (s) {\n    return Side.fromObject(s)\n  })\n  let cag = fromSides(sides)\n  cag.isCanonicalized = obj.isCanonicalized\n  return cag\n}\n\n/** Construct a CAG from a list of points (a polygon).\n * Like fromPoints() but does not check if the result is a valid polygon.\n * The points MUST rotate counter clockwise.\n * The points can define a convex or a concave polygon.\n * The polygon must not self intersect.\n * @param {points[]} points - list of points in 2D space\n * @returns {CAG} new CAG object\n */\nconst fromPointsNoCheck = function (points) {\n  let sides = []\n  let prevpoint = new Vector2D(points[points.length - 1])\n  let prevvertex = new Vertex2(prevpoint)\n  points.map(function (p) {\n    let point = new Vector2D(p)\n    let vertex = new Vertex2(point)\n    let side = new Side(prevvertex, vertex)\n    sides.push(side)\n    prevvertex = vertex\n  })\n  return fromSides(sides)\n}\n\n/** Construct a CAG from a 2d-path (a closed sequence of points).\n * Like fromPoints() but does not check if the result is a valid polygon.\n * @param {path} Path2 - a Path2 path\n * @returns {CAG} new CAG object\n */\nconst fromPath2 = function (path) {\n  if (!path.isClosed()) throw new Error('The path should be closed!')\n  return fromPoints(path.getPoints())\n}\n\n/** Reconstruct a CAG from the output of toCompactBinary().\n * @param {CompactBinary} bin - see toCompactBinary()\n * @returns {CAG} new CAG object\n */\nconst fromCompactBinary = function (bin) {\n  if (bin['class'] !== 'CAG') throw new Error('Not a CAG')\n  let vertices = []\n  let vertexData = bin.vertexData\n  let numvertices = vertexData.length / 2\n  let arrayindex = 0\n  for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n    let x = vertexData[arrayindex++]\n    let y = vertexData[arrayindex++]\n    let pos = new Vector2D(x, y)\n    let vertex = new Vertex2(pos)\n    vertices.push(vertex)\n  }\n  let sides = []\n  let numsides = bin.sideVertexIndices.length / 2\n  arrayindex = 0\n  for (let sideindex = 0; sideindex < numsides; sideindex++) {\n    let vertexindex0 = bin.sideVertexIndices[arrayindex++]\n    let vertexindex1 = bin.sideVertexIndices[arrayindex++]\n    let side = new Side(vertices[vertexindex0], vertices[vertexindex1])\n    sides.push(side)\n  }\n  let cag = fromSides(sides)\n  cag.isCanonicalized = true\n  return cag\n}\n\nmodule.exports = {\n  fromSides,\n  fromObject,\n  fromPoints,\n  fromPointsNoCheck,\n  fromPath2,\n  fromFakeCSG,\n  fromCompactBinary\n}\n\n},{\"../api/ops-booleans\":32,\"./CAG\":45,\"./constants\":54,\"./math/Side\":63,\"./math/Vector2\":64,\"./math/Vertex2\":66,\"./utils/cagValidation\":74}],47:[function(require,module,exports){\nconst Tree = require('./trees')\nconst Polygon = require('./math/Polygon3')\nconst Plane = require('./math/Plane')\nconst OrthoNormalBasis = require('./math/OrthoNormalBasis')\n\nconst CAG = require('./CAG') // FIXME: for some weird reason if CAG is imported AFTER frompolygons, a lot of things break???\n\nconst Properties = require('./Properties')\nconst {fromPolygons} = require('./CSGFactories') // FIXME: circular dependency !\n\nconst fixTJunctions = require('./utils/fixTJunctions')\nconst canonicalize = require('./utils/canonicalize')\nconst retesselate = require('./utils/retesellate')\nconst {bounds} = require('./utils/csgMeasurements')\nconst {projectToOrthoNormalBasis} = require('./utils/csgProjections')\n\nconst {lieFlat, getTransformationToFlatLying, getTransformationAndInverseTransformationToFlatLying} = require('../api/ops-cnc')\nconst {sectionCut, cutByPlane} = require('../api/ops-cuts')\nconst center = require('../api/center')\nconst {expand, contract, expandedShellOfCCSG} = require('../api/ops-expandContract')\n\n/** Class CSG\n * Holds a binary space partition tree representing a 3D solid. Two solids can\n * be combined using the `union()`, `subtract()`, and `intersect()` methods.\n * @constructor\n */\nlet CSG = function () {\n  this.polygons = []\n  this.properties = new Properties()\n  this.isCanonicalized = true\n  this.isRetesselated = true\n}\n\nCSG.prototype = {\n  /**\n   * Return a new CSG solid representing the space in either this solid or\n   * in the given solids. Neither this solid nor the given solids are modified.\n   * @param {CSG[]} csg - list of CSG objects\n   * @returns {CSG} new CSG object\n   * @example\n   * let C = A.union(B)\n   * @example\n   * +-------+            +-------+\n   * |       |            |       |\n   * |   A   |            |       |\n   * |    +--+----+   =   |       +----+\n   * +----+--+    |       +----+       |\n   *      |   B   |            |       |\n   *      |       |            |       |\n   *      +-------+            +-------+\n   */\n  union: function (csg) {\n    let csgs\n    if (csg instanceof Array) {\n      csgs = csg.slice(0)\n      csgs.push(this)\n    } else {\n      csgs = [this, csg]\n    }\n\n    let i\n    // combine csg pairs in a way that forms a balanced binary tree pattern\n    for (i = 1; i < csgs.length; i += 2) {\n      csgs.push(csgs[i - 1].unionSub(csgs[i]))\n    }\n    return csgs[i - 1].reTesselated().canonicalized()\n  },\n\n  unionSub: function (csg, retesselate, canonicalize) {\n    if (!this.mayOverlap(csg)) {\n      return this.unionForNonIntersecting(csg)\n    } else {\n      let a = new Tree(this.polygons)\n      let b = new Tree(csg.polygons)\n      a.clipTo(b, false)\n\n            // b.clipTo(a, true); // ERROR: this doesn't work\n      b.clipTo(a)\n      b.invert()\n      b.clipTo(a)\n      b.invert()\n\n      let newpolygons = a.allPolygons().concat(b.allPolygons())\n      let result = fromPolygons(newpolygons)\n      result.properties = this.properties._merge(csg.properties)\n      if (retesselate) result = result.reTesselated()\n      if (canonicalize) result = result.canonicalized()\n      return result\n    }\n  },\n\n  // Like union, but when we know that the two solids are not intersecting\n  // Do not use if you are not completely sure that the solids do not intersect!\n  unionForNonIntersecting: function (csg) {\n    let newpolygons = this.polygons.concat(csg.polygons)\n    let result = fromPolygons(newpolygons)\n    result.properties = this.properties._merge(csg.properties)\n    result.isCanonicalized = this.isCanonicalized && csg.isCanonicalized\n    result.isRetesselated = this.isRetesselated && csg.isRetesselated\n    return result\n  },\n\n  /**\n   * Return a new CSG solid representing space in this solid but\n   * not in the given solids. Neither this solid nor the given solids are modified.\n   * @param {CSG[]} csg - list of CSG objects\n   * @returns {CSG} new CSG object\n   * @example\n   * let C = A.subtract(B)\n   * @example\n   * +-------+            +-------+\n   * |       |            |       |\n   * |   A   |            |       |\n   * |    +--+----+   =   |    +--+\n   * +----+--+    |       +----+\n   *      |   B   |\n   *      |       |\n   *      +-------+\n   */\n  subtract: function (csg) {\n    let csgs\n    if (csg instanceof Array) {\n      csgs = csg\n    } else {\n      csgs = [csg]\n    }\n    let result = this\n    for (let i = 0; i < csgs.length; i++) {\n      let islast = (i === (csgs.length - 1))\n      result = result.subtractSub(csgs[i], islast, islast)\n    }\n    return result\n  },\n\n  subtractSub: function (csg, retesselate, canonicalize) {\n    let a = new Tree(this.polygons)\n    let b = new Tree(csg.polygons)\n    a.invert()\n    a.clipTo(b)\n    b.clipTo(a, true)\n    a.addPolygons(b.allPolygons())\n    a.invert()\n    let result = fromPolygons(a.allPolygons())\n    result.properties = this.properties._merge(csg.properties)\n    if (retesselate) result = result.reTesselated()\n    if (canonicalize) result = result.canonicalized()\n    return result\n  },\n\n  /**\n   * Return a new CSG solid representing space in both this solid and\n   * in the given solids. Neither this solid nor the given solids are modified.\n   * @param {CSG[]} csg - list of CSG objects\n   * @returns {CSG} new CSG object\n   * @example\n   * let C = A.intersect(B)\n   * @example\n   * +-------+\n   * |       |\n   * |   A   |\n   * |    +--+----+   =   +--+\n   * +----+--+    |       +--+\n   *      |   B   |\n   *      |       |\n   *      +-------+\n   */\n  intersect: function (csg) {\n    let csgs\n    if (csg instanceof Array) {\n      csgs = csg\n    } else {\n      csgs = [csg]\n    }\n    let result = this\n    for (let i = 0; i < csgs.length; i++) {\n      let islast = (i === (csgs.length - 1))\n      result = result.intersectSub(csgs[i], islast, islast)\n    }\n    return result\n  },\n\n  intersectSub: function (csg, retesselate, canonicalize) {\n    let a = new Tree(this.polygons)\n    let b = new Tree(csg.polygons)\n    a.invert()\n    b.clipTo(a)\n    b.invert()\n    a.clipTo(b)\n    b.clipTo(a)\n    a.addPolygons(b.allPolygons())\n    a.invert()\n    let result = fromPolygons(a.allPolygons())\n    result.properties = this.properties._merge(csg.properties)\n    if (retesselate) result = result.reTesselated()\n    if (canonicalize) result = result.canonicalized()\n    return result\n  },\n\n  /**\n   * Return a new CSG solid with solid and empty space switched.\n   * This solid is not modified.\n   * @returns {CSG} new CSG object\n   * @example\n   * let B = A.invert()\n   */\n  invert: function () {\n    let flippedpolygons = this.polygons.map(function (p) {\n      return p.flipped()\n    })\n    return fromPolygons(flippedpolygons)\n    // TODO: flip properties?\n  },\n\n  // Affine transformation of CSG object. Returns a new CSG object\n  transform1: function (matrix4x4) {\n    let newpolygons = this.polygons.map(function (p) {\n      return p.transform(matrix4x4)\n    })\n    let result = fromPolygons(newpolygons)\n    result.properties = this.properties._transform(matrix4x4)\n    result.isRetesselated = this.isRetesselated\n    return result\n  },\n\n  /**\n   * Return a new CSG solid that is transformed using the given Matrix.\n   * Several matrix transformations can be combined before transforming this solid.\n   * @param {CSG.Matrix4x4} matrix4x4 - matrix to be applied\n   * @returns {CSG} new CSG object\n   * @example\n   * var m = new CSG.Matrix4x4()\n   * m = m.multiply(CSG.Matrix4x4.rotationX(40))\n   * m = m.multiply(CSG.Matrix4x4.translation([-.5, 0, 0]))\n   * let B = A.transform(m)\n   */\n  transform: function (matrix4x4) {\n    let ismirror = matrix4x4.isMirroring()\n    let transformedvertices = {}\n    let transformedplanes = {}\n    let newpolygons = this.polygons.map(function (p) {\n      let newplane\n      let plane = p.plane\n      let planetag = plane.getTag()\n      if (planetag in transformedplanes) {\n        newplane = transformedplanes[planetag]\n      } else {\n        newplane = plane.transform(matrix4x4)\n        transformedplanes[planetag] = newplane\n      }\n      let newvertices = p.vertices.map(function (v) {\n        let newvertex\n        let vertextag = v.getTag()\n        if (vertextag in transformedvertices) {\n          newvertex = transformedvertices[vertextag]\n        } else {\n          newvertex = v.transform(matrix4x4)\n          transformedvertices[vertextag] = newvertex\n        }\n        return newvertex\n      })\n      if (ismirror) newvertices.reverse()\n      return new Polygon(newvertices, p.shared, newplane)\n    })\n    let result = fromPolygons(newpolygons)\n    result.properties = this.properties._transform(matrix4x4)\n    result.isRetesselated = this.isRetesselated\n    result.isCanonicalized = this.isCanonicalized\n    return result\n  },\n\n  // ALIAS !\n  center: function (axes) {\n    return center({axes: axes},[this])\n  },\n\n  // ALIAS !\n  expand: function (radius, resolution) {\n    return expand(this, radius, resolution)\n  },\n\n  // ALIAS !\n  contract: function (radius, resolution) {\n    return contract(this, radius, resolution)\n  },\n\n  // ALIAS !\n  expandedShell: function (radius, resolution, unionWithThis) {\n    return expandedShellOfCCSG(this, radius, resolution, unionWithThis)\n  },\n\n  // cut the solid at a plane, and stretch the cross-section found along plane normal\n  // note: only used in roundedCube() internally\n  stretchAtPlane: function (normal, point, length) {\n    let plane = Plane.fromNormalAndPoint(normal, point)\n    let onb = new OrthoNormalBasis(plane)\n    let crosssect = this.sectionCut(onb)\n    let midpiece = crosssect.extrudeInOrthonormalBasis(onb, length)\n    let piece1 = this.cutByPlane(plane)\n    let piece2 = this.cutByPlane(plane.flipped())\n    let result = piece1.union([midpiece, piece2.translate(plane.normal.times(length))])\n    return result\n  },\n\n  // ALIAS !\n  canonicalized: function () {\n    return canonicalize(this)\n  },\n\n  // ALIAS !\n  reTesselated: function () {\n    return retesselate(this)\n  },\n\n  // ALIAS !\n  fixTJunctions: function () {\n    return fixTJunctions(fromPolygons, this)\n  },\n\n  // ALIAS !\n  getBounds: function () {\n    return bounds(this)\n  },\n\n  /** returns true if there is a possibility that the two solids overlap\n   * returns false if we can be sure that they do not overlap\n   * NOTE: this is critical as it is used in UNIONs\n   * @param  {CSG} csg\n   */\n  mayOverlap: function (csg) {\n    if ((this.polygons.length === 0) || (csg.polygons.length === 0)) {\n      return false\n    } else {\n      let mybounds = bounds(this)\n      let otherbounds = bounds(csg)\n      if (mybounds[1].x < otherbounds[0].x) return false\n      if (mybounds[0].x > otherbounds[1].x) return false\n      if (mybounds[1].y < otherbounds[0].y) return false\n      if (mybounds[0].y > otherbounds[1].y) return false\n      if (mybounds[1].z < otherbounds[0].z) return false\n      if (mybounds[0].z > otherbounds[1].z) return false\n      return true\n    }\n  },\n\n  // ALIAS !\n  cutByPlane: function (plane) {\n    return cutByPlane(this, plane)\n  },\n\n  /**\n   * Connect a solid to another solid, such that two Connectors become connected\n   * @param  {Connector} myConnector a Connector of this solid\n   * @param  {Connector} otherConnector a Connector to which myConnector should be connected\n   * @param  {Boolean} mirror false: the 'axis' vectors of the connectors should point in the same direction\n   * true: the 'axis' vectors of the connectors should point in opposite direction\n   * @param  {Float} normalrotation degrees of rotation between the 'normal' vectors of the two\n   * connectors\n   * @returns {CSG} this csg, tranformed accordingly\n   */\n  connectTo: function (myConnector, otherConnector, mirror, normalrotation) {\n    let matrix = myConnector.getTransformationTo(otherConnector, mirror, normalrotation)\n    return this.transform(matrix)\n  },\n\n  /**\n   * set the .shared property of all polygons\n   * @param  {Object} shared\n   * @returns {CSG} Returns a new CSG solid, the original is unmodified!\n   */\n  setShared: function (shared) {\n    let polygons = this.polygons.map(function (p) {\n      return new Polygon(p.vertices, shared, p.plane)\n    })\n    let result = fromPolygons(polygons)\n    result.properties = this.properties // keep original properties\n    result.isRetesselated = this.isRetesselated\n    result.isCanonicalized = this.isCanonicalized\n    return result\n  },\n\n  /** sets the color of this csg: non mutating, returns a new CSG\n   * @param  {Object} args\n   * @returns {CSG} a copy of this CSG, with the given color\n   */\n  setColor: function (args) {\n    let newshared = Polygon.Shared.fromColor.apply(this, arguments)\n    return this.setShared(newshared)\n  },\n\n  // ALIAS !\n  getTransformationAndInverseTransformationToFlatLying: function () {\n    return getTransformationAndInverseTransformationToFlatLying(this)\n  },\n\n  // ALIAS !\n  getTransformationToFlatLying: function () {\n    return getTransformationToFlatLying(this)\n  },\n\n  // ALIAS !\n  lieFlat: function () {\n    return lieFlat(this)\n  },\n\n  // project the 3D CSG onto a plane\n  // This returns a 2D CAG with the 'shadow' shape of the 3D solid when projected onto the\n  // plane represented by the orthonormal basis\n  projectToOrthoNormalBasis: function (orthobasis) {\n    // FIXME:  DEPENDS ON CAG !!\n    return projectToOrthoNormalBasis(this, orthobasis)\n  },\n\n  // FIXME: not finding any uses within our code ?\n  sectionCut: function (orthobasis) {\n    return sectionCut(this, orthobasis)\n  },\n\n  /**\n   * Returns an array of values for the requested features of this solid.\n   * Supported Features: 'volume', 'area'\n   * @param {String[]} features - list of features to calculate\n   * @returns {Float[]} values\n   * @example\n   * let volume = A.getFeatures('volume')\n   * let values = A.getFeatures('area','volume')\n   */\n  getFeatures: function (features) {\n    if (!(features instanceof Array)) {\n      features = [features]\n    }\n    let result = this.toTriangles().map(function (triPoly) {\n      return triPoly.getTetraFeatures(features)\n    })\n    .reduce(function (pv, v) {\n      return v.map(function (feat, i) {\n        return feat + (pv === 0 ? 0 : pv[i])\n      })\n    }, 0)\n    return (result.length === 1) ? result[0] : result\n  },\n  /** @return {Polygon[]} The list of polygons. */\n  toPolygons: function () {\n    return this.polygons\n  },\n\n  toString: function () {\n    let result = 'CSG solid:\\n'\n    this.polygons.map(function (p) {\n      result += p.toString()\n    })\n    return result\n  },\n\n  /** returns a compact binary representation of this csg\n   * usually used to transfer CSG objects to/from webworkes\n   * NOTE: very interesting compact format, with a lot of reusable ideas\n   * @returns {Object} compact binary representation of a CSG\n   */\n  toCompactBinary: function () {\n    let csg = this.canonicalized()\n    let numpolygons = csg.polygons.length\n    let numpolygonvertices = 0\n\n    let numvertices = 0\n    let vertexmap = {}\n    let vertices = []\n\n    let numplanes = 0\n    let planemap = {}\n    let planes = []\n\n    let shareds = []\n    let sharedmap = {}\n    let numshared = 0\n        // for (let i = 0, iMax = csg.polygons.length; i < iMax; i++) {\n        //  let p = csg.polygons[i];\n        //  for (let j = 0, jMax = p.length; j < jMax; j++) {\n        //      ++numpolygonvertices;\n        //      let vertextag = p[j].getTag();\n        //      if(!(vertextag in vertexmap)) {\n        //          vertexmap[vertextag] = numvertices++;\n        //          vertices.push(p[j]);\n        //      }\n        //  }\n    csg.polygons.map(function (polygon) {\n      // FIXME: why use map if we do not return anything ?\n      // either for... or forEach\n      polygon.vertices.map(function (vertex) {\n        ++numpolygonvertices\n        let vertextag = vertex.getTag()\n        if (!(vertextag in vertexmap)) {\n          vertexmap[vertextag] = numvertices++\n          vertices.push(vertex)\n        }\n      })\n\n      let planetag = polygon.plane.getTag()\n      if (!(planetag in planemap)) {\n        planemap[planetag] = numplanes++\n        planes.push(polygon.plane)\n      }\n      let sharedtag = polygon.shared.getTag()\n      if (!(sharedtag in sharedmap)) {\n        sharedmap[sharedtag] = numshared++\n        shareds.push(polygon.shared)\n      }\n    })\n\n    let numVerticesPerPolygon = new Uint32Array(numpolygons)\n    let polygonSharedIndexes = new Uint32Array(numpolygons)\n    let polygonVertices = new Uint32Array(numpolygonvertices)\n    let polygonPlaneIndexes = new Uint32Array(numpolygons)\n    let vertexData = new Float64Array(numvertices * 3)\n    let planeData = new Float64Array(numplanes * 4)\n    let polygonVerticesIndex = 0\n\n    // FIXME: doublecheck : why does it go through the whole polygons again?\n    // can we optimise that ? (perhap due to needing size to init buffers above)\n    for (let polygonindex = 0; polygonindex < numpolygons; ++polygonindex) {\n      let polygon = csg.polygons[polygonindex]\n      numVerticesPerPolygon[polygonindex] = polygon.vertices.length\n      polygon.vertices.map(function (vertex) {\n        let vertextag = vertex.getTag()\n        let vertexindex = vertexmap[vertextag]\n        polygonVertices[polygonVerticesIndex++] = vertexindex\n      })\n      let planetag = polygon.plane.getTag()\n      let planeindex = planemap[planetag]\n      polygonPlaneIndexes[polygonindex] = planeindex\n      let sharedtag = polygon.shared.getTag()\n      let sharedindex = sharedmap[sharedtag]\n      polygonSharedIndexes[polygonindex] = sharedindex\n    }\n    let verticesArrayIndex = 0\n    vertices.map(function (vertex) {\n      const pos = vertex.pos\n      vertexData[verticesArrayIndex++] = pos._x\n      vertexData[verticesArrayIndex++] = pos._y\n      vertexData[verticesArrayIndex++] = pos._z\n    })\n    let planesArrayIndex = 0\n    planes.map(function (plane) {\n      const normal = plane.normal\n      planeData[planesArrayIndex++] = normal._x\n      planeData[planesArrayIndex++] = normal._y\n      planeData[planesArrayIndex++] = normal._z\n      planeData[planesArrayIndex++] = plane.w\n    })\n\n    let result = {\n      'class': 'CSG',\n      numPolygons: numpolygons,\n      numVerticesPerPolygon: numVerticesPerPolygon,\n      polygonPlaneIndexes: polygonPlaneIndexes,\n      polygonSharedIndexes: polygonSharedIndexes,\n      polygonVertices: polygonVertices,\n      vertexData: vertexData,\n      planeData: planeData,\n      shared: shareds\n    }\n    return result\n  },\n\n  /** returns the triangles of this csg\n   * @returns {Polygons} triangulated polygons\n   */\n  toTriangles: function () {\n    let polygons = []\n    this.polygons.forEach(function (poly) {\n      let firstVertex = poly.vertices[0]\n      for (let i = poly.vertices.length - 3; i >= 0; i--) {\n        polygons.push(new Polygon(\n          [\n            firstVertex,\n            poly.vertices[i + 1],\n            poly.vertices[i + 2]\n          ],\n          poly.shared,\n          poly.plane))\n      }\n    })\n    return polygons\n  }\n}\n\nmodule.exports = CSG\n\n},{\"../api/center\":24,\"../api/ops-cnc\":33,\"../api/ops-cuts\":34,\"../api/ops-expandContract\":35,\"./CAG\":45,\"./CSGFactories\":48,\"./Properties\":52,\"./math/OrthoNormalBasis\":58,\"./math/Plane\":60,\"./math/Polygon3\":62,\"./trees\":71,\"./utils/canonicalize\":75,\"./utils/csgMeasurements\":76,\"./utils/csgProjections\":77,\"./utils/fixTJunctions\":78,\"./utils/retesellate\":79}],48:[function(require,module,exports){\nconst Vector3D = require('./math/Vector3')\nconst Vertex = require('./math/Vertex3')\nconst Plane = require('./math/Plane')\nconst Polygon2D = require('./math/Polygon2')\nconst Polygon3D = require('./math/Polygon3')\n\n/** Construct a CSG solid from a list of `Polygon` instances.\n * @param {Polygon[]} polygons - list of polygons\n * @returns {CSG} new CSG object\n */\nconst fromPolygons = function (polygons) {\n  const CSG = require('./CSG')\n  let csg = new CSG()\n  csg.polygons = polygons\n  csg.isCanonicalized = false\n  csg.isRetesselated = false\n  return csg\n}\n\n/** Construct a CSG solid from a list of pre-generated slices.\n * See Polygon.prototype.solidFromSlices() for details.\n * @param {Object} options - options passed to solidFromSlices()\n * @returns {CSG} new CSG object\n */\nfunction fromSlices (options) {\n  return Polygon2D.createFromPoints([\n        [0, 0, 0],\n        [1, 0, 0],\n        [1, 1, 0],\n        [0, 1, 0]\n  ]).solidFromSlices(options)\n}\n\n/** Reconstruct a CSG solid from an object with identical property names.\n * @param {Object} obj - anonymous object, typically from JSON\n * @returns {CSG} new CSG object\n */\nfunction fromObject (obj) {\n  let polygons = obj.polygons.map(function (p) {\n    return Polygon3D.fromObject(p)\n  })\n  let csg = fromPolygons(polygons)\n  csg.isCanonicalized = obj.isCanonicalized\n  csg.isRetesselated = obj.isRetesselated\n  return csg\n}\n\n/** Reconstruct a CSG from the output of toCompactBinary().\n * @param {CompactBinary} bin - see toCompactBinary().\n * @returns {CSG} new CSG object\n */\nfunction fromCompactBinary (bin) {\n  if (bin['class'] !== 'CSG') throw new Error('Not a CSG')\n  let planes = []\n  let planeData = bin.planeData\n  let numplanes = planeData.length / 4\n  let arrayindex = 0\n  let x, y, z, w, normal, plane\n  for (let planeindex = 0; planeindex < numplanes; planeindex++) {\n    x = planeData[arrayindex++]\n    y = planeData[arrayindex++]\n    z = planeData[arrayindex++]\n    w = planeData[arrayindex++]\n    normal = Vector3D.Create(x, y, z)\n    plane = new Plane(normal, w)\n    planes.push(plane)\n  }\n\n  let vertices = []\n  const vertexData = bin.vertexData\n  const numvertices = vertexData.length / 3\n  let pos\n  let vertex\n  arrayindex = 0\n  for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n    x = vertexData[arrayindex++]\n    y = vertexData[arrayindex++]\n    z = vertexData[arrayindex++]\n    pos = Vector3D.Create(x, y, z)\n    vertex = new Vertex(pos)\n    vertices.push(vertex)\n  }\n\n  let shareds = bin.shared.map(function (shared) {\n    return Polygon3D.Shared.fromObject(shared)\n  })\n\n  let polygons = []\n  let numpolygons = bin.numPolygons\n  let numVerticesPerPolygon = bin.numVerticesPerPolygon\n  let polygonVertices = bin.polygonVertices\n  let polygonPlaneIndexes = bin.polygonPlaneIndexes\n  let polygonSharedIndexes = bin.polygonSharedIndexes\n  let numpolygonvertices\n  let polygonvertices\n  let shared\n  let polygon // already defined plane,\n  arrayindex = 0\n  for (let polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n    numpolygonvertices = numVerticesPerPolygon[polygonindex]\n    polygonvertices = []\n    for (let i = 0; i < numpolygonvertices; i++) {\n      polygonvertices.push(vertices[polygonVertices[arrayindex++]])\n    }\n    plane = planes[polygonPlaneIndexes[polygonindex]]\n    shared = shareds[polygonSharedIndexes[polygonindex]]\n    polygon = new Polygon3D(polygonvertices, shared, plane)\n    polygons.push(polygon)\n  }\n  let csg = fromPolygons(polygons)\n  csg.isCanonicalized = true\n  csg.isRetesselated = true\n  return csg\n}\n\nmodule.exports = {\n  fromPolygons,\n  fromSlices,\n  fromObject,\n  fromCompactBinary\n}\n\n},{\"./CSG\":47,\"./math/Plane\":60,\"./math/Polygon2\":61,\"./math/Polygon3\":62,\"./math/Vector3\":65,\"./math/Vertex3\":67}],49:[function(require,module,exports){\n// //////////////////////////////\n// ## class fuzzyFactory\n// This class acts as a factory for objects. We can search for an object with approximately\n// the desired properties (say a rectangle with width 2 and height 1)\n// The lookupOrCreate() method looks for an existing object (for example it may find an existing rectangle\n// with width 2.0001 and height 0.999. If no object is found, the user supplied callback is\n// called, which should generate a new object. The new object is inserted into the database\n// so it can be found by future lookupOrCreate() calls.\n// Constructor:\n//   numdimensions: the number of parameters for each object\n//     for example for a 2D rectangle this would be 2\n//   tolerance: The maximum difference for each parameter allowed to be considered a match\nconst FuzzyFactory = function (numdimensions, tolerance) {\n  this.lookuptable = {}\n  this.multiplier = 1.0 / tolerance\n}\n\nFuzzyFactory.prototype = {\n    // let obj = f.lookupOrCreate([el1, el2, el3], function(elements) {/* create the new object */});\n    // Performs a fuzzy lookup of the object with the specified elements.\n    // If found, returns the existing object\n    // If not found, calls the supplied callback function which should create a new object with\n    // the specified properties. This object is inserted in the lookup database.\n  lookupOrCreate: function (els, creatorCallback) {\n    let hash = ''\n    let multiplier = this.multiplier\n    els.forEach(function (el) {\n      let valueQuantized = Math.round(el * multiplier)\n      hash += valueQuantized + '/'\n    })\n    if (hash in this.lookuptable) {\n      return this.lookuptable[hash]\n    } else {\n      let object = creatorCallback(els)\n      let hashparts = els.map(function (el) {\n        let q0 = Math.floor(el * multiplier)\n        let q1 = q0 + 1\n        return ['' + q0 + '/', '' + q1 + '/']\n      })\n      let numelements = els.length\n      let numhashes = 1 << numelements\n      for (let hashmask = 0; hashmask < numhashes; ++hashmask) {\n        let hashmaskShifted = hashmask\n        hash = ''\n        hashparts.forEach(function (hashpart) {\n          hash += hashpart[hashmaskShifted & 1]\n          hashmaskShifted >>= 1\n        })\n        this.lookuptable[hash] = object\n      }\n      return object\n    }\n  }\n}\n\nmodule.exports = FuzzyFactory\n\n},{}],50:[function(require,module,exports){\nconst FuzzyFactory = require('./FuzzyFactory')\nconst {EPS} = require('./constants')\nconst Side = require('./math/Side')\n\nconst FuzzyCAGFactory = function () {\n  this.vertexfactory = new FuzzyFactory(2, EPS)\n}\n\nFuzzyCAGFactory.prototype = {\n  getVertex: function (sourcevertex) {\n    let elements = [sourcevertex.pos._x, sourcevertex.pos._y]\n    let result = this.vertexfactory.lookupOrCreate(elements, function (els) {\n      return sourcevertex\n    })\n    return result\n  },\n\n  getSide: function (sourceside) {\n    let vertex0 = this.getVertex(sourceside.vertex0)\n    let vertex1 = this.getVertex(sourceside.vertex1)\n    return new Side(vertex0, vertex1)\n  }\n}\n\nmodule.exports = FuzzyCAGFactory\n\n},{\"./FuzzyFactory\":49,\"./constants\":54,\"./math/Side\":63}],51:[function(require,module,exports){\nconst {EPS} = require('./constants')\nconst Polygon = require('./math/Polygon3')\nconst FuzzyFactory = require('./FuzzyFactory')\n\n// ////////////////////////////////////\nconst FuzzyCSGFactory = function () {\n  this.vertexfactory = new FuzzyFactory(3, EPS)\n  this.planefactory = new FuzzyFactory(4, EPS)\n  this.polygonsharedfactory = {}\n}\n\nFuzzyCSGFactory.prototype = {\n  getPolygonShared: function (sourceshared) {\n    let hash = sourceshared.getHash()\n    if (hash in this.polygonsharedfactory) {\n      return this.polygonsharedfactory[hash]\n    } else {\n      this.polygonsharedfactory[hash] = sourceshared\n      return sourceshared\n    }\n  },\n\n  getVertex: function (sourcevertex) {\n    let elements = [sourcevertex.pos._x, sourcevertex.pos._y, sourcevertex.pos._z]\n    let result = this.vertexfactory.lookupOrCreate(elements, function (els) {\n      return sourcevertex\n    })\n    return result\n  },\n\n  getPlane: function (sourceplane) {\n    let elements = [sourceplane.normal._x, sourceplane.normal._y, sourceplane.normal._z, sourceplane.w]\n    let result = this.planefactory.lookupOrCreate(elements, function (els) {\n      return sourceplane\n    })\n    return result\n  },\n\n  getPolygon: function (sourcepolygon) {\n    let newplane = this.getPlane(sourcepolygon.plane)\n    let newshared = this.getPolygonShared(sourcepolygon.shared)\n    let _this = this\n    let newvertices = sourcepolygon.vertices.map(function (vertex) {\n      return _this.getVertex(vertex)\n    })\n        // two vertices that were originally very close may now have become\n        // truly identical (referring to the same Vertex object).\n        // Remove duplicate vertices:\n    let newverticesDedup = []\n    if (newvertices.length > 0) {\n      let prevvertextag = newvertices[newvertices.length - 1].getTag()\n      newvertices.forEach(function (vertex) {\n        let vertextag = vertex.getTag()\n        if (vertextag !== prevvertextag) {\n          newverticesDedup.push(vertex)\n        }\n        prevvertextag = vertextag\n      })\n    }\n        // If it's degenerate, remove all vertices:\n    if (newverticesDedup.length < 3) {\n      newverticesDedup = []\n    }\n    return new Polygon(newverticesDedup, newshared, newplane)\n  }\n}\n\nmodule.exports = FuzzyCSGFactory\n\n},{\"./FuzzyFactory\":49,\"./constants\":54,\"./math/Polygon3\":62}],52:[function(require,module,exports){\n// ////////////////////////////////////\n// # Class Properties\n// This class is used to store properties of a solid\n// A property can for example be a Vertex, a Plane or a Line3D\n// Whenever an affine transform is applied to the CSG solid, all its properties are\n// transformed as well.\n// The properties can be stored in a complex nested structure (using arrays and objects)\nconst Properties = function () {}\n\nProperties.prototype = {\n  _transform: function (matrix4x4) {\n    let result = new Properties()\n    Properties.transformObj(this, result, matrix4x4)\n    return result\n  },\n  _merge: function (otherproperties) {\n    let result = new Properties()\n    Properties.cloneObj(this, result)\n    Properties.addFrom(result, otherproperties)\n    return result\n  }\n}\n\nProperties.transformObj = function (source, result, matrix4x4) {\n  for (let propertyname in source) {\n    if (propertyname === '_transform') continue\n    if (propertyname === '_merge') continue\n    let propertyvalue = source[propertyname]\n    let transformed = propertyvalue\n    if (typeof (propertyvalue) === 'object') {\n      if (('transform' in propertyvalue) && (typeof (propertyvalue.transform) === 'function')) {\n        transformed = propertyvalue.transform(matrix4x4)\n      } else if (propertyvalue instanceof Array) {\n        transformed = []\n        Properties.transformObj(propertyvalue, transformed, matrix4x4)\n      } else if (propertyvalue instanceof Properties) {\n        transformed = new Properties()\n        Properties.transformObj(propertyvalue, transformed, matrix4x4)\n      }\n    }\n    result[propertyname] = transformed\n  }\n}\n\nProperties.cloneObj = function (source, result) {\n  for (let propertyname in source) {\n    if (propertyname === '_transform') continue\n    if (propertyname === '_merge') continue\n    let propertyvalue = source[propertyname]\n    let cloned = propertyvalue\n    if (typeof (propertyvalue) === 'object') {\n      if (propertyvalue instanceof Array) {\n        cloned = []\n        for (let i = 0; i < propertyvalue.length; i++) {\n          cloned.push(propertyvalue[i])\n        }\n      } else if (propertyvalue instanceof Properties) {\n        cloned = new Properties()\n        Properties.cloneObj(propertyvalue, cloned)\n      }\n    }\n    result[propertyname] = cloned\n  }\n}\n\nProperties.addFrom = function (result, otherproperties) {\n  for (let propertyname in otherproperties) {\n    if (propertyname === '_transform') continue\n    if (propertyname === '_merge') continue\n    if ((propertyname in result) &&\n            (typeof (result[propertyname]) === 'object') &&\n            (result[propertyname] instanceof Properties) &&\n            (typeof (otherproperties[propertyname]) === 'object') &&\n            (otherproperties[propertyname] instanceof Properties)) {\n      Properties.addFrom(result[propertyname], otherproperties[propertyname])\n    } else if (!(propertyname in result)) {\n      result[propertyname] = otherproperties[propertyname]\n    }\n  }\n}\n\nmodule.exports = Properties\n\n},{}],53:[function(require,module,exports){\nconst Vector3D = require('./math/Vector3')\nconst Line3D = require('./math/Line3')\nconst Matrix4x4 = require('./math/Matrix4')\nconst OrthoNormalBasis = require('./math/OrthoNormalBasis')\nconst Plane = require('./math/Plane')\n\n// # class Connector\n// A connector allows to attach two objects at predefined positions\n// For example a servo motor and a servo horn:\n// Both can have a Connector called 'shaft'\n// The horn can be moved and rotated such that the two connectors match\n// and the horn is attached to the servo motor at the proper position.\n// Connectors are stored in the properties of a CSG solid so they are\n// ge the same transformations applied as the solid\nconst Connector = function (point, axisvector, normalvector) {\n  this.point = new Vector3D(point)\n  this.axisvector = new Vector3D(axisvector).unit()\n  this.normalvector = new Vector3D(normalvector).unit()\n}\n\nConnector.prototype = {\n  normalized: function () {\n    let axisvector = this.axisvector.unit()\n        // make the normal vector truly normal:\n    let n = this.normalvector.cross(axisvector).unit()\n    let normalvector = axisvector.cross(n)\n    return new Connector(this.point, axisvector, normalvector)\n  },\n\n  transform: function (matrix4x4) {\n    let point = this.point.multiply4x4(matrix4x4)\n    let axisvector = this.point.plus(this.axisvector).multiply4x4(matrix4x4).minus(point)\n    let normalvector = this.point.plus(this.normalvector).multiply4x4(matrix4x4).minus(point)\n    return new Connector(point, axisvector, normalvector)\n  },\n\n    // Get the transformation matrix to connect this Connector to another connector\n    //   other: a Connector to which this connector should be connected\n    //   mirror: false: the 'axis' vectors of the connectors should point in the same direction\n    //           true: the 'axis' vectors of the connectors should point in opposite direction\n    //   normalrotation: degrees of rotation between the 'normal' vectors of the two\n    //                   connectors\n  getTransformationTo: function (other, mirror, normalrotation) {\n    mirror = mirror ? true : false\n    normalrotation = normalrotation ? Number(normalrotation) : 0\n    let us = this.normalized()\n    other = other.normalized()\n        // shift to the origin:\n    let transformation = Matrix4x4.translation(this.point.negated())\n        // construct the plane crossing through the origin and the two axes:\n    let axesplane = Plane.anyPlaneFromVector3Ds(\n            new Vector3D(0, 0, 0), us.axisvector, other.axisvector)\n    let axesbasis = new OrthoNormalBasis(axesplane)\n    let angle1 = axesbasis.to2D(us.axisvector).angle()\n    let angle2 = axesbasis.to2D(other.axisvector).angle()\n    let rotation = 180.0 * (angle2 - angle1) / Math.PI\n    if (mirror) rotation += 180.0\n    transformation = transformation.multiply(axesbasis.getProjectionMatrix())\n    transformation = transformation.multiply(Matrix4x4.rotationZ(rotation))\n    transformation = transformation.multiply(axesbasis.getInverseProjectionMatrix())\n    let usAxesAligned = us.transform(transformation)\n        // Now we have done the transformation for aligning the axes.\n        // We still need to align the normals:\n    let normalsplane = Plane.fromNormalAndPoint(other.axisvector, new Vector3D(0, 0, 0))\n    let normalsbasis = new OrthoNormalBasis(normalsplane)\n    angle1 = normalsbasis.to2D(usAxesAligned.normalvector).angle()\n    angle2 = normalsbasis.to2D(other.normalvector).angle()\n    rotation = 180.0 * (angle2 - angle1) / Math.PI\n    rotation += normalrotation\n    transformation = transformation.multiply(normalsbasis.getProjectionMatrix())\n    transformation = transformation.multiply(Matrix4x4.rotationZ(rotation))\n    transformation = transformation.multiply(normalsbasis.getInverseProjectionMatrix())\n        // and translate to the destination point:\n    transformation = transformation.multiply(Matrix4x4.translation(other.point))\n        // let usAligned = us.transform(transformation);\n    return transformation\n  },\n\n  axisLine: function () {\n    return new Line3D(this.point, this.axisvector)\n  },\n\n    // creates a new Connector, with the connection point moved in the direction of the axisvector\n  extend: function (distance) {\n    let newpoint = this.point.plus(this.axisvector.unit().times(distance))\n    return new Connector(newpoint, this.axisvector, this.normalvector)\n  }\n}\n\nconst ConnectorList = function (connectors) {\n  this.connectors_ = connectors ? connectors.slice() : []\n}\n\nConnectorList.defaultNormal = [0, 0, 1]\n\nConnectorList.fromPath2D = function (path2D, arg1, arg2) {\n  if (arguments.length === 3) {\n    return ConnectorList._fromPath2DTangents(path2D, arg1, arg2)\n  } else if (arguments.length === 2) {\n    return ConnectorList._fromPath2DExplicit(path2D, arg1)\n  } else {\n    throw new Error('call with path2D and either 2 direction vectors, or a function returning direction vectors')\n  }\n}\n\n/*\n * calculate the connector axisvectors by calculating the \"tangent\" for path2D.\n * This is undefined for start and end points, so axis for these have to be manually\n * provided.\n */\nConnectorList._fromPath2DTangents = function (path2D, start, end) {\n    // path2D\n  let axis\n  let pathLen = path2D.points.length\n  let result = new ConnectorList([new Connector(path2D.points[0],\n        start, ConnectorList.defaultNormal)])\n    // middle points\n  path2D.points.slice(1, pathLen - 1).forEach(function (p2, i) {\n    axis = path2D.points[i + 2].minus(path2D.points[i]).toVector3D(0)\n    result.appendConnector(new Connector(p2.toVector3D(0), axis,\n          ConnectorList.defaultNormal))\n  }, this)\n  result.appendConnector(new Connector(path2D.points[pathLen - 1], end,\n      ConnectorList.defaultNormal))\n  result.closed = path2D.closed\n  return result\n}\n\n/*\n * angleIsh: either a static angle, or a function(point) returning an angle\n */\nConnectorList._fromPath2DExplicit = function (path2D, angleIsh) {\n  function getAngle (angleIsh, pt, i) {\n    if (typeof angleIsh === 'function') {\n      angleIsh = angleIsh(pt, i)\n    }\n    return angleIsh\n  }\n  let result = new ConnectorList(\n        path2D.points.map(function (p2, i) {\n          return new Connector(p2.toVector3D(0),\n                Vector3D.Create(1, 0, 0).rotateZ(getAngle(angleIsh, p2, i)),\n                  ConnectorList.defaultNormal)\n        }, this)\n    )\n  result.closed = path2D.closed\n  return result\n}\n\nConnectorList.prototype = {\n  setClosed: function (closed) {\n    this.closed = !!closed\n  },\n  appendConnector: function (conn) {\n    this.connectors_.push(conn)\n  },\n    /*\n     * arguments: cagish: a cag or a function(connector) returning a cag\n     *            closed: whether the 3d path defined by connectors location\n     *              should be closed or stay open\n     *              Note: don't duplicate connectors in the path\n     * TODO: consider an option \"maySelfIntersect\" to close & force union all single segments\n     */\n  followWith: function (cagish) {\n    const CSG = require('./CSG') // FIXME , circular dependency connectors => CSG => connectors\n\n    this.verify()\n    function getCag (cagish, connector) {\n      if (typeof cagish === 'function') {\n        cagish = cagish(connector.point, connector.axisvector, connector.normalvector)\n      }\n      return cagish\n    }\n\n    let polygons = []\n    let currCag\n    let prevConnector = this.connectors_[this.connectors_.length - 1]\n    let prevCag = getCag(cagish, prevConnector)\n        // add walls\n    this.connectors_.forEach(function (connector, notFirst) {\n      currCag = getCag(cagish, connector)\n      if (notFirst || this.closed) {\n        polygons.push.apply(polygons, prevCag._toWallPolygons({\n          toConnector1: prevConnector, toConnector2: connector, cag: currCag}))\n      } else {\n                // it is the first, and shape not closed -> build start wall\n        polygons.push.apply(polygons,\n                    currCag._toPlanePolygons({toConnector: connector, flipped: true}))\n      }\n      if (notFirst === this.connectors_.length - 1 && !this.closed) {\n                // build end wall\n        polygons.push.apply(polygons,\n                    currCag._toPlanePolygons({toConnector: connector}))\n      }\n      prevCag = currCag\n      prevConnector = connector\n    }, this)\n    return CSG.fromPolygons(polygons).reTesselated().canonicalized()\n  },\n    /*\n     * general idea behind these checks: connectors need to have smooth transition from one to another\n     * TODO: add a check that 2 follow-on CAGs are not intersecting\n     */\n  verify: function () {\n    let connI\n    let connI1\n    for (let i = 0; i < this.connectors_.length - 1; i++) {\n      connI = this.connectors_[i]\n      connI1 = this.connectors_[i + 1]\n      if (connI1.point.minus(connI.point).dot(connI.axisvector) <= 0) {\n        throw new Error('Invalid ConnectorList. Each connectors position needs to be within a <90deg range of previous connectors axisvector')\n      }\n      if (connI.axisvector.dot(connI1.axisvector) <= 0) {\n        throw new Error('invalid ConnectorList. No neighboring connectors axisvectors may span a >=90deg angle')\n      }\n    }\n  }\n}\n\nmodule.exports = {Connector, ConnectorList}\n\n},{\"./CSG\":47,\"./math/Line3\":56,\"./math/Matrix4\":57,\"./math/OrthoNormalBasis\":58,\"./math/Plane\":60,\"./math/Vector3\":65}],54:[function(require,module,exports){\nconst _CSGDEBUG = false\n\n/** Number of polygons per 360 degree revolution for 2D objects.\n * @default\n */\nconst defaultResolution2D = 32 // FIXME this seems excessive\n/** Number of polygons per 360 degree revolution for 3D objects.\n * @default\n */\nconst defaultResolution3D = 12\n\n/** Epsilon used during determination of near zero distances.\n * @default\n */\nconst EPS = 1e-5\n\n/** Epsilon used during determination of near zero areas.\n * @default\n */\nconst angleEPS = 0.10\n\n/** Epsilon used during determination of near zero areas.\n *  This is the minimal area of a minimal polygon.\n * @default\n */\nconst areaEPS = 0.50 * EPS * EPS * Math.sin(angleEPS)\n\nconst all = 0\nconst top = 1\nconst bottom = 2\nconst left = 3\nconst right = 4\nconst front = 5\nconst back = 6\n// Tag factory: we can request a unique tag through CSG.getTag()\nlet staticTag = 1\nconst getTag = () => staticTag++\n\nmodule.exports = {\n  _CSGDEBUG,\n  defaultResolution2D,\n  defaultResolution3D,\n  EPS,\n  angleEPS,\n  areaEPS,\n  all,\n  top,\n  bottom,\n  left,\n  right,\n  front,\n  back,\n  staticTag,\n  getTag\n}\n\n},{}],55:[function(require,module,exports){\nconst Vector2D = require('./Vector2')\nconst {solve2Linear} = require('../utils')\n\n/**  class Line2D\n * Represents a directional line in 2D space\n * A line is parametrized by its normal vector (perpendicular to the line, rotated 90 degrees counter clockwise)\n * and w. The line passes through the point <normal>.times(w).\n * Equation: p is on line if normal.dot(p)==w\n * @param {Vector2D} normal normal must be a unit vector!\n * @returns {Line2D}\n*/\nconst Line2D = function (normal, w) {\n  normal = new Vector2D(normal)\n  w = parseFloat(w)\n  let l = normal.length()\n    // normalize:\n  w *= l\n  normal = normal.times(1.0 / l)\n  this.normal = normal\n  this.w = w\n}\n\nLine2D.fromPoints = function (p1, p2) {\n  p1 = new Vector2D(p1)\n  p2 = new Vector2D(p2)\n  let direction = p2.minus(p1)\n  let normal = direction.normal().negated().unit()\n  let w = p1.dot(normal)\n  return new Line2D(normal, w)\n}\n\nLine2D.prototype = {\n    // same line but opposite direction:\n  reverse: function () {\n    return new Line2D(this.normal.negated(), -this.w)\n  },\n\n  equals: function (l) {\n    return (l.normal.equals(this.normal) && (l.w === this.w))\n  },\n\n  origin: function () {\n    return this.normal.times(this.w)\n  },\n\n  direction: function () {\n    return this.normal.normal()\n  },\n\n  xAtY: function (y) {\n        // (py == y) && (normal * p == w)\n        // -> px = (w - normal._y * y) / normal.x\n    let x = (this.w - this.normal._y * y) / this.normal.x\n    return x\n  },\n\n  absDistanceToPoint: function (point) {\n    point = new Vector2D(point)\n    let pointProjected = point.dot(this.normal)\n    let distance = Math.abs(pointProjected - this.w)\n    return distance\n  },\n    /* FIXME: has error - origin is not defined, the method is never used\n     closestPoint: function(point) {\n         point = new Vector2D(point);\n         let vector = point.dot(this.direction());\n         return origin.plus(vector);\n     },\n     */\n\n    // intersection between two lines, returns point as Vector2D\n  intersectWithLine: function (line2d) {\n    let point = solve2Linear(this.normal.x, this.normal.y, line2d.normal.x, line2d.normal.y, this.w, line2d.w)\n    point = new Vector2D(point) // make  vector2d\n    return point\n  },\n\n  transform: function (matrix4x4) {\n    let origin = new Vector2D(0, 0)\n    let pointOnPlane = this.normal.times(this.w)\n    let neworigin = origin.multiply4x4(matrix4x4)\n    let neworiginPlusNormal = this.normal.multiply4x4(matrix4x4)\n    let newnormal = neworiginPlusNormal.minus(neworigin)\n    let newpointOnPlane = pointOnPlane.multiply4x4(matrix4x4)\n    let neww = newnormal.dot(newpointOnPlane)\n    return new Line2D(newnormal, neww)\n  }\n}\n\nmodule.exports = Line2D\n\n},{\"../utils\":72,\"./Vector2\":64}],56:[function(require,module,exports){\nconst Vector3D = require('./Vector3')\nconst {EPS} = require('../constants')\nconst {solve2Linear} = require('../utils')\n\n// # class Line3D\n// Represents a line in 3D space\n// direction must be a unit vector\n// point is a random point on the line\nconst Line3D = function (point, direction) {\n  point = new Vector3D(point)\n  direction = new Vector3D(direction)\n  this.point = point\n  this.direction = direction.unit()\n}\n\nLine3D.fromPoints = function (p1, p2) {\n  p1 = new Vector3D(p1)\n  p2 = new Vector3D(p2)\n  let direction = p2.minus(p1)\n  return new Line3D(p1, direction)\n}\n\nLine3D.fromPlanes = function (p1, p2) {\n  let direction = p1.normal.cross(p2.normal)\n  let l = direction.length()\n  if (l < EPS) {\n    throw new Error('Parallel planes')\n  }\n  direction = direction.times(1.0 / l)\n\n  let mabsx = Math.abs(direction.x)\n  let mabsy = Math.abs(direction.y)\n  let mabsz = Math.abs(direction.z)\n  let origin\n  if ((mabsx >= mabsy) && (mabsx >= mabsz)) {\n        // direction vector is mostly pointing towards x\n        // find a point p for which x is zero:\n    let r = solve2Linear(p1.normal.y, p1.normal.z, p2.normal.y, p2.normal.z, p1.w, p2.w)\n    origin = new Vector3D(0, r[0], r[1])\n  } else if ((mabsy >= mabsx) && (mabsy >= mabsz)) {\n        // find a point p for which y is zero:\n    let r = solve2Linear(p1.normal.x, p1.normal.z, p2.normal.x, p2.normal.z, p1.w, p2.w)\n    origin = new Vector3D(r[0], 0, r[1])\n  } else {\n        // find a point p for which z is zero:\n    let r = solve2Linear(p1.normal.x, p1.normal.y, p2.normal.x, p2.normal.y, p1.w, p2.w)\n    origin = new Vector3D(r[0], r[1], 0)\n  }\n  return new Line3D(origin, direction)\n}\n\nLine3D.prototype = {\n  intersectWithPlane: function (plane) {\n        // plane: plane.normal * p = plane.w\n        // line: p=line.point + labda * line.direction\n    let labda = (plane.w - plane.normal.dot(this.point)) / plane.normal.dot(this.direction)\n    let point = this.point.plus(this.direction.times(labda))\n    return point\n  },\n\n  clone: function (line) {\n    return new Line3D(this.point.clone(), this.direction.clone())\n  },\n\n  reverse: function () {\n    return new Line3D(this.point.clone(), this.direction.negated())\n  },\n\n  transform: function (matrix4x4) {\n    let newpoint = this.point.multiply4x4(matrix4x4)\n    let pointPlusDirection = this.point.plus(this.direction)\n    let newPointPlusDirection = pointPlusDirection.multiply4x4(matrix4x4)\n    let newdirection = newPointPlusDirection.minus(newpoint)\n    return new Line3D(newpoint, newdirection)\n  },\n\n  closestPointOnLine: function (point) {\n    point = new Vector3D(point)\n    let t = point.minus(this.point).dot(this.direction) / this.direction.dot(this.direction)\n    let closestpoint = this.point.plus(this.direction.times(t))\n    return closestpoint\n  },\n\n  distanceToPoint: function (point) {\n    point = new Vector3D(point)\n    let closestpoint = this.closestPointOnLine(point)\n    let distancevector = point.minus(closestpoint)\n    let distance = distancevector.length()\n    return distance\n  },\n\n  equals: function (line3d) {\n    if (!this.direction.equals(line3d.direction)) return false\n    let distance = this.distanceToPoint(line3d.point)\n    if (distance > EPS) return false\n    return true\n  }\n}\n\nmodule.exports = Line3D\n\n},{\"../constants\":54,\"../utils\":72,\"./Vector3\":65}],57:[function(require,module,exports){\nconst Vector3D = require('./Vector3')\nconst Vector2D = require('./Vector2')\nconst OrthoNormalBasis = require('./OrthoNormalBasis')\nconst Plane = require('./Plane')\n\n// # class Matrix4x4:\n// Represents a 4x4 matrix. Elements are specified in row order\nconst Matrix4x4 = function (elements) {\n  if (arguments.length >= 1) {\n    this.elements = elements\n  } else {\n        // if no arguments passed: create unity matrix\n    this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]\n  }\n}\n\nMatrix4x4.prototype = {\n  plus: function (m) {\n    var r = []\n    for (var i = 0; i < 16; i++) {\n      r[i] = this.elements[i] + m.elements[i]\n    }\n    return new Matrix4x4(r)\n  },\n\n  minus: function (m) {\n    var r = []\n    for (var i = 0; i < 16; i++) {\n      r[i] = this.elements[i] - m.elements[i]\n    }\n    return new Matrix4x4(r)\n  },\n\n    // right multiply by another 4x4 matrix:\n  multiply: function (m) {\n        // cache elements in local variables, for speedup:\n    var this0 = this.elements[0]\n    var this1 = this.elements[1]\n    var this2 = this.elements[2]\n    var this3 = this.elements[3]\n    var this4 = this.elements[4]\n    var this5 = this.elements[5]\n    var this6 = this.elements[6]\n    var this7 = this.elements[7]\n    var this8 = this.elements[8]\n    var this9 = this.elements[9]\n    var this10 = this.elements[10]\n    var this11 = this.elements[11]\n    var this12 = this.elements[12]\n    var this13 = this.elements[13]\n    var this14 = this.elements[14]\n    var this15 = this.elements[15]\n    var m0 = m.elements[0]\n    var m1 = m.elements[1]\n    var m2 = m.elements[2]\n    var m3 = m.elements[3]\n    var m4 = m.elements[4]\n    var m5 = m.elements[5]\n    var m6 = m.elements[6]\n    var m7 = m.elements[7]\n    var m8 = m.elements[8]\n    var m9 = m.elements[9]\n    var m10 = m.elements[10]\n    var m11 = m.elements[11]\n    var m12 = m.elements[12]\n    var m13 = m.elements[13]\n    var m14 = m.elements[14]\n    var m15 = m.elements[15]\n\n    var result = []\n    result[0] = this0 * m0 + this1 * m4 + this2 * m8 + this3 * m12\n    result[1] = this0 * m1 + this1 * m5 + this2 * m9 + this3 * m13\n    result[2] = this0 * m2 + this1 * m6 + this2 * m10 + this3 * m14\n    result[3] = this0 * m3 + this1 * m7 + this2 * m11 + this3 * m15\n    result[4] = this4 * m0 + this5 * m4 + this6 * m8 + this7 * m12\n    result[5] = this4 * m1 + this5 * m5 + this6 * m9 + this7 * m13\n    result[6] = this4 * m2 + this5 * m6 + this6 * m10 + this7 * m14\n    result[7] = this4 * m3 + this5 * m7 + this6 * m11 + this7 * m15\n    result[8] = this8 * m0 + this9 * m4 + this10 * m8 + this11 * m12\n    result[9] = this8 * m1 + this9 * m5 + this10 * m9 + this11 * m13\n    result[10] = this8 * m2 + this9 * m6 + this10 * m10 + this11 * m14\n    result[11] = this8 * m3 + this9 * m7 + this10 * m11 + this11 * m15\n    result[12] = this12 * m0 + this13 * m4 + this14 * m8 + this15 * m12\n    result[13] = this12 * m1 + this13 * m5 + this14 * m9 + this15 * m13\n    result[14] = this12 * m2 + this13 * m6 + this14 * m10 + this15 * m14\n    result[15] = this12 * m3 + this13 * m7 + this14 * m11 + this15 * m15\n    return new Matrix4x4(result)\n  },\n\n  clone: function () {\n    var elements = this.elements.map(function (p) {\n      return p\n    })\n    return new Matrix4x4(elements)\n  },\n\n    // Right multiply the matrix by a Vector3D (interpreted as 3 row, 1 column)\n    // (result = M*v)\n    // Fourth element is taken as 1\n  rightMultiply1x3Vector: function (v) {\n    var v0 = v._x\n    var v1 = v._y\n    var v2 = v._z\n    var v3 = 1\n    var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3]\n    var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7]\n    var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11]\n    var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15]\n        // scale such that fourth element becomes 1:\n    if (w !== 1) {\n      var invw = 1.0 / w\n      x *= invw\n      y *= invw\n      z *= invw\n    }\n    return new Vector3D(x, y, z)\n  },\n\n    // Multiply a Vector3D (interpreted as 3 column, 1 row) by this matrix\n    // (result = v*M)\n    // Fourth element is taken as 1\n  leftMultiply1x3Vector: function (v) {\n    var v0 = v._x\n    var v1 = v._y\n    var v2 = v._z\n    var v3 = 1\n    var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12]\n    var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13]\n    var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14]\n    var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15]\n        // scale such that fourth element becomes 1:\n    if (w !== 1) {\n      var invw = 1.0 / w\n      x *= invw\n      y *= invw\n      z *= invw\n    }\n    return new Vector3D(x, y, z)\n  },\n\n    // Right multiply the matrix by a Vector2D (interpreted as 2 row, 1 column)\n    // (result = M*v)\n    // Fourth element is taken as 1\n  rightMultiply1x2Vector: function (v) {\n    var v0 = v.x\n    var v1 = v.y\n    var v2 = 0\n    var v3 = 1\n    var x = v0 * this.elements[0] + v1 * this.elements[1] + v2 * this.elements[2] + v3 * this.elements[3]\n    var y = v0 * this.elements[4] + v1 * this.elements[5] + v2 * this.elements[6] + v3 * this.elements[7]\n    var z = v0 * this.elements[8] + v1 * this.elements[9] + v2 * this.elements[10] + v3 * this.elements[11]\n    var w = v0 * this.elements[12] + v1 * this.elements[13] + v2 * this.elements[14] + v3 * this.elements[15]\n        // scale such that fourth element becomes 1:\n    if (w !== 1) {\n      var invw = 1.0 / w\n      x *= invw\n      y *= invw\n      z *= invw\n    }\n    return new Vector2D(x, y)\n  },\n\n    // Multiply a Vector2D (interpreted as 2 column, 1 row) by this matrix\n    // (result = v*M)\n    // Fourth element is taken as 1\n  leftMultiply1x2Vector: function (v) {\n    var v0 = v.x\n    var v1 = v.y\n    var v2 = 0\n    var v3 = 1\n    var x = v0 * this.elements[0] + v1 * this.elements[4] + v2 * this.elements[8] + v3 * this.elements[12]\n    var y = v0 * this.elements[1] + v1 * this.elements[5] + v2 * this.elements[9] + v3 * this.elements[13]\n    var z = v0 * this.elements[2] + v1 * this.elements[6] + v2 * this.elements[10] + v3 * this.elements[14]\n    var w = v0 * this.elements[3] + v1 * this.elements[7] + v2 * this.elements[11] + v3 * this.elements[15]\n        // scale such that fourth element becomes 1:\n    if (w !== 1) {\n      var invw = 1.0 / w\n      x *= invw\n      y *= invw\n      z *= invw\n    }\n    return new Vector2D(x, y)\n  },\n\n    // determine whether this matrix is a mirroring transformation\n  isMirroring: function () {\n    var u = new Vector3D(this.elements[0], this.elements[4], this.elements[8])\n    var v = new Vector3D(this.elements[1], this.elements[5], this.elements[9])\n    var w = new Vector3D(this.elements[2], this.elements[6], this.elements[10])\n\n        // for a true orthogonal, non-mirrored base, u.cross(v) == w\n        // If they have an opposite direction then we are mirroring\n    var mirrorvalue = u.cross(v).dot(w)\n    var ismirror = (mirrorvalue < 0)\n    return ismirror\n  }\n}\n\n// return the unity matrix\nMatrix4x4.unity = function () {\n  return new Matrix4x4()\n}\n\n// Create a rotation matrix for rotating around the x axis\nMatrix4x4.rotationX = function (degrees) {\n  var radians = degrees * Math.PI * (1.0 / 180.0)\n  var cos = Math.cos(radians)\n  var sin = Math.sin(radians)\n  var els = [\n    1, 0, 0, 0, 0, cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1\n  ]\n  return new Matrix4x4(els)\n}\n\n// Create a rotation matrix for rotating around the y axis\nMatrix4x4.rotationY = function (degrees) {\n  var radians = degrees * Math.PI * (1.0 / 180.0)\n  var cos = Math.cos(radians)\n  var sin = Math.sin(radians)\n  var els = [\n    cos, 0, -sin, 0, 0, 1, 0, 0, sin, 0, cos, 0, 0, 0, 0, 1\n  ]\n  return new Matrix4x4(els)\n}\n\n// Create a rotation matrix for rotating around the z axis\nMatrix4x4.rotationZ = function (degrees) {\n  var radians = degrees * Math.PI * (1.0 / 180.0)\n  var cos = Math.cos(radians)\n  var sin = Math.sin(radians)\n  var els = [\n    cos, sin, 0, 0, -sin, cos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1\n  ]\n  return new Matrix4x4(els)\n}\n\n// Matrix for rotation about arbitrary point and axis\nMatrix4x4.rotation = function (rotationCenter, rotationAxis, degrees) {\n  rotationCenter = new Vector3D(rotationCenter)\n  rotationAxis = new Vector3D(rotationAxis)\n  var rotationPlane = Plane.fromNormalAndPoint(rotationAxis, rotationCenter)\n  var orthobasis = new OrthoNormalBasis(rotationPlane)\n  var transformation = Matrix4x4.translation(rotationCenter.negated())\n  transformation = transformation.multiply(orthobasis.getProjectionMatrix())\n  transformation = transformation.multiply(Matrix4x4.rotationZ(degrees))\n  transformation = transformation.multiply(orthobasis.getInverseProjectionMatrix())\n  transformation = transformation.multiply(Matrix4x4.translation(rotationCenter))\n  return transformation\n}\n\n// Create an affine matrix for translation:\nMatrix4x4.translation = function (v) {\n    // parse as Vector3D, so we can pass an array or a Vector3D\n  var vec = new Vector3D(v)\n  var els = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, vec.x, vec.y, vec.z, 1]\n  return new Matrix4x4(els)\n}\n\n// Create an affine matrix for mirroring into an arbitrary plane:\nMatrix4x4.mirroring = function (plane) {\n  var nx = plane.normal.x\n  var ny = plane.normal.y\n  var nz = plane.normal.z\n  var w = plane.w\n  var els = [\n        (1.0 - 2.0 * nx * nx), (-2.0 * ny * nx), (-2.0 * nz * nx), 0,\n        (-2.0 * nx * ny), (1.0 - 2.0 * ny * ny), (-2.0 * nz * ny), 0,\n        (-2.0 * nx * nz), (-2.0 * ny * nz), (1.0 - 2.0 * nz * nz), 0,\n        (2.0 * nx * w), (2.0 * ny * w), (2.0 * nz * w), 1\n  ]\n  return new Matrix4x4(els)\n}\n\n// Create an affine matrix for scaling:\nMatrix4x4.scaling = function (v) {\n    // parse as Vector3D, so we can pass an array or a Vector3D\n  var vec = new Vector3D(v)\n  var els = [\n    vec.x, 0, 0, 0, 0, vec.y, 0, 0, 0, 0, vec.z, 0, 0, 0, 0, 1\n  ]\n  return new Matrix4x4(els)\n}\n\nmodule.exports = Matrix4x4\n\n},{\"./OrthoNormalBasis\":58,\"./Plane\":60,\"./Vector2\":64,\"./Vector3\":65}],58:[function(require,module,exports){\nconst Vector2D = require('./Vector2')\nconst Vector3D = require('./Vector3')\nconst Line2D = require('./Line2')\nconst Line3D = require('./Line3')\nconst Plane = require('./Plane')\n\n/** class OrthoNormalBasis\n * Reprojects points on a 3D plane onto a 2D plane\n * or from a 2D plane back onto the 3D plane\n * @param  {Plane} plane\n * @param  {Vector3D|Vector2D} rightvector\n */\nconst OrthoNormalBasis = function (plane, rightvector) {\n  if (arguments.length < 2) {\n    // choose an arbitrary right hand vector, making sure it is somewhat orthogonal to the plane normal:\n    rightvector = plane.normal.randomNonParallelVector()\n  } else {\n    rightvector = new Vector3D(rightvector)\n  }\n  this.v = plane.normal.cross(rightvector).unit()\n  this.u = this.v.cross(plane.normal)\n  this.plane = plane\n  this.planeorigin = plane.normal.times(plane.w)\n}\n\n// Get an orthonormal basis for the standard XYZ planes.\n// Parameters: the names of two 3D axes. The 2d x axis will map to the first given 3D axis, the 2d y\n// axis will map to the second.\n// Prepend the axis with a \"-\" to invert the direction of this axis.\n// For example: OrthoNormalBasis.GetCartesian(\"-Y\",\"Z\")\n//   will return an orthonormal basis where the 2d X axis maps to the 3D inverted Y axis, and\n//   the 2d Y axis maps to the 3D Z axis.\nOrthoNormalBasis.GetCartesian = function (xaxisid, yaxisid) {\n  let axisid = xaxisid + '/' + yaxisid\n  let planenormal, rightvector\n  if (axisid === 'X/Y') {\n    planenormal = [0, 0, 1]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Y/-X') {\n    planenormal = [0, 0, 1]\n    rightvector = [0, 1, 0]\n  } else if (axisid === '-X/-Y') {\n    planenormal = [0, 0, 1]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Y/X') {\n    planenormal = [0, 0, 1]\n    rightvector = [0, -1, 0]\n  } else if (axisid === '-X/Y') {\n    planenormal = [0, 0, -1]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Y/-X') {\n    planenormal = [0, 0, -1]\n    rightvector = [0, -1, 0]\n  } else if (axisid === 'X/-Y') {\n    planenormal = [0, 0, -1]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Y/X') {\n    planenormal = [0, 0, -1]\n    rightvector = [0, 1, 0]\n  } else if (axisid === 'X/Z') {\n    planenormal = [0, -1, 0]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Z/-X') {\n    planenormal = [0, -1, 0]\n    rightvector = [0, 0, 1]\n  } else if (axisid === '-X/-Z') {\n    planenormal = [0, -1, 0]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Z/X') {\n    planenormal = [0, -1, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === '-X/Z') {\n    planenormal = [0, 1, 0]\n    rightvector = [-1, 0, 0]\n  } else if (axisid === '-Z/-X') {\n    planenormal = [0, 1, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === 'X/-Z') {\n    planenormal = [0, 1, 0]\n    rightvector = [1, 0, 0]\n  } else if (axisid === 'Z/X') {\n    planenormal = [0, 1, 0]\n    rightvector = [0, 0, 1]\n  } else if (axisid === 'Y/Z') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, 1, 0]\n  } else if (axisid === 'Z/-Y') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, 0, 1]\n  } else if (axisid === '-Y/-Z') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, -1, 0]\n  } else if (axisid === '-Z/Y') {\n    planenormal = [1, 0, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === '-Y/Z') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, -1, 0]\n  } else if (axisid === '-Z/-Y') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, 0, -1]\n  } else if (axisid === 'Y/-Z') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, 1, 0]\n  } else if (axisid === 'Z/Y') {\n    planenormal = [-1, 0, 0]\n    rightvector = [0, 0, 1]\n  } else {\n    throw new Error('OrthoNormalBasis.GetCartesian: invalid combination of axis identifiers. Should pass two string arguments from [X,Y,Z,-X,-Y,-Z], being two different axes.')\n  }\n  return new OrthoNormalBasis(new Plane(new Vector3D(planenormal), 0), new Vector3D(rightvector))\n}\n\n/*\n// test code for OrthoNormalBasis.GetCartesian()\nOrthoNormalBasis.GetCartesian_Test=function() {\n  let axisnames=[\"X\",\"Y\",\"Z\",\"-X\",\"-Y\",\"-Z\"];\n  let axisvectors=[[1,0,0], [0,1,0], [0,0,1], [-1,0,0], [0,-1,0], [0,0,-1]];\n  for(let axis1=0; axis1 < 3; axis1++) {\n    for(let axis1inverted=0; axis1inverted < 2; axis1inverted++) {\n      let axis1name=axisnames[axis1+3*axis1inverted];\n      let axis1vector=axisvectors[axis1+3*axis1inverted];\n      for(let axis2=0; axis2 < 3; axis2++) {\n        if(axis2 != axis1) {\n          for(let axis2inverted=0; axis2inverted < 2; axis2inverted++) {\n            let axis2name=axisnames[axis2+3*axis2inverted];\n            let axis2vector=axisvectors[axis2+3*axis2inverted];\n            let orthobasis=OrthoNormalBasis.GetCartesian(axis1name, axis2name);\n            let test1=orthobasis.to3D(new Vector2D([1,0]));\n            let test2=orthobasis.to3D(new Vector2D([0,1]));\n            let expected1=new Vector3D(axis1vector);\n            let expected2=new Vector3D(axis2vector);\n            let d1=test1.distanceTo(expected1);\n            let d2=test2.distanceTo(expected2);\n            if( (d1 > 0.01) || (d2 > 0.01) ) {\n              throw new Error(\"Wrong!\");\n  }}}}}}\n  throw new Error(\"OK\");\n};\n*/\n\n// The z=0 plane, with the 3D x and y vectors mapped to the 2D x and y vector\nOrthoNormalBasis.Z0Plane = function () {\n  let plane = new Plane(new Vector3D([0, 0, 1]), 0)\n  return new OrthoNormalBasis(plane, new Vector3D([1, 0, 0]))\n}\n\nOrthoNormalBasis.prototype = {\n  getProjectionMatrix: function () {\n    const Matrix4x4 = require('./Matrix4') // FIXME: circular dependencies Matrix=>OrthoNormalBasis => Matrix\n    return new Matrix4x4([\n      this.u.x, this.v.x, this.plane.normal.x, 0,\n      this.u.y, this.v.y, this.plane.normal.y, 0,\n      this.u.z, this.v.z, this.plane.normal.z, 0,\n      0, 0, -this.plane.w, 1\n    ])\n  },\n\n  getInverseProjectionMatrix: function () {\n    const Matrix4x4 = require('./Matrix4') // FIXME: circular dependencies Matrix=>OrthoNormalBasis => Matrix\n    let p = this.plane.normal.times(this.plane.w)\n    return new Matrix4x4([\n      this.u.x, this.u.y, this.u.z, 0,\n      this.v.x, this.v.y, this.v.z, 0,\n      this.plane.normal.x, this.plane.normal.y, this.plane.normal.z, 0,\n      p.x, p.y, p.z, 1\n    ])\n  },\n\n  to2D: function (vec3) {\n    return new Vector2D(vec3.dot(this.u), vec3.dot(this.v))\n  },\n\n  to3D: function (vec2) {\n    return this.planeorigin.plus(this.u.times(vec2.x)).plus(this.v.times(vec2.y))\n  },\n\n  line3Dto2D: function (line3d) {\n    let a = line3d.point\n    let b = line3d.direction.plus(a)\n    let a2d = this.to2D(a)\n    let b2d = this.to2D(b)\n    return Line2D.fromPoints(a2d, b2d)\n  },\n\n  line2Dto3D: function (line2d) {\n    let a = line2d.origin()\n    let b = line2d.direction().plus(a)\n    let a3d = this.to3D(a)\n    let b3d = this.to3D(b)\n    return Line3D.fromPoints(a3d, b3d)\n  },\n\n  transform: function (matrix4x4) {\n    // todo: this may not work properly in case of mirroring\n    let newplane = this.plane.transform(matrix4x4)\n    let rightpointTransformed = this.u.transform(matrix4x4)\n    let originTransformed = new Vector3D(0, 0, 0).transform(matrix4x4)\n    let newrighthandvector = rightpointTransformed.minus(originTransformed)\n    let newbasis = new OrthoNormalBasis(newplane, newrighthandvector)\n    return newbasis\n  }\n}\n\nmodule.exports = OrthoNormalBasis\n\n},{\"./Line2\":55,\"./Line3\":56,\"./Matrix4\":57,\"./Plane\":60,\"./Vector2\":64,\"./Vector3\":65}],59:[function(require,module,exports){\nconst Vector2D = require('./Vector2')\nconst {EPS, angleEPS} = require('../constants')\nconst {parseOptionAs2DVector, parseOptionAsFloat, parseOptionAsInt, parseOptionAsBool} = require('../../api/optionParsers')\nconst {defaultResolution2D} = require('../constants')\nconst Vertex = require('./Vertex2')\nconst Side = require('./Side')\n\n/** Class Path2D\n * Represents a series of points, connected by infinitely thin lines.\n * A path can be open or closed, i.e. additional line between first and last points.\n * The difference between Path2D and CAG is that a path is a 'thin' line, whereas a CAG is an enclosed area.\n * @constructor\n * @param {Vector2D[]} [points=[]] - list of points\n * @param {boolean} [closed=false] - closer of path\n *\n * @example\n * new CSG.Path2D()\n * new CSG.Path2D([[10,10], [-10,10], [-10,-10], [10,-10]], true) // closed\n */\nconst Path2D = function (points, closed) {\n  closed = !!closed\n  points = points || []\n    // re-parse the points into Vector2D\n    // and remove any duplicate points\n  let prevpoint = null\n  if (closed && (points.length > 0)) {\n    prevpoint = new Vector2D(points[points.length - 1])\n  }\n  let newpoints = []\n  points.map(function (point) {\n    point = new Vector2D(point)\n    let skip = false\n    if (prevpoint !== null) {\n      let distance = point.distanceTo(prevpoint)\n      skip = distance < EPS\n    }\n    if (!skip) newpoints.push(point)\n    prevpoint = point\n  })\n  this.points = newpoints\n  this.closed = closed\n}\n\n/** Construct an arc.\n * @param {Object} [options] - options for construction\n * @param {Vector2D} [options.center=[0,0]] - center of circle\n * @param {Number} [options.radius=1] - radius of circle\n * @param {Number} [options.startangle=0] - starting angle of the arc, in degrees\n * @param {Number} [options.endangle=360] - ending angle of the arc, in degrees\n * @param {Number} [options.resolution=defaultResolution2D] - number of sides per 360 rotation\n * @param {Boolean} [options.maketangent=false] - adds line segments at both ends of the arc to ensure that the gradients at the edges are tangent\n * @returns {Path2D} new Path2D object (not closed)\n *\n * @example\n * let path = CSG.Path2D.arc({\n *   center: [5, 5],\n *   radius: 10,\n *   startangle: 90,\n *   endangle: 180,\n *   resolution: 36,\n *   maketangent: true\n * });\n */\nPath2D.arc = function (options) {\n  let center = parseOptionAs2DVector(options, 'center', 0)\n  let radius = parseOptionAsFloat(options, 'radius', 1)\n  let startangle = parseOptionAsFloat(options, 'startangle', 0)\n  let endangle = parseOptionAsFloat(options, 'endangle', 360)\n  let resolution = parseOptionAsInt(options, 'resolution', defaultResolution2D)\n  let maketangent = parseOptionAsBool(options, 'maketangent', false)\n    // no need to make multiple turns:\n  while (endangle - startangle >= 720) {\n    endangle -= 360\n  }\n  while (endangle - startangle <= -720) {\n    endangle += 360\n  }\n  let points = []\n  let point\n  let absangledif = Math.abs(endangle - startangle)\n  if (absangledif < angleEPS) {\n    point = Vector2D.fromAngle(startangle / 180.0 * Math.PI).times(radius)\n    points.push(point.plus(center))\n  } else {\n    let numsteps = Math.floor(resolution * absangledif / 360) + 1\n    let edgestepsize = numsteps * 0.5 / absangledif // step size for half a degree\n    if (edgestepsize > 0.25) edgestepsize = 0.25\n    let numstepsMod = maketangent ? (numsteps + 2) : numsteps\n    for (let i = 0; i <= numstepsMod; i++) {\n      let step = i\n      if (maketangent) {\n        step = (i - 1) * (numsteps - 2 * edgestepsize) / numsteps + edgestepsize\n        if (step < 0) step = 0\n        if (step > numsteps) step = numsteps\n      }\n      let angle = startangle + step * (endangle - startangle) / numsteps\n      point = Vector2D.fromAngle(angle / 180.0 * Math.PI).times(radius)\n      points.push(point.plus(center))\n    }\n  }\n  return new Path2D(points, false)\n}\n\nPath2D.prototype = {\n  concat: function (otherpath) {\n    if (this.closed || otherpath.closed) {\n      throw new Error('Paths must not be closed')\n    }\n    let newpoints = this.points.concat(otherpath.points)\n    return new Path2D(newpoints)\n  },\n\n  /**\n   * Get the points that make up the path.\n   * note that this is current internal list of points, not an immutable copy.\n   * @returns {Vector2[]} array of points the make up the path\n   */\n  getPoints: function () {\n    return this.points\n  },\n\n  /**\n   * Append an point to the end of the path.\n   * @param {Vector2D} point - point to append\n   * @returns {Path2D} new Path2D object (not closed)\n   */\n  appendPoint: function (point) {\n    if (this.closed) {\n      throw new Error('Path must not be closed')\n    }\n    point = new Vector2D(point) // cast to Vector2D\n    let newpoints = this.points.concat([point])\n    return new Path2D(newpoints)\n  },\n\n  /**\n   * Append a list of points to the end of the path.\n   * @param {Vector2D[]} points - points to append\n   * @returns {Path2D} new Path2D object (not closed)\n   */\n  appendPoints: function (points) {\n    if (this.closed) {\n      throw new Error('Path must not be closed')\n    }\n    let newpoints = this.points\n    points.forEach(function (point) {\n      newpoints.push(new Vector2D(point)) // cast to Vector2D\n    })\n    return new Path2D(newpoints)\n  },\n\n  close: function () {\n    return new Path2D(this.points, true)\n  },\n\n  /**\n   * Determine if the path is a closed or not.\n   * @returns {Boolean} true when the path is closed, otherwise false\n   */\n  isClosed: function () {\n    return this.closed\n  },\n\n  /**\n   * Determine the overall clockwise or anti-clockwise turn of a path.\n   * See: http://mathworld.wolfram.com/PolygonArea.html\n   * @returns {String} One of ['clockwise', 'counter-clockwise', 'straight'].\n   */\n  getTurn: function () {\n    const points = this.points;\n    let twice_area = 0;\n    let last = points.length - 1;\n    for (let current = 0; current < points.length; last = current++) {\n      twice_area += points[last].x * points[current].y - points[last].y * points[current].x;\n    }\n    if (twice_area > 0) {\n      return 'clockwise';\n    } else if (twice_area < 0) {\n      return 'counter-clockwise';\n    } else {\n      return 'straight';\n    }\n  },\n\n    // Extrude the path by following it with a rectangle (upright, perpendicular to the path direction)\n    // Returns a CSG solid\n    //   width: width of the extrusion, in the z=0 plane\n    //   height: height of the extrusion in the z direction\n    //   resolution: number of segments per 360 degrees for the curve in a corner\n  rectangularExtrude: function (width, height, resolution) {\n    let cag = this.expandToCAG(width / 2, resolution)\n    let result = cag.extrude({\n      offset: [0, 0, height]\n    })\n    return result\n  },\n\n    // Expand the path to a CAG\n    // This traces the path with a circle with radius pathradius\n  expandToCAG: function (pathradius, resolution) {\n    const CAG = require('../CAG') // FIXME: cyclic dependencies CAG => PATH2 => CAG\n    let sides = []\n    let numpoints = this.points.length\n    let startindex = 0\n    if (this.closed && (numpoints > 2)) startindex = -1\n    let prevvertex\n    for (let i = startindex; i < numpoints; i++) {\n      let pointindex = i\n      if (pointindex < 0) pointindex = numpoints - 1\n      let point = this.points[pointindex]\n      let vertex = new Vertex(point)\n      if (i > startindex) {\n        let side = new Side(prevvertex, vertex)\n        sides.push(side)\n      }\n      prevvertex = vertex\n    }\n    let shellcag = CAG.fromSides(sides)\n    let expanded = shellcag.expandedShell(pathradius, resolution)\n    return expanded\n  },\n\n  innerToCAG: function () {\n    const CAG = require('../CAG') // FIXME: cyclic dependencies CAG => PATH2 => CAG\n    if (!this.closed) throw new Error('The path should be closed!')\n    return CAG.fromPoints(this.points)\n  },\n\n  transform: function (matrix4x4) {\n    let newpoints = this.points.map(function (point) {\n      return point.multiply4x4(matrix4x4)\n    })\n    return new Path2D(newpoints, this.closed)\n  },\n\n  /**\n   * Append a Bezier curve to the end of the path, using the control points to transition the curve through start and end points.\n   * <br>\n   * The Bézier curve starts at the last point in the path,\n   * and ends at the last given control point. Other control points are intermediate control points.\n   * <br>\n   * The first control point may be null to ensure a smooth transition occurs. In this case,\n   * the second to last control point of the path is mirrored into the control points of the Bezier curve.\n   * In other words, the trailing gradient of the path matches the new gradient of the curve.\n   * @param {Vector2D[]} controlpoints - list of control points\n   * @param {Object} [options] - options for construction\n   * @param {Number} [options.resolution=defaultResolution2D] - number of sides per 360 rotation\n   * @returns {Path2D} new Path2D object (not closed)\n   *\n   * @example\n   * let p5 = new CSG.Path2D([[10,-20]],false);\n   * p5 = p5.appendBezier([[10,-10],[25,-10],[25,-20]]);\n   * p5 = p5.appendBezier([[25,-30],[40,-30],[40,-20]]);\n   */\n  appendBezier: function (controlpoints, options) {\n    if (arguments.length < 2) {\n      options = {}\n    }\n    if (this.closed) {\n      throw new Error('Path must not be closed')\n    }\n    if (!(controlpoints instanceof Array)) {\n      throw new Error('appendBezier: should pass an array of control points')\n    }\n    if (controlpoints.length < 1) {\n      throw new Error('appendBezier: need at least 1 control point')\n    }\n    if (this.points.length < 1) {\n      throw new Error('appendBezier: path must already contain a point (the endpoint of the path is used as the starting point for the bezier curve)')\n    }\n    let resolution = parseOptionAsInt(options, 'resolution', defaultResolution2D)\n    if (resolution < 4) resolution = 4\n    let factorials = []\n    let controlpointsParsed = []\n    controlpointsParsed.push(this.points[this.points.length - 1]) // start at the previous end point\n    for (let i = 0; i < controlpoints.length; ++i) {\n      let p = controlpoints[i]\n      if (p === null) {\n                // we can pass null as the first control point. In that case a smooth gradient is ensured:\n        if (i !== 0) {\n          throw new Error('appendBezier: null can only be passed as the first control point')\n        }\n        if (controlpoints.length < 2) {\n          throw new Error('appendBezier: null can only be passed if there is at least one more control point')\n        }\n        let lastBezierControlPoint\n        if ('lastBezierControlPoint' in this) {\n          lastBezierControlPoint = this.lastBezierControlPoint\n        } else {\n          if (this.points.length < 2) {\n            throw new Error('appendBezier: null is passed as a control point but this requires a previous bezier curve or at least two points in the existing path')\n          }\n          lastBezierControlPoint = this.points[this.points.length - 2]\n        }\n                // mirror the last bezier control point:\n        p = this.points[this.points.length - 1].times(2).minus(lastBezierControlPoint)\n      } else {\n        p = new Vector2D(p) // cast to Vector2D\n      }\n      controlpointsParsed.push(p)\n    }\n    let bezierOrder = controlpointsParsed.length - 1\n    let fact = 1\n    for (let i = 0; i <= bezierOrder; ++i) {\n      if (i > 0) fact *= i\n      factorials.push(fact)\n    }\n    let binomials = []\n    for (let i = 0; i <= bezierOrder; ++i) {\n      let binomial = factorials[bezierOrder] / (factorials[i] * factorials[bezierOrder - i])\n      binomials.push(binomial)\n    }\n    let getPointForT = function (t) {\n      let t_k = 1 // = pow(t,k)\n      let one_minus_t_n_minus_k = Math.pow(1 - t, bezierOrder) // = pow( 1-t, bezierOrder - k)\n      let inv_1_minus_t = (t !== 1) ? (1 / (1 - t)) : 1\n      let point = new Vector2D(0, 0)\n      for (let k = 0; k <= bezierOrder; ++k) {\n        if (k === bezierOrder) one_minus_t_n_minus_k = 1\n        let bernstein_coefficient = binomials[k] * t_k * one_minus_t_n_minus_k\n        point = point.plus(controlpointsParsed[k].times(bernstein_coefficient))\n        t_k *= t\n        one_minus_t_n_minus_k *= inv_1_minus_t\n      }\n      return point\n    }\n    let newpoints = []\n    let newpoints_t = []\n    let numsteps = bezierOrder + 1\n    for (let i = 0; i < numsteps; ++i) {\n      let t = i / (numsteps - 1)\n      let point = getPointForT(t)\n      newpoints.push(point)\n      newpoints_t.push(t)\n    }\n    // subdivide each segment until the angle at each vertex becomes small enough:\n    let subdivideBase = 1\n    let maxangle = Math.PI * 2 / resolution // segments may have differ no more in angle than this\n    let maxsinangle = Math.sin(maxangle)\n    while (subdivideBase < newpoints.length - 1) {\n      let dir1 = newpoints[subdivideBase].minus(newpoints[subdivideBase - 1]).unit()\n      let dir2 = newpoints[subdivideBase + 1].minus(newpoints[subdivideBase]).unit()\n      let sinangle = dir1.cross(dir2) // this is the sine of the angle\n      if (Math.abs(sinangle) > maxsinangle) {\n                // angle is too big, we need to subdivide\n        let t0 = newpoints_t[subdivideBase - 1]\n        let t1 = newpoints_t[subdivideBase + 1]\n        let t0_new = t0 + (t1 - t0) * 1 / 3\n        let t1_new = t0 + (t1 - t0) * 2 / 3\n        let point0_new = getPointForT(t0_new)\n        let point1_new = getPointForT(t1_new)\n                // remove the point at subdivideBase and replace with 2 new points:\n        newpoints.splice(subdivideBase, 1, point0_new, point1_new)\n        newpoints_t.splice(subdivideBase, 1, t0_new, t1_new)\n                // re - evaluate the angles, starting at the previous junction since it has changed:\n        subdivideBase--\n        if (subdivideBase < 1) subdivideBase = 1\n      } else {\n        ++subdivideBase\n      }\n    }\n        // append to the previous points, but skip the first new point because it is identical to the last point:\n    newpoints = this.points.concat(newpoints.slice(1))\n    let result = new Path2D(newpoints)\n    result.lastBezierControlPoint = controlpointsParsed[controlpointsParsed.length - 2]\n    return result\n  },\n\n  /**\n   * Append an arc to the end of the path.\n   * This implementation follows the SVG arc specs. For the details see\n   * http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\n   * @param {Vector2D} endpoint - end point of arc\n   * @param {Object} [options] - options for construction\n   * @param {Number} [options.radius=0] - radius of arc (X and Y), see also xradius and yradius\n   * @param {Number} [options.xradius=0] - X radius of arc, see also radius\n   * @param {Number} [options.yradius=0] - Y radius of arc, see also radius\n   * @param {Number} [options.xaxisrotation=0] -  rotation (in degrees) of the X axis of the arc with respect to the X axis of the coordinate system\n   * @param {Number} [options.resolution=defaultResolution2D] - number of sides per 360 rotation\n   * @param {Boolean} [options.clockwise=false] - draw an arc clockwise with respect to the center point\n   * @param {Boolean} [options.large=false] - draw an arc longer than 180 degrees\n   * @returns {Path2D} new Path2D object (not closed)\n   *\n   * @example\n   * let p1 = new CSG.Path2D([[27.5,-22.96875]],false);\n   * p1 = p1.appendPoint([27.5,-3.28125]);\n   * p1 = p1.appendArc([12.5,-22.96875],{xradius: 15,yradius: -19.6875,xaxisrotation: 0,clockwise: false,large: false});\n   * p1 = p1.close();\n   */\n  appendArc: function (endpoint, options) {\n    let decimals = 100000\n    if (arguments.length < 2) {\n      options = {}\n    }\n    if (this.closed) {\n      throw new Error('Path must not be closed')\n    }\n    if (this.points.length < 1) {\n      throw new Error('appendArc: path must already contain a point (the endpoint of the path is used as the starting point for the arc)')\n    }\n    let resolution = parseOptionAsInt(options, 'resolution', defaultResolution2D)\n    if (resolution < 4) resolution = 4\n    let xradius, yradius\n    if (('xradius' in options) || ('yradius' in options)) {\n      if ('radius' in options) {\n        throw new Error('Should either give an xradius and yradius parameter, or a radius parameter')\n      }\n      xradius = parseOptionAsFloat(options, 'xradius', 0)\n      yradius = parseOptionAsFloat(options, 'yradius', 0)\n    } else {\n      xradius = parseOptionAsFloat(options, 'radius', 0)\n      yradius = xradius\n    }\n    let xaxisrotation = parseOptionAsFloat(options, 'xaxisrotation', 0)\n    let clockwise = parseOptionAsBool(options, 'clockwise', false)\n    let largearc = parseOptionAsBool(options, 'large', false)\n    let startpoint = this.points[this.points.length - 1]\n    endpoint = new Vector2D(endpoint)\n        // round to precision in order to have determinate calculations\n    xradius = Math.round(xradius * decimals) / decimals\n    yradius = Math.round(yradius * decimals) / decimals\n    endpoint = new Vector2D(Math.round(endpoint.x * decimals) / decimals, Math.round(endpoint.y * decimals) / decimals)\n\n    let sweepFlag = !clockwise\n    let newpoints = []\n    if ((xradius === 0) || (yradius === 0)) {\n            // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes:\n            // If rx = 0 or ry = 0, then treat this as a straight line from (x1, y1) to (x2, y2) and stop\n      newpoints.push(endpoint)\n    } else {\n      xradius = Math.abs(xradius)\n      yradius = Math.abs(yradius)\n\n            // see http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes :\n      let phi = xaxisrotation * Math.PI / 180.0\n      let cosphi = Math.cos(phi)\n      let sinphi = Math.sin(phi)\n      let minushalfdistance = startpoint.minus(endpoint).times(0.5)\n            // F.6.5.1:\n            // round to precision in order to have determinate calculations\n      let x = Math.round((cosphi * minushalfdistance.x + sinphi * minushalfdistance.y) * decimals) / decimals\n      let y = Math.round((-sinphi * minushalfdistance.x + cosphi * minushalfdistance.y) * decimals) / decimals\n      let startTranslated = new Vector2D(x, y)\n            // F.6.6.2:\n      let biglambda = (startTranslated.x * startTranslated.x) / (xradius * xradius) + (startTranslated.y * startTranslated.y) / (yradius * yradius)\n      if (biglambda > 1.0) {\n                // F.6.6.3:\n        let sqrtbiglambda = Math.sqrt(biglambda)\n        xradius *= sqrtbiglambda\n        yradius *= sqrtbiglambda\n                // round to precision in order to have determinate calculations\n        xradius = Math.round(xradius * decimals) / decimals\n        yradius = Math.round(yradius * decimals) / decimals\n      }\n            // F.6.5.2:\n      let multiplier1 = Math.sqrt((xradius * xradius * yradius * yradius - xradius * xradius * startTranslated.y * startTranslated.y - yradius * yradius * startTranslated.x * startTranslated.x) / (xradius * xradius * startTranslated.y * startTranslated.y + yradius * yradius * startTranslated.x * startTranslated.x))\n      if (sweepFlag === largearc) multiplier1 = -multiplier1\n      let centerTranslated = new Vector2D(xradius * startTranslated.y / yradius, -yradius * startTranslated.x / xradius).times(multiplier1)\n            // F.6.5.3:\n      let center = new Vector2D(cosphi * centerTranslated.x - sinphi * centerTranslated.y, sinphi * centerTranslated.x + cosphi * centerTranslated.y).plus((startpoint.plus(endpoint)).times(0.5))\n            // F.6.5.5:\n      let vec1 = new Vector2D((startTranslated.x - centerTranslated.x) / xradius, (startTranslated.y - centerTranslated.y) / yradius)\n      let vec2 = new Vector2D((-startTranslated.x - centerTranslated.x) / xradius, (-startTranslated.y - centerTranslated.y) / yradius)\n      let theta1 = vec1.angleRadians()\n      let theta2 = vec2.angleRadians()\n      let deltatheta = theta2 - theta1\n      deltatheta = deltatheta % (2 * Math.PI)\n      if ((!sweepFlag) && (deltatheta > 0)) {\n        deltatheta -= 2 * Math.PI\n      } else if ((sweepFlag) && (deltatheta < 0)) {\n        deltatheta += 2 * Math.PI\n      }\n\n            // Ok, we have the center point and angle range (from theta1, deltatheta radians) so we can create the ellipse\n      let numsteps = Math.ceil(Math.abs(deltatheta) / (2 * Math.PI) * resolution) + 1\n      if (numsteps < 1) numsteps = 1\n      for (let step = 1; step <= numsteps; step++) {\n        let theta = theta1 + step / numsteps * deltatheta\n        let costheta = Math.cos(theta)\n        let sintheta = Math.sin(theta)\n                // F.6.3.1:\n        let point = new Vector2D(cosphi * xradius * costheta - sinphi * yradius * sintheta, sinphi * xradius * costheta + cosphi * yradius * sintheta).plus(center)\n        newpoints.push(point)\n      }\n    }\n    newpoints = this.points.concat(newpoints)\n    let result = new Path2D(newpoints)\n    return result\n  }\n}\n\nmodule.exports = Path2D\n\n},{\"../../api/optionParsers\":38,\"../CAG\":45,\"../constants\":54,\"./Side\":63,\"./Vector2\":64,\"./Vertex2\":66}],60:[function(require,module,exports){\nconst Vector3D = require('./Vector3')\nconst Line3D = require('./Line3')\nconst {EPS, getTag} = require('../constants')\n\n// # class Plane\n// Represents a plane in 3D space.\nconst Plane = function (normal, w) {\n  this.normal = normal\n  this.w = w\n}\n\n// create from an untyped object with identical property names:\nPlane.fromObject = function (obj) {\n  let normal = new Vector3D(obj.normal)\n  let w = parseFloat(obj.w)\n  return new Plane(normal, w)\n}\n\nPlane.fromVector3Ds = function (a, b, c) {\n  let n = b.minus(a).cross(c.minus(a)).unit()\n  return new Plane(n, n.dot(a))\n}\n\n// like fromVector3Ds, but allow the vectors to be on one point or one line\n// in such a case a random plane through the given points is constructed\nPlane.anyPlaneFromVector3Ds = function (a, b, c) {\n  let v1 = b.minus(a)\n  let v2 = c.minus(a)\n  if (v1.length() < EPS) {\n    v1 = v2.randomNonParallelVector()\n  }\n  if (v2.length() < EPS) {\n    v2 = v1.randomNonParallelVector()\n  }\n  let normal = v1.cross(v2)\n  if (normal.length() < EPS) {\n        // this would mean that v1 == v2.negated()\n    v2 = v1.randomNonParallelVector()\n    normal = v1.cross(v2)\n  }\n  normal = normal.unit()\n  return new Plane(normal, normal.dot(a))\n}\n\nPlane.fromPoints = function (a, b, c) {\n  a = new Vector3D(a)\n  b = new Vector3D(b)\n  c = new Vector3D(c)\n  return Plane.fromVector3Ds(a, b, c)\n}\n\nPlane.fromNormalAndPoint = function (normal, point) {\n  normal = new Vector3D(normal)\n  point = new Vector3D(point)\n  normal = normal.unit()\n  let w = point.dot(normal)\n  return new Plane(normal, w)\n}\n\nPlane.prototype = {\n  flipped: function () {\n    return new Plane(this.normal.negated(), -this.w)\n  },\n\n  getTag: function () {\n    let result = this.tag\n    if (!result) {\n      result = getTag()\n      this.tag = result\n    }\n    return result\n  },\n\n  equals: function (n) {\n    return this.normal.equals(n.normal) && this.w === n.w\n  },\n\n  transform: function (matrix4x4) {\n    let ismirror = matrix4x4.isMirroring()\n        // get two vectors in the plane:\n    let r = this.normal.randomNonParallelVector()\n    let u = this.normal.cross(r)\n    let v = this.normal.cross(u)\n        // get 3 points in the plane:\n    let point1 = this.normal.times(this.w)\n    let point2 = point1.plus(u)\n    let point3 = point1.plus(v)\n        // transform the points:\n    point1 = point1.multiply4x4(matrix4x4)\n    point2 = point2.multiply4x4(matrix4x4)\n    point3 = point3.multiply4x4(matrix4x4)\n        // and create a new plane from the transformed points:\n    let newplane = Plane.fromVector3Ds(point1, point2, point3)\n    if (ismirror) {\n            // the transform is mirroring\n            // We should mirror the plane:\n      newplane = newplane.flipped()\n    }\n    return newplane\n  },\n\n    // robust splitting of a line by a plane\n    // will work even if the line is parallel to the plane\n  splitLineBetweenPoints: function (p1, p2) {\n    let direction = p2.minus(p1)\n    let labda = (this.w - this.normal.dot(p1)) / this.normal.dot(direction)\n    if (isNaN(labda)) labda = 0\n    if (labda > 1) labda = 1\n    if (labda < 0) labda = 0\n    let result = p1.plus(direction.times(labda))\n    return result\n  },\n\n    // returns Vector3D\n  intersectWithLine: function (line3d) {\n    return line3d.intersectWithPlane(this)\n  },\n\n    // intersection of two planes\n  intersectWithPlane: function (plane) {\n    return Line3D.fromPlanes(this, plane)\n  },\n\n  signedDistanceToPoint: function (point) {\n    let t = this.normal.dot(point) - this.w\n    return t\n  },\n\n  toString: function () {\n    return '[normal: ' + this.normal.toString() + ', w: ' + this.w + ']'\n  },\n\n  mirrorPoint: function (point3d) {\n    let distance = this.signedDistanceToPoint(point3d)\n    let mirrored = point3d.minus(this.normal.times(distance * 2.0))\n    return mirrored\n  }\n}\n\nmodule.exports = Plane\n\n},{\"../constants\":54,\"./Line3\":56,\"./Vector3\":65}],61:[function(require,module,exports){\nconst CAG = require('../CAG')\nconst {fromPoints} = require('../CAGFactories')\n\n/*\n2D polygons are now supported through the CAG class.\nWith many improvements (see documentation):\n  - shapes do no longer have to be convex\n  - union/intersect/subtract is supported\n  - expand / contract are supported\n\nBut we'll keep CSG.Polygon2D as a stub for backwards compatibility\n*/\nfunction Polygon2D (points) {\n  const cag = fromPoints(points)\n  this.sides = cag.sides\n}\n\nPolygon2D.prototype = CAG.prototype\n\nmodule.exports = Polygon2D\n\n},{\"../CAG\":45,\"../CAGFactories\":46}],62:[function(require,module,exports){\nconst Vector3D = require('./Vector3')\nconst Vertex = require('./Vertex3')\nconst Matrix4x4 = require('./Matrix4')\nconst {_CSGDEBUG, EPS, getTag, areaEPS} = require('../constants')\n\n/** Class Polygon\n * Represents a convex polygon. The vertices used to initialize a polygon must\n *   be coplanar and form a convex loop. They do not have to be `Vertex`\n *   instances but they must behave similarly (duck typing can be used for\n *   customization).\n * <br>\n * Each convex polygon has a `shared` property, which is shared between all\n *   polygons that are clones of each other or were split from the same polygon.\n *   This can be used to define per-polygon properties (such as surface color).\n * <br>\n * The plane of the polygon is calculated from the vertex coordinates if not provided.\n *   The plane can alternatively be passed as the third argument to avoid calculations.\n *\n * @constructor\n * @param {Vertex[]} vertices - list of vertices\n * @param {Polygon.Shared} [shared=defaultShared] - shared property to apply\n * @param {Plane} [plane] - plane of the polygon\n *\n * @example\n * const vertices = [\n *   new CSG.Vertex(new CSG.Vector3D([0, 0, 0])),\n *   new CSG.Vertex(new CSG.Vector3D([0, 10, 0])),\n *   new CSG.Vertex(new CSG.Vector3D([0, 10, 10]))\n * ]\n * let observed = new Polygon(vertices)\n */\nlet Polygon = function (vertices, shared, plane) {\n  this.vertices = vertices\n  if (!shared) shared = Polygon.defaultShared\n  this.shared = shared\n    // let numvertices = vertices.length;\n\n  if (arguments.length >= 3) {\n    this.plane = plane\n  } else {\n    const Plane = require('./Plane') // FIXME: circular dependencies\n    this.plane = Plane.fromVector3Ds(vertices[0].pos, vertices[1].pos, vertices[2].pos)\n  }\n\n  if (_CSGDEBUG) {\n    if (!this.checkIfConvex()) {\n      throw new Error('Not convex!')\n    }\n  }\n}\n\nPolygon.prototype = {\n  /** Check whether the polygon is convex. (it should be, otherwise we will get unexpected results)\n   * @returns {boolean}\n   */\n  checkIfConvex: function () {\n    return Polygon.verticesConvex(this.vertices, this.plane.normal)\n  },\n\n  // FIXME what? why does this return this, and not a new polygon?\n  // FIXME is this used?\n  setColor: function (args) {\n    let newshared = Polygon.Shared.fromColor.apply(this, arguments)\n    this.shared = newshared\n    return this\n  },\n\n  getSignedVolume: function () {\n    let signedVolume = 0\n    for (let i = 0; i < this.vertices.length - 2; i++) {\n      signedVolume += this.vertices[0].pos.dot(this.vertices[i + 1].pos\n                .cross(this.vertices[i + 2].pos))\n    }\n    signedVolume /= 6\n    return signedVolume\n  },\n\n    // Note: could calculate vectors only once to speed up\n  getArea: function () {\n    let polygonArea = 0\n    for (let i = 0; i < this.vertices.length - 2; i++) {\n      polygonArea += this.vertices[i + 1].pos.minus(this.vertices[0].pos)\n                .cross(this.vertices[i + 2].pos.minus(this.vertices[i + 1].pos)).length()\n    }\n    polygonArea /= 2\n    return polygonArea\n  },\n\n    // accepts array of features to calculate\n    // returns array of results\n  getTetraFeatures: function (features) {\n    let result = []\n    features.forEach(function (feature) {\n      if (feature === 'volume') {\n        result.push(this.getSignedVolume())\n      } else if (feature === 'area') {\n        result.push(this.getArea())\n      }\n    }, this)\n    return result\n  },\n\n    // Extrude a polygon into the direction offsetvector\n    // Returns a CSG object\n  extrude: function (offsetvector) {\n    const {fromPolygons} = require('../CSGFactories') // because of circular dependencies\n\n    let newpolygons = []\n\n    let polygon1 = this\n    let direction = polygon1.plane.normal.dot(offsetvector)\n    if (direction > 0) {\n      polygon1 = polygon1.flipped()\n    }\n    newpolygons.push(polygon1)\n    let polygon2 = polygon1.translate(offsetvector)\n    let numvertices = this.vertices.length\n    for (let i = 0; i < numvertices; i++) {\n      let sidefacepoints = []\n      let nexti = (i < (numvertices - 1)) ? i + 1 : 0\n      sidefacepoints.push(polygon1.vertices[i].pos)\n      sidefacepoints.push(polygon2.vertices[i].pos)\n      sidefacepoints.push(polygon2.vertices[nexti].pos)\n      sidefacepoints.push(polygon1.vertices[nexti].pos)\n      let sidefacepolygon = Polygon.createFromPoints(sidefacepoints, this.shared)\n      newpolygons.push(sidefacepolygon)\n    }\n    polygon2 = polygon2.flipped()\n    newpolygons.push(polygon2)\n    return fromPolygons(newpolygons)\n  },\n\n  translate: function (offset) {\n    return this.transform(Matrix4x4.translation(offset))\n  },\n\n    // returns an array with a Vector3D (center point) and a radius\n  boundingSphere: function () {\n    if (!this.cachedBoundingSphere) {\n      let box = this.boundingBox()\n      let middle = box[0].plus(box[1]).times(0.5)\n      let radius3 = box[1].minus(middle)\n      let radius = radius3.length()\n      this.cachedBoundingSphere = [middle, radius]\n    }\n    return this.cachedBoundingSphere\n  },\n\n    // returns an array of two Vector3Ds (minimum coordinates and maximum coordinates)\n  boundingBox: function () {\n    if (!this.cachedBoundingBox) {\n      let minpoint, maxpoint\n      let vertices = this.vertices\n      let numvertices = vertices.length\n      if (numvertices === 0) {\n        minpoint = new Vector3D(0, 0, 0)\n      } else {\n        minpoint = vertices[0].pos\n      }\n      maxpoint = minpoint\n      for (let i = 1; i < numvertices; i++) {\n        let point = vertices[i].pos\n        minpoint = minpoint.min(point)\n        maxpoint = maxpoint.max(point)\n      }\n      this.cachedBoundingBox = [minpoint, maxpoint]\n    }\n    return this.cachedBoundingBox\n  },\n\n  flipped: function () {\n    let newvertices = this.vertices.map(function (v) {\n      return v.flipped()\n    })\n    newvertices.reverse()\n    let newplane = this.plane.flipped()\n    return new Polygon(newvertices, this.shared, newplane)\n  },\n\n    // Affine transformation of polygon. Returns a new Polygon\n  transform: function (matrix4x4) {\n    let newvertices = this.vertices.map(function (v) {\n      return v.transform(matrix4x4)\n    })\n    let newplane = this.plane.transform(matrix4x4)\n    if (matrix4x4.isMirroring()) {\n            // need to reverse the vertex order\n            // in order to preserve the inside/outside orientation:\n      newvertices.reverse()\n    }\n    return new Polygon(newvertices, this.shared, newplane)\n  },\n\n  toString: function () {\n    let result = 'Polygon plane: ' + this.plane.toString() + '\\n'\n    this.vertices.map(function (vertex) {\n      result += '  ' + vertex.toString() + '\\n'\n    })\n    return result\n  },\n\n    // project the 3D polygon onto a plane\n  projectToOrthoNormalBasis: function (orthobasis) {\n    const CAG = require('../CAG')\n    const {fromPointsNoCheck} = require('../CAGFactories') // circular dependencies\n    let points2d = this.vertices.map(function (vertex) {\n      return orthobasis.to2D(vertex.pos)\n    })\n\n    let result = fromPointsNoCheck(points2d)\n    let area = result.area()\n    if (Math.abs(area) < areaEPS) {\n      // the polygon was perpendicular to the orthnormal plane. The resulting 2D polygon would be degenerate\n      // return an empty area instead:\n      result = new CAG()\n    } else if (area < 0) {\n      result = result.flipped()\n    }\n    return result\n  },\n\n  // ALIAS ONLY!!\n  solidFromSlices: function (options) {\n    const solidFromSlices = require('../../api/solidFromSlices')\n    return solidFromSlices(this, options)\n  }\n\n}\n\n// create from an untyped object with identical property names:\nPolygon.fromObject = function (obj) {\n  const Plane = require('./Plane') // FIXME: circular dependencies\n  let vertices = obj.vertices.map(function (v) {\n    return Vertex.fromObject(v)\n  })\n  let shared = Polygon.Shared.fromObject(obj.shared)\n  let plane = Plane.fromObject(obj.plane)\n  return new Polygon(vertices, shared, plane)\n}\n\n/** Create a polygon from the given points.\n *\n * @param {Array[]} points - list of points\n * @param {Polygon.Shared} [shared=defaultShared] - shared property to apply\n * @param {Plane} [plane] - plane of the polygon\n *\n * @example\n * const points = [\n *   [0,  0, 0],\n *   [0, 10, 0],\n *   [0, 10, 10]\n * ]\n * let observed = CSG.Polygon.createFromPoints(points)\n */\nPolygon.createFromPoints = function (points, shared, plane) {\n  // FIXME : this circular dependency does not work !\n  // const {fromPoints} = require('./polygon3Factories')\n  // return fromPoints(points, shared, plane)\n  let vertices = []\n  points.map(function (p) {\n    let vec = new Vector3D(p)\n    let vertex = new Vertex(vec)\n    vertices.push(vertex)\n  })\n  let polygon\n  if (arguments.length < 3) {\n    polygon = new Polygon(vertices, shared)\n  } else {\n    polygon = new Polygon(vertices, shared, plane)\n  }\n  return polygon\n}\n\nPolygon.verticesConvex = function (vertices, planenormal) {\n  let numvertices = vertices.length\n  if (numvertices > 2) {\n    let prevprevpos = vertices[numvertices - 2].pos\n    let prevpos = vertices[numvertices - 1].pos\n    for (let i = 0; i < numvertices; i++) {\n      let pos = vertices[i].pos\n      if (!Polygon.isConvexPoint(prevprevpos, prevpos, pos, planenormal)) {\n        return false\n      }\n      prevprevpos = prevpos\n      prevpos = pos\n    }\n  }\n  return true\n}\n\n// calculate whether three points form a convex corner\n//  prevpoint, point, nextpoint: the 3 coordinates (Vector3D instances)\n//  normal: the normal vector of the plane\nPolygon.isConvexPoint = function (prevpoint, point, nextpoint, normal) {\n  let crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point))\n  let crossdotnormal = crossproduct.dot(normal)\n  return (crossdotnormal >= 0)\n}\n\nPolygon.isStrictlyConvexPoint = function (prevpoint, point, nextpoint, normal) {\n  let crossproduct = point.minus(prevpoint).cross(nextpoint.minus(point))\n  let crossdotnormal = crossproduct.dot(normal)\n  return (crossdotnormal >= EPS)\n}\n\n/** Class Polygon.Shared\n * Holds the shared properties for each polygon (Currently only color).\n * @constructor\n * @param {Array[]} color - array containing RGBA values, or null\n *\n * @example\n *   let shared = new CSG.Polygon.Shared([0, 0, 0, 1])\n */\nPolygon.Shared = function (color) {\n  if (color !== null && color !== undefined) {\n    if (color.length !== 4) {\n      throw new Error('Expecting 4 element array')\n    }\n  }\n  this.color = color\n}\n\nPolygon.Shared.fromObject = function (obj) {\n  return new Polygon.Shared(obj.color)\n}\n\n/** Create Polygon.Shared from color values.\n * @param {number} r - value of RED component\n * @param {number} g - value of GREEN component\n * @param {number} b - value of BLUE component\n * @param {number} [a] - value of ALPHA component\n * @param {Array[]} [color] - OR array containing RGB values (optional Alpha)\n *\n * @example\n * let s1 = Polygon.Shared.fromColor(0,0,0)\n * let s2 = Polygon.Shared.fromColor([0,0,0,1])\n */\nPolygon.Shared.fromColor = function (args) {\n  let color\n  if (arguments.length === 1) {\n    color = arguments[0].slice() // make deep copy\n  } else {\n    color = []\n    for (let i = 0; i < arguments.length; i++) {\n      color.push(arguments[i])\n    }\n  }\n  if (color.length === 3) {\n    color.push(1)\n  } else if (color.length !== 4) {\n    throw new Error('setColor expects either an array with 3 or 4 elements, or 3 or 4 parameters.')\n  }\n  return new Polygon.Shared(color)\n}\n\nPolygon.Shared.prototype = {\n  getTag: function () {\n    let result = this.tag\n    if (!result) {\n      result = getTag()\n      this.tag = result\n    }\n    return result\n  },\n    // get a string uniquely identifying this object\n  getHash: function () {\n    if (!this.color) return 'null'\n    return this.color.join('/')\n  }\n}\n\nPolygon.defaultShared = new Polygon.Shared(null)\n\nmodule.exports = Polygon\n\n},{\"../../api/solidFromSlices\":43,\"../CAG\":45,\"../CAGFactories\":46,\"../CSGFactories\":48,\"../constants\":54,\"./Matrix4\":57,\"./Plane\":60,\"./Vector3\":65,\"./Vertex3\":67}],63:[function(require,module,exports){\nconst Vector2D = require('./Vector2')\nconst Vertex = require('./Vertex2')\nconst Vertex3 = require('./Vertex3')\nconst Polygon = require('./Polygon3')\nconst {getTag} = require('../constants')\n\nconst Side = function (vertex0, vertex1) {\n  if (!(vertex0 instanceof Vertex)) throw new Error('Assertion failed')\n  if (!(vertex1 instanceof Vertex)) throw new Error('Assertion failed')\n  this.vertex0 = vertex0\n  this.vertex1 = vertex1\n}\n\nSide.fromObject = function (obj) {\n  var vertex0 = Vertex.fromObject(obj.vertex0)\n  var vertex1 = Vertex.fromObject(obj.vertex1)\n  return new Side(vertex0, vertex1)\n}\n\nSide._fromFakePolygon = function (polygon) {\n    // this can happen based on union, seems to be residuals -\n    // return null and handle in caller\n  if (polygon.vertices.length < 4) {\n    return null\n  }\n  var vert1Indices = []\n  var pts2d = polygon.vertices.filter(function (v, i) {\n    if (v.pos.z > 0) {\n      vert1Indices.push(i)\n      return true\n    }\n    return false\n  })\n    .map(function (v) {\n      return new Vector2D(v.pos.x, v.pos.y)\n    })\n  if (pts2d.length !== 2) {\n    throw new Error('Assertion failed: _fromFakePolygon: not enough points found')\n  }\n  var d = vert1Indices[1] - vert1Indices[0]\n  if (d === 1 || d === 3) {\n    if (d === 1) {\n      pts2d.reverse()\n    }\n  } else {\n    throw new Error('Assertion failed: _fromFakePolygon: unknown index ordering')\n  }\n  var result = new Side(new Vertex(pts2d[0]), new Vertex(pts2d[1]))\n  return result\n}\n\nSide.prototype = {\n  toString: function () {\n    return this.vertex0 + ' -> ' + this.vertex1\n  },\n\n  toPolygon3D: function (z0, z1) {\n    // console.log(this.vertex0.pos)\n    const vertices = [\n      new Vertex3(this.vertex0.pos.toVector3D(z0)),\n      new Vertex3(this.vertex1.pos.toVector3D(z0)),\n      new Vertex3(this.vertex1.pos.toVector3D(z1)),\n      new Vertex3(this.vertex0.pos.toVector3D(z1))\n    ]\n    return new Polygon(vertices)\n  },\n\n  transform: function (matrix4x4) {\n    var newp1 = this.vertex0.pos.transform(matrix4x4)\n    var newp2 = this.vertex1.pos.transform(matrix4x4)\n    return new Side(new Vertex(newp1), new Vertex(newp2))\n  },\n\n  flipped: function () {\n    return new Side(this.vertex1, this.vertex0)\n  },\n\n  direction: function () {\n    return this.vertex1.pos.minus(this.vertex0.pos)\n  },\n\n  getTag: function () {\n    var result = this.tag\n    if (!result) {\n      result = getTag()\n      this.tag = result\n    }\n    return result\n  },\n\n  lengthSquared: function () {\n    let x = this.vertex1.pos.x - this.vertex0.pos.x\n    let y = this.vertex1.pos.y - this.vertex0.pos.y\n    return x * x + y * y\n  },\n\n  length: function () {\n    return Math.sqrt(this.lengthSquared())\n  }\n}\n\nmodule.exports = Side\n\n},{\"../constants\":54,\"./Polygon3\":62,\"./Vector2\":64,\"./Vertex2\":66,\"./Vertex3\":67}],64:[function(require,module,exports){\nconst {IsFloat} = require('../utils')\n\n/** Class Vector2D\n * Represents a 2D vector with X, Y coordinates\n * @constructor\n *\n * @example\n * new CSG.Vector2D(1, 2);\n * new CSG.Vector2D([1, 2]);\n * new CSG.Vector2D({ x: 1, y: 2});\n */\nconst Vector2D = function (x, y) {\n  if (arguments.length === 2) {\n    this._x = parseFloat(x)\n    this._y = parseFloat(y)\n  } else {\n    var ok = true\n    if (arguments.length === 1) {\n      if (typeof (x) === 'object') {\n        if (x instanceof Vector2D) {\n          this._x = x._x\n          this._y = x._y\n        } else if (x instanceof Array) {\n          this._x = parseFloat(x[0])\n          this._y = parseFloat(x[1])\n        } else if (('x' in x) && ('y' in x)) {\n          this._x = parseFloat(x.x)\n          this._y = parseFloat(x.y)\n        } else ok = false\n      } else {\n        var v = parseFloat(x)\n        this._x = v\n        this._y = v\n      }\n    } else ok = false\n    if (ok) {\n      if ((!IsFloat(this._x)) || (!IsFloat(this._y))) ok = false\n    }\n    if (!ok) {\n      throw new Error('wrong arguments')\n    }\n  }\n}\n\nVector2D.fromAngle = function (radians) {\n  return Vector2D.fromAngleRadians(radians)\n}\n\nVector2D.fromAngleDegrees = function (degrees) {\n  var radians = Math.PI * degrees / 180\n  return Vector2D.fromAngleRadians(radians)\n}\n\nVector2D.fromAngleRadians = function (radians) {\n  return Vector2D.Create(Math.cos(radians), Math.sin(radians))\n}\n\n// This does the same as new Vector2D(x,y) but it doesn't go through the constructor\n// and the parameters are not validated. Is much faster.\nVector2D.Create = function (x, y) {\n  var result = Object.create(Vector2D.prototype)\n  result._x = x\n  result._y = y\n  return result\n}\n\nVector2D.prototype = {\n  get x () {\n    return this._x\n  },\n  get y () {\n    return this._y\n  },\n\n  set x (v) {\n    throw new Error('Vector2D is immutable')\n  },\n  set y (v) {\n    throw new Error('Vector2D is immutable')\n  },\n\n  // extend to a 3D vector by adding a z coordinate:\n  toVector3D: function (z) {\n    const Vector3D = require('./Vector3') // FIXME: circular dependencies Vector2 => Vector3 => Vector2\n    return new Vector3D(this._x, this._y, z)\n  },\n\n  equals: function (a) {\n    return (this._x === a._x) && (this._y === a._y)\n  },\n\n  clone: function () {\n    return Vector2D.Create(this._x, this._y)\n  },\n\n  negated: function () {\n    return Vector2D.Create(-this._x, -this._y)\n  },\n\n  plus: function (a) {\n    return Vector2D.Create(this._x + a._x, this._y + a._y)\n  },\n\n  minus: function (a) {\n    return Vector2D.Create(this._x - a._x, this._y - a._y)\n  },\n\n  times: function (a) {\n    return Vector2D.Create(this._x * a, this._y * a)\n  },\n\n  dividedBy: function (a) {\n    return Vector2D.Create(this._x / a, this._y / a)\n  },\n\n  dot: function (a) {\n    return this._x * a._x + this._y * a._y\n  },\n\n  lerp: function (a, t) {\n    return this.plus(a.minus(this).times(t))\n  },\n\n  length: function () {\n    return Math.sqrt(this.dot(this))\n  },\n\n  distanceTo: function (a) {\n    return this.minus(a).length()\n  },\n\n  distanceToSquared: function (a) {\n    return this.minus(a).lengthSquared()\n  },\n\n  lengthSquared: function () {\n    return this.dot(this)\n  },\n\n  unit: function () {\n    return this.dividedBy(this.length())\n  },\n\n  cross: function (a) {\n    return this._x * a._y - this._y * a._x\n  },\n\n    // returns the vector rotated by 90 degrees clockwise\n  normal: function () {\n    return Vector2D.Create(this._y, -this._x)\n  },\n\n    // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n    // Returns a new Vector2D\n  multiply4x4: function (matrix4x4) {\n    return matrix4x4.leftMultiply1x2Vector(this)\n  },\n\n  transform: function (matrix4x4) {\n    return matrix4x4.leftMultiply1x2Vector(this)\n  },\n\n  angle: function () {\n    return this.angleRadians()\n  },\n\n  angleDegrees: function () {\n    var radians = this.angleRadians()\n    return 180 * radians / Math.PI\n  },\n\n  angleRadians: function () {\n        // y=sin, x=cos\n    return Math.atan2(this._y, this._x)\n  },\n\n  min: function (p) {\n    return Vector2D.Create(\n            Math.min(this._x, p._x), Math.min(this._y, p._y))\n  },\n\n  max: function (p) {\n    return Vector2D.Create(\n            Math.max(this._x, p._x), Math.max(this._y, p._y))\n  },\n\n  toString: function () {\n    return '(' + this._x.toFixed(5) + ', ' + this._y.toFixed(5) + ')'\n  },\n\n  abs: function () {\n    return Vector2D.Create(Math.abs(this._x), Math.abs(this._y))\n  }\n}\n\nmodule.exports = Vector2D\n\n},{\"../utils\":72,\"./Vector3\":65}],65:[function(require,module,exports){\nconst {IsFloat} = require('../utils')\nconst Vector2D = require('./Vector2')\n\n/** Class Vector3D\n * Represents a 3D vector with X, Y, Z coordinates.\n * @constructor\n *\n * @example\n * new CSG.Vector3D(1, 2, 3);\n * new CSG.Vector3D([1, 2, 3]);\n * new CSG.Vector3D({ x: 1, y: 2, z: 3 });\n * new CSG.Vector3D(1, 2); // assumes z=0\n * new CSG.Vector3D([1, 2]); // assumes z=0\n */\nconst Vector3D = function (x, y, z) {\n  if (arguments.length === 3) {\n    this._x = parseFloat(x)\n    this._y = parseFloat(y)\n    this._z = parseFloat(z)\n  } else if (arguments.length === 2) {\n    this._x = parseFloat(x)\n    this._y = parseFloat(y)\n    this._z = 0\n  } else {\n    var ok = true\n    if (arguments.length === 1) {\n      if (typeof (x) === 'object') {\n        if (x instanceof Vector3D) {\n          this._x = x._x\n          this._y = x._y\n          this._z = x._z\n        } else if (x instanceof Vector2D) {\n          this._x = x._x\n          this._y = x._y\n          this._z = 0\n        } else if (x instanceof Array) {\n          if ((x.length < 2) || (x.length > 3)) {\n            ok = false\n          } else {\n            this._x = parseFloat(x[0])\n            this._y = parseFloat(x[1])\n            if (x.length === 3) {\n              this._z = parseFloat(x[2])\n            } else {\n              this._z = 0\n            }\n          }\n        } else if (('x' in x) && ('y' in x)) {\n          this._x = parseFloat(x.x)\n          this._y = parseFloat(x.y)\n          if ('z' in x) {\n            this._z = parseFloat(x.z)\n          } else {\n            this._z = 0\n          }\n        } else if (('_x' in x) && ('_y' in x)) {\n          this._x = parseFloat(x._x)\n          this._y = parseFloat(x._y)\n          if ('_z' in x) {\n            this._z = parseFloat(x._z)\n          } else {\n            this._z = 0\n          }\n        } else ok = false\n      } else {\n        var v = parseFloat(x)\n        this._x = v\n        this._y = v\n        this._z = v\n      }\n    } else ok = false\n    if (ok) {\n      if ((!IsFloat(this._x)) || (!IsFloat(this._y)) || (!IsFloat(this._z))) ok = false\n    } else {\n      throw new Error('wrong arguments')\n    }\n  }\n}\n\n// This does the same as new Vector3D(x,y,z) but it doesn't go through the constructor\n// and the parameters are not validated. Is much faster.\nVector3D.Create = function (x, y, z) {\n  var result = Object.create(Vector3D.prototype)\n  result._x = x\n  result._y = y\n  result._z = z\n  return result\n}\n\nVector3D.prototype = {\n  get x () {\n    return this._x\n  },\n  get y () {\n    return this._y\n  },\n  get z () {\n    return this._z\n  },\n\n  set x (v) {\n    throw new Error('Vector3D is immutable')\n  },\n  set y (v) {\n    throw new Error('Vector3D is immutable')\n  },\n  set z (v) {\n    throw new Error('Vector3D is immutable')\n  },\n\n  clone: function () {\n    return Vector3D.Create(this._x, this._y, this._z)\n  },\n\n  negated: function () {\n    return Vector3D.Create(-this._x, -this._y, -this._z)\n  },\n\n  abs: function () {\n    return Vector3D.Create(Math.abs(this._x), Math.abs(this._y), Math.abs(this._z))\n  },\n\n  plus: function (a) {\n    return Vector3D.Create(this._x + a._x, this._y + a._y, this._z + a._z)\n  },\n\n  minus: function (a) {\n    return Vector3D.Create(this._x - a._x, this._y - a._y, this._z - a._z)\n  },\n\n  times: function (a) {\n    return Vector3D.Create(this._x * a, this._y * a, this._z * a)\n  },\n\n  dividedBy: function (a) {\n    return Vector3D.Create(this._x / a, this._y / a, this._z / a)\n  },\n\n  dot: function (a) {\n    return this._x * a._x + this._y * a._y + this._z * a._z\n  },\n\n  lerp: function (a, t) {\n    return this.plus(a.minus(this).times(t))\n  },\n\n  lengthSquared: function () {\n    return this.dot(this)\n  },\n\n  length: function () {\n    return Math.sqrt(this.lengthSquared())\n  },\n\n  unit: function () {\n    return this.dividedBy(this.length())\n  },\n\n  cross: function (a) {\n    return Vector3D.Create(\n            this._y * a._z - this._z * a._y, this._z * a._x - this._x * a._z, this._x * a._y - this._y * a._x)\n  },\n\n  distanceTo: function (a) {\n    return this.minus(a).length()\n  },\n\n  distanceToSquared: function (a) {\n    return this.minus(a).lengthSquared()\n  },\n\n  equals: function (a) {\n    return (this._x === a._x) && (this._y === a._y) && (this._z === a._z)\n  },\n\n    // Right multiply by a 4x4 matrix (the vector is interpreted as a row vector)\n    // Returns a new Vector3D\n  multiply4x4: function (matrix4x4) {\n    return matrix4x4.leftMultiply1x3Vector(this)\n  },\n\n  transform: function (matrix4x4) {\n    return matrix4x4.leftMultiply1x3Vector(this)\n  },\n\n  toString: function () {\n    return '(' + this._x.toFixed(5) + ', ' + this._y.toFixed(5) + ', ' + this._z.toFixed(5) + ')'\n  },\n\n    // find a vector that is somewhat perpendicular to this one\n  randomNonParallelVector: function () {\n    var abs = this.abs()\n    if ((abs._x <= abs._y) && (abs._x <= abs._z)) {\n      return Vector3D.Create(1, 0, 0)\n    } else if ((abs._y <= abs._x) && (abs._y <= abs._z)) {\n      return Vector3D.Create(0, 1, 0)\n    } else {\n      return Vector3D.Create(0, 0, 1)\n    }\n  },\n\n  min: function (p) {\n    return Vector3D.Create(\n            Math.min(this._x, p._x), Math.min(this._y, p._y), Math.min(this._z, p._z))\n  },\n\n  max: function (p) {\n    return Vector3D.Create(\n            Math.max(this._x, p._x), Math.max(this._y, p._y), Math.max(this._z, p._z))\n  }\n}\n\nmodule.exports = Vector3D\n\n},{\"../utils\":72,\"./Vector2\":64}],66:[function(require,module,exports){\nconst Vector2D = require('./Vector2')\nconst {getTag} = require('../constants')\n\nconst Vertex = function (pos) {\n  this.pos = pos\n}\n\nVertex.fromObject = function (obj) {\n  return new Vertex(new Vector2D(obj.pos._x, obj.pos._y))\n}\n\nVertex.prototype = {\n  toString: function () {\n    return '(' + this.pos.x.toFixed(5) + ',' + this.pos.y.toFixed(5) + ')'\n  },\n  getTag: function () {\n    var result = this.tag\n    if (!result) {\n      result = getTag()\n      this.tag = result\n    }\n    return result\n  }\n}\n\nmodule.exports = Vertex\n\n},{\"../constants\":54,\"./Vector2\":64}],67:[function(require,module,exports){\nconst Vector3D = require('./Vector3')\nconst {getTag} = require('../constants')\n\n// # class Vertex\n// Represents a vertex of a polygon. Use your own vertex class instead of this\n// one to provide additional features like texture coordinates and vertex\n// colors. Custom vertex classes need to provide a `pos` property\n// `flipped()`, and `interpolate()` methods that behave analogous to the ones\n// FIXME: And a lot MORE (see plane.fromVector3Ds for ex) ! This is fragile code\n// defined by `Vertex`.\nconst Vertex = function (pos) {\n  this.pos = pos\n}\n\n// create from an untyped object with identical property names:\nVertex.fromObject = function (obj) {\n  var pos = new Vector3D(obj.pos)\n  return new Vertex(pos)\n}\n\nVertex.prototype = {\n    // Return a vertex with all orientation-specific data (e.g. vertex normal) flipped. Called when the\n    // orientation of a polygon is flipped.\n  flipped: function () {\n    return this\n  },\n\n  getTag: function () {\n    var result = this.tag\n    if (!result) {\n      result = getTag()\n      this.tag = result\n    }\n    return result\n  },\n\n    // Create a new vertex between this vertex and `other` by linearly\n    // interpolating all properties using a parameter of `t`. Subclasses should\n    // override this to interpolate additional properties.\n  interpolate: function (other, t) {\n    var newpos = this.pos.lerp(other.pos, t)\n    return new Vertex(newpos)\n  },\n\n    // Affine transformation of vertex. Returns a new Vertex\n  transform: function (matrix4x4) {\n    var newpos = this.pos.multiply4x4(matrix4x4)\n    return new Vertex(newpos)\n  },\n\n  toString: function () {\n    return this.pos.toString()\n  }\n}\n\nmodule.exports = Vertex\n\n},{\"../constants\":54,\"./Vector3\":65}],68:[function(require,module,exports){\nconst {EPS} = require('../constants')\nconst {solve2Linear} = require('../utils')\n\n// see if the line between p0start and p0end intersects with the line between p1start and p1end\n// returns true if the lines strictly intersect, the end points are not counted!\nconst linesIntersect = function (p0start, p0end, p1start, p1end) {\n  if (p0end.equals(p1start) || p1end.equals(p0start)) {\n    let d = p1end.minus(p1start).unit().plus(p0end.minus(p0start).unit()).length()\n    if (d < EPS) {\n      return true\n    }\n  } else {\n    let d0 = p0end.minus(p0start)\n    let d1 = p1end.minus(p1start)\n    // FIXME These epsilons need review and testing\n    if (Math.abs(d0.cross(d1)) < 1e-9) return false // lines are parallel\n    let alphas = solve2Linear(-d0.x, d1.x, -d0.y, d1.y, p0start.x - p1start.x, p0start.y - p1start.y)\n    if ((alphas[0] > 1e-6) && (alphas[0] < 0.999999) && (alphas[1] > 1e-5) && (alphas[1] < 0.999999)) return true\n    // if( (alphas[0] >= 0) && (alphas[0] <= 1) && (alphas[1] >= 0) && (alphas[1] <= 1) ) return true;\n  }\n  return false\n}\n\nmodule.exports = {linesIntersect}\n\n},{\"../constants\":54,\"../utils\":72}],69:[function(require,module,exports){\nconst {EPS} = require('../constants')\nconst OrthoNormalBasis = require('./OrthoNormalBasis')\nconst {interpolateBetween2DPointsForY, insertSorted, fnNumberSort} = require('../utils')\nconst Vertex = require('./Vertex3')\nconst Vector2D = require('./Vector2')\nconst Line2D = require('./Line2')\nconst Polygon = require('./Polygon3')\n\n// Retesselation function for a set of coplanar polygons. See the introduction at the top of\n// this file.\nconst reTesselateCoplanarPolygons = function (sourcepolygons, destpolygons) {\n  let numpolygons = sourcepolygons.length\n  if (numpolygons > 0) {\n    let plane = sourcepolygons[0].plane\n    let shared = sourcepolygons[0].shared\n    let orthobasis = new OrthoNormalBasis(plane)\n    let polygonvertices2d = [] // array of array of Vector2D\n    let polygontopvertexindexes = [] // array of indexes of topmost vertex per polygon\n    let topy2polygonindexes = {}\n    let ycoordinatetopolygonindexes = {}\n\n    let xcoordinatebins = {}\n    let ycoordinatebins = {}\n\n        // convert all polygon vertices to 2D\n        // Make a list of all encountered y coordinates\n        // And build a map of all polygons that have a vertex at a certain y coordinate:\n    let ycoordinateBinningFactor = 1.0 / EPS * 10\n    for (let polygonindex = 0; polygonindex < numpolygons; polygonindex++) {\n      let poly3d = sourcepolygons[polygonindex]\n      let vertices2d = []\n      let numvertices = poly3d.vertices.length\n      let minindex = -1\n      if (numvertices > 0) {\n        let miny, maxy, maxindex\n        for (let i = 0; i < numvertices; i++) {\n          let pos2d = orthobasis.to2D(poly3d.vertices[i].pos)\n                    // perform binning of y coordinates: If we have multiple vertices very\n                    // close to each other, give them the same y coordinate:\n          let ycoordinatebin = Math.floor(pos2d.y * ycoordinateBinningFactor)\n          let newy\n          if (ycoordinatebin in ycoordinatebins) {\n            newy = ycoordinatebins[ycoordinatebin]\n          } else if (ycoordinatebin + 1 in ycoordinatebins) {\n            newy = ycoordinatebins[ycoordinatebin + 1]\n          } else if (ycoordinatebin - 1 in ycoordinatebins) {\n            newy = ycoordinatebins[ycoordinatebin - 1]\n          } else {\n            newy = pos2d.y\n            ycoordinatebins[ycoordinatebin] = pos2d.y\n          }\n          pos2d = Vector2D.Create(pos2d.x, newy)\n          vertices2d.push(pos2d)\n          let y = pos2d.y\n          if ((i === 0) || (y < miny)) {\n            miny = y\n            minindex = i\n          }\n          if ((i === 0) || (y > maxy)) {\n            maxy = y\n            maxindex = i\n          }\n          if (!(y in ycoordinatetopolygonindexes)) {\n            ycoordinatetopolygonindexes[y] = {}\n          }\n          ycoordinatetopolygonindexes[y][polygonindex] = true\n        }\n        if (miny >= maxy) {\n                    // degenerate polygon, all vertices have same y coordinate. Just ignore it from now:\n          vertices2d = []\n          numvertices = 0\n          minindex = -1\n        } else {\n          if (!(miny in topy2polygonindexes)) {\n            topy2polygonindexes[miny] = []\n          }\n          topy2polygonindexes[miny].push(polygonindex)\n        }\n      } // if(numvertices > 0)\n            // reverse the vertex order:\n      vertices2d.reverse()\n      minindex = numvertices - minindex - 1\n      polygonvertices2d.push(vertices2d)\n      polygontopvertexindexes.push(minindex)\n    }\n    let ycoordinates = []\n    for (let ycoordinate in ycoordinatetopolygonindexes) ycoordinates.push(ycoordinate)\n    ycoordinates.sort(fnNumberSort)\n\n        // Now we will iterate over all y coordinates, from lowest to highest y coordinate\n        // activepolygons: source polygons that are 'active', i.e. intersect with our y coordinate\n        //   Is sorted so the polygons are in left to right order\n        // Each element in activepolygons has these properties:\n        //        polygonindex: the index of the source polygon (i.e. an index into the sourcepolygons\n        //                      and polygonvertices2d arrays)\n        //        leftvertexindex: the index of the vertex at the left side of the polygon (lowest x)\n        //                         that is at or just above the current y coordinate\n        //        rightvertexindex: dito at right hand side of polygon\n        //        topleft, bottomleft: coordinates of the left side of the polygon crossing the current y coordinate\n        //        topright, bottomright: coordinates of the right hand side of the polygon crossing the current y coordinate\n    let activepolygons = []\n    let prevoutpolygonrow = []\n    for (let yindex = 0; yindex < ycoordinates.length; yindex++) {\n      let newoutpolygonrow = []\n      let ycoordinate_as_string = ycoordinates[yindex]\n      let ycoordinate = Number(ycoordinate_as_string)\n\n            // update activepolygons for this y coordinate:\n            // - Remove any polygons that end at this y coordinate\n            // - update leftvertexindex and rightvertexindex (which point to the current vertex index\n            //   at the the left and right side of the polygon\n            // Iterate over all polygons that have a corner at this y coordinate:\n      let polygonindexeswithcorner = ycoordinatetopolygonindexes[ycoordinate_as_string]\n      for (let activepolygonindex = 0; activepolygonindex < activepolygons.length; ++activepolygonindex) {\n        let activepolygon = activepolygons[activepolygonindex]\n        let polygonindex = activepolygon.polygonindex\n        if (polygonindexeswithcorner[polygonindex]) {\n                    // this active polygon has a corner at this y coordinate:\n          let vertices2d = polygonvertices2d[polygonindex]\n          let numvertices = vertices2d.length\n          let newleftvertexindex = activepolygon.leftvertexindex\n          let newrightvertexindex = activepolygon.rightvertexindex\n                    // See if we need to increase leftvertexindex or decrease rightvertexindex:\n          while (true) {\n            let nextleftvertexindex = newleftvertexindex + 1\n            if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0\n            if (vertices2d[nextleftvertexindex].y !== ycoordinate) break\n            newleftvertexindex = nextleftvertexindex\n          }\n          let nextrightvertexindex = newrightvertexindex - 1\n          if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1\n          if (vertices2d[nextrightvertexindex].y === ycoordinate) {\n            newrightvertexindex = nextrightvertexindex\n          }\n          if ((newleftvertexindex !== activepolygon.leftvertexindex) && (newleftvertexindex === newrightvertexindex)) {\n                        // We have increased leftvertexindex or decreased rightvertexindex, and now they point to the same vertex\n                        // This means that this is the bottom point of the polygon. We'll remove it:\n            activepolygons.splice(activepolygonindex, 1)\n            --activepolygonindex\n          } else {\n            activepolygon.leftvertexindex = newleftvertexindex\n            activepolygon.rightvertexindex = newrightvertexindex\n            activepolygon.topleft = vertices2d[newleftvertexindex]\n            activepolygon.topright = vertices2d[newrightvertexindex]\n            let nextleftvertexindex = newleftvertexindex + 1\n            if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0\n            activepolygon.bottomleft = vertices2d[nextleftvertexindex]\n            let nextrightvertexindex = newrightvertexindex - 1\n            if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1\n            activepolygon.bottomright = vertices2d[nextrightvertexindex]\n          }\n        } // if polygon has corner here\n      } // for activepolygonindex\n      let nextycoordinate\n      if (yindex >= ycoordinates.length - 1) {\n                // last row, all polygons must be finished here:\n        activepolygons = []\n        nextycoordinate = null\n      } else // yindex < ycoordinates.length-1\n            {\n        nextycoordinate = Number(ycoordinates[yindex + 1])\n        let middleycoordinate = 0.5 * (ycoordinate + nextycoordinate)\n                // update activepolygons by adding any polygons that start here:\n        let startingpolygonindexes = topy2polygonindexes[ycoordinate_as_string]\n        for (let polygonindex_key in startingpolygonindexes) {\n          let polygonindex = startingpolygonindexes[polygonindex_key]\n          let vertices2d = polygonvertices2d[polygonindex]\n          let numvertices = vertices2d.length\n          let topvertexindex = polygontopvertexindexes[polygonindex]\n                    // the top of the polygon may be a horizontal line. In that case topvertexindex can point to any point on this line.\n                    // Find the left and right topmost vertices which have the current y coordinate:\n          let topleftvertexindex = topvertexindex\n          while (true) {\n            let i = topleftvertexindex + 1\n            if (i >= numvertices) i = 0\n            if (vertices2d[i].y !== ycoordinate) break\n            if (i === topvertexindex) break // should not happen, but just to prevent endless loops\n            topleftvertexindex = i\n          }\n          let toprightvertexindex = topvertexindex\n          while (true) {\n            let i = toprightvertexindex - 1\n            if (i < 0) i = numvertices - 1\n            if (vertices2d[i].y !== ycoordinate) break\n            if (i === topleftvertexindex) break // should not happen, but just to prevent endless loops\n            toprightvertexindex = i\n          }\n          let nextleftvertexindex = topleftvertexindex + 1\n          if (nextleftvertexindex >= numvertices) nextleftvertexindex = 0\n          let nextrightvertexindex = toprightvertexindex - 1\n          if (nextrightvertexindex < 0) nextrightvertexindex = numvertices - 1\n          let newactivepolygon = {\n            polygonindex: polygonindex,\n            leftvertexindex: topleftvertexindex,\n            rightvertexindex: toprightvertexindex,\n            topleft: vertices2d[topleftvertexindex],\n            topright: vertices2d[toprightvertexindex],\n            bottomleft: vertices2d[nextleftvertexindex],\n            bottomright: vertices2d[nextrightvertexindex]\n          }\n          insertSorted(activepolygons, newactivepolygon, function (el1, el2) {\n            let x1 = interpolateBetween2DPointsForY(\n                            el1.topleft, el1.bottomleft, middleycoordinate)\n            let x2 = interpolateBetween2DPointsForY(\n                            el2.topleft, el2.bottomleft, middleycoordinate)\n            if (x1 > x2) return 1\n            if (x1 < x2) return -1\n            return 0\n          })\n        } // for(let polygonindex in startingpolygonindexes)\n      } //  yindex < ycoordinates.length-1\n            // if( (yindex === ycoordinates.length-1) || (nextycoordinate - ycoordinate > EPS) )\n      if (true) {\n        // Now activepolygons is up to date\n        // Build the output polygons for the next row in newoutpolygonrow:\n        for (let activepolygonKey in activepolygons) {\n          let activepolygon = activepolygons[activepolygonKey]\n          let polygonindex = activepolygon.polygonindex\n          let vertices2d = polygonvertices2d[polygonindex]\n          let numvertices = vertices2d.length\n\n          let x = interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, ycoordinate)\n          let topleft = Vector2D.Create(x, ycoordinate)\n          x = interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, ycoordinate)\n          let topright = Vector2D.Create(x, ycoordinate)\n          x = interpolateBetween2DPointsForY(activepolygon.topleft, activepolygon.bottomleft, nextycoordinate)\n          let bottomleft = Vector2D.Create(x, nextycoordinate)\n          x = interpolateBetween2DPointsForY(activepolygon.topright, activepolygon.bottomright, nextycoordinate)\n          let bottomright = Vector2D.Create(x, nextycoordinate)\n          let outpolygon = {\n            topleft: topleft,\n            topright: topright,\n            bottomleft: bottomleft,\n            bottomright: bottomright,\n            leftline: Line2D.fromPoints(topleft, bottomleft),\n            rightline: Line2D.fromPoints(bottomright, topright)\n          }\n          if (newoutpolygonrow.length > 0) {\n            let prevoutpolygon = newoutpolygonrow[newoutpolygonrow.length - 1]\n            let d1 = outpolygon.topleft.distanceTo(prevoutpolygon.topright)\n            let d2 = outpolygon.bottomleft.distanceTo(prevoutpolygon.bottomright)\n            if ((d1 < EPS) && (d2 < EPS)) {\n                            // we can join this polygon with the one to the left:\n              outpolygon.topleft = prevoutpolygon.topleft\n              outpolygon.leftline = prevoutpolygon.leftline\n              outpolygon.bottomleft = prevoutpolygon.bottomleft\n              newoutpolygonrow.splice(newoutpolygonrow.length - 1, 1)\n            }\n          }\n          newoutpolygonrow.push(outpolygon)\n        } // for(activepolygon in activepolygons)\n        if (yindex > 0) {\n                    // try to match the new polygons against the previous row:\n          let prevcontinuedindexes = {}\n          let matchedindexes = {}\n          for (let i = 0; i < newoutpolygonrow.length; i++) {\n            let thispolygon = newoutpolygonrow[i]\n            for (let ii = 0; ii < prevoutpolygonrow.length; ii++) {\n              if (!matchedindexes[ii]) // not already processed?\n                            {\n                                // We have a match if the sidelines are equal or if the top coordinates\n                                // are on the sidelines of the previous polygon\n                let prevpolygon = prevoutpolygonrow[ii]\n                if (prevpolygon.bottomleft.distanceTo(thispolygon.topleft) < EPS) {\n                  if (prevpolygon.bottomright.distanceTo(thispolygon.topright) < EPS) {\n                                        // Yes, the top of this polygon matches the bottom of the previous:\n                    matchedindexes[ii] = true\n                                        // Now check if the joined polygon would remain convex:\n                    let d1 = thispolygon.leftline.direction().x - prevpolygon.leftline.direction().x\n                    let d2 = thispolygon.rightline.direction().x - prevpolygon.rightline.direction().x\n                    let leftlinecontinues = Math.abs(d1) < EPS\n                    let rightlinecontinues = Math.abs(d2) < EPS\n                    let leftlineisconvex = leftlinecontinues || (d1 >= 0)\n                    let rightlineisconvex = rightlinecontinues || (d2 >= 0)\n                    if (leftlineisconvex && rightlineisconvex) {\n                                            // yes, both sides have convex corners:\n                                            // This polygon will continue the previous polygon\n                      thispolygon.outpolygon = prevpolygon.outpolygon\n                      thispolygon.leftlinecontinues = leftlinecontinues\n                      thispolygon.rightlinecontinues = rightlinecontinues\n                      prevcontinuedindexes[ii] = true\n                    }\n                    break\n                  }\n                }\n              } // if(!prevcontinuedindexes[ii])\n            } // for ii\n          } // for i\n          for (let ii = 0; ii < prevoutpolygonrow.length; ii++) {\n            if (!prevcontinuedindexes[ii]) {\n                            // polygon ends here\n                            // Finish the polygon with the last point(s):\n              let prevpolygon = prevoutpolygonrow[ii]\n              prevpolygon.outpolygon.rightpoints.push(prevpolygon.bottomright)\n              if (prevpolygon.bottomright.distanceTo(prevpolygon.bottomleft) > EPS) {\n                                // polygon ends with a horizontal line:\n                prevpolygon.outpolygon.leftpoints.push(prevpolygon.bottomleft)\n              }\n                            // reverse the left half so we get a counterclockwise circle:\n              prevpolygon.outpolygon.leftpoints.reverse()\n              let points2d = prevpolygon.outpolygon.rightpoints.concat(prevpolygon.outpolygon.leftpoints)\n              let vertices3d = []\n              points2d.map(function (point2d) {\n                let point3d = orthobasis.to3D(point2d)\n                let vertex3d = new Vertex(point3d)\n                vertices3d.push(vertex3d)\n              })\n              let polygon = new Polygon(vertices3d, shared, plane)\n              destpolygons.push(polygon)\n            }\n          }\n        } // if(yindex > 0)\n        for (let i = 0; i < newoutpolygonrow.length; i++) {\n          let thispolygon = newoutpolygonrow[i]\n          if (!thispolygon.outpolygon) {\n                        // polygon starts here:\n            thispolygon.outpolygon = {\n              leftpoints: [],\n              rightpoints: []\n            }\n            thispolygon.outpolygon.leftpoints.push(thispolygon.topleft)\n            if (thispolygon.topleft.distanceTo(thispolygon.topright) > EPS) {\n                            // we have a horizontal line at the top:\n              thispolygon.outpolygon.rightpoints.push(thispolygon.topright)\n            }\n          } else {\n                        // continuation of a previous row\n            if (!thispolygon.leftlinecontinues) {\n              thispolygon.outpolygon.leftpoints.push(thispolygon.topleft)\n            }\n            if (!thispolygon.rightlinecontinues) {\n              thispolygon.outpolygon.rightpoints.push(thispolygon.topright)\n            }\n          }\n        }\n        prevoutpolygonrow = newoutpolygonrow\n      }\n    } // for yindex\n  } // if(numpolygons > 0)\n}\n\nmodule.exports = reTesselateCoplanarPolygons\n\n},{\"../constants\":54,\"../utils\":72,\"./Line2\":55,\"./OrthoNormalBasis\":58,\"./Polygon3\":62,\"./Vector2\":64,\"./Vertex3\":67}],70:[function(require,module,exports){\nconst Matrix4x4 = require('./math/Matrix4')\nconst Vector3D = require('./math/Vector3')\nconst Plane = require('./math/Plane')\n\n// Add several convenience methods to the classes that support a transform() method:\nconst addTransformationMethodsToPrototype = function (prot) {\n  prot.mirrored = function (plane) {\n    return this.transform(Matrix4x4.mirroring(plane))\n  }\n\n  prot.mirroredX = function () {\n    let plane = new Plane(Vector3D.Create(1, 0, 0), 0)\n    return this.mirrored(plane)\n  }\n\n  prot.mirroredY = function () {\n    let plane = new Plane(Vector3D.Create(0, 1, 0), 0)\n    return this.mirrored(plane)\n  }\n\n  prot.mirroredZ = function () {\n    let plane = new Plane(Vector3D.Create(0, 0, 1), 0)\n    return this.mirrored(plane)\n  }\n\n  prot.translate = function (v) {\n    return this.transform(Matrix4x4.translation(v))\n  }\n\n  prot.scale = function (f) {\n    return this.transform(Matrix4x4.scaling(f))\n  }\n\n  prot.rotateX = function (deg) {\n    return this.transform(Matrix4x4.rotationX(deg))\n  }\n\n  prot.rotateY = function (deg) {\n    return this.transform(Matrix4x4.rotationY(deg))\n  }\n\n  prot.rotateZ = function (deg) {\n    return this.transform(Matrix4x4.rotationZ(deg))\n  }\n\n  prot.rotate = function (rotationCenter, rotationAxis, degrees) {\n    return this.transform(Matrix4x4.rotation(rotationCenter, rotationAxis, degrees))\n  }\n\n  prot.rotateEulerAngles = function (alpha, beta, gamma, position) {\n    position = position || [0, 0, 0]\n\n    let Rz1 = Matrix4x4.rotationZ(alpha)\n    let Rx = Matrix4x4.rotationX(beta)\n    let Rz2 = Matrix4x4.rotationZ(gamma)\n    let T = Matrix4x4.translation(new Vector3D(position))\n\n    return this.transform(Rz2.multiply(Rx).multiply(Rz1).multiply(T))\n  }\n}\n\n// TODO: consider generalization and adding to addTransformationMethodsToPrototype\nconst addCenteringToPrototype = function (prot, axes) {\n  prot.center = function (cAxes) {\n    cAxes = Array.prototype.map.call(arguments, function (a) {\n      return a // .toLowerCase();\n    })\n        // no args: center on all axes\n    if (!cAxes.length) {\n      cAxes = axes.slice()\n    }\n    let b = this.getBounds()\n    return this.translate(axes.map(function (a) {\n      return cAxes.indexOf(a) > -1 ? -(b[0][a] + b[1][a]) / 2 : 0\n    }))\n  }\n}\nmodule.exports = {\n  addTransformationMethodsToPrototype,\n  addCenteringToPrototype\n}\n\n},{\"./math/Matrix4\":57,\"./math/Plane\":60,\"./math/Vector3\":65}],71:[function(require,module,exports){\nconst {_CSGDEBUG, EPS} = require('./constants')\nconst Vertex = require('./math/Vertex3')\nconst Polygon = require('./math/Polygon3')\n\n// Returns object:\n// .type:\n//   0: coplanar-front\n//   1: coplanar-back\n//   2: front\n//   3: back\n//   4: spanning\n// In case the polygon is spanning, returns:\n// .front: a Polygon of the front part\n// .back: a Polygon of the back part\nfunction splitPolygonByPlane (plane, polygon) {\n  let result = {\n    type: null,\n    front: null,\n    back: null\n  }\n      // cache in local lets (speedup):\n  let planenormal = plane.normal\n  let vertices = polygon.vertices\n  let numvertices = vertices.length\n  if (polygon.plane.equals(plane)) {\n    result.type = 0\n  } else {\n    let thisw = plane.w\n    let hasfront = false\n    let hasback = false\n    let vertexIsBack = []\n    let MINEPS = -EPS\n    for (let i = 0; i < numvertices; i++) {\n      let t = planenormal.dot(vertices[i].pos) - thisw\n      let isback = (t < 0)\n      vertexIsBack.push(isback)\n      if (t > EPS) hasfront = true\n      if (t < MINEPS) hasback = true\n    }\n    if ((!hasfront) && (!hasback)) {\n              // all points coplanar\n      let t = planenormal.dot(polygon.plane.normal)\n      result.type = (t >= 0) ? 0 : 1\n    } else if (!hasback) {\n      result.type = 2\n    } else if (!hasfront) {\n      result.type = 3\n    } else {\n              // spanning\n      result.type = 4\n      let frontvertices = []\n      let backvertices = []\n      let isback = vertexIsBack[0]\n      for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n        let vertex = vertices[vertexindex]\n        let nextvertexindex = vertexindex + 1\n        if (nextvertexindex >= numvertices) nextvertexindex = 0\n        let nextisback = vertexIsBack[nextvertexindex]\n        if (isback === nextisback) {\n                      // line segment is on one side of the plane:\n          if (isback) {\n            backvertices.push(vertex)\n          } else {\n            frontvertices.push(vertex)\n          }\n        } else {\n                      // line segment intersects plane:\n          let point = vertex.pos\n          let nextpoint = vertices[nextvertexindex].pos\n          let intersectionpoint = plane.splitLineBetweenPoints(point, nextpoint)\n          let intersectionvertex = new Vertex(intersectionpoint)\n          if (isback) {\n            backvertices.push(vertex)\n            backvertices.push(intersectionvertex)\n            frontvertices.push(intersectionvertex)\n          } else {\n            frontvertices.push(vertex)\n            frontvertices.push(intersectionvertex)\n            backvertices.push(intersectionvertex)\n          }\n        }\n        isback = nextisback\n      } // for vertexindex\n              // remove duplicate vertices:\n      let EPS_SQUARED = EPS * EPS\n      if (backvertices.length >= 3) {\n        let prevvertex = backvertices[backvertices.length - 1]\n        for (let vertexindex = 0; vertexindex < backvertices.length; vertexindex++) {\n          let vertex = backvertices[vertexindex]\n          if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n            backvertices.splice(vertexindex, 1)\n            vertexindex--\n          }\n          prevvertex = vertex\n        }\n      }\n      if (frontvertices.length >= 3) {\n        let prevvertex = frontvertices[frontvertices.length - 1]\n        for (let vertexindex = 0; vertexindex < frontvertices.length; vertexindex++) {\n          let vertex = frontvertices[vertexindex]\n          if (vertex.pos.distanceToSquared(prevvertex.pos) < EPS_SQUARED) {\n            frontvertices.splice(vertexindex, 1)\n            vertexindex--\n          }\n          prevvertex = vertex\n        }\n      }\n      if (frontvertices.length >= 3) {\n        result.front = new Polygon(frontvertices, polygon.shared, polygon.plane)\n      }\n      if (backvertices.length >= 3) {\n        result.back = new Polygon(backvertices, polygon.shared, polygon.plane)\n      }\n    }\n  }\n  return result\n}\n\n// # class PolygonTreeNode\n// This class manages hierarchical splits of polygons\n// At the top is a root node which doesn hold a polygon, only child PolygonTreeNodes\n// Below that are zero or more 'top' nodes; each holds a polygon. The polygons can be in different planes\n// splitByPlane() splits a node by a plane. If the plane intersects the polygon, two new child nodes\n// are created holding the splitted polygon.\n// getPolygons() retrieves the polygon from the tree. If for PolygonTreeNode the polygon is split but\n// the two split parts (child nodes) are still intact, then the unsplit polygon is returned.\n// This ensures that we can safely split a polygon into many fragments. If the fragments are untouched,\n//  getPolygons() will return the original unsplit polygon instead of the fragments.\n// remove() removes a polygon from the tree. Once a polygon is removed, the parent polygons are invalidated\n// since they are no longer intact.\n// constructor creates the root node:\nconst PolygonTreeNode = function () {\n  this.parent = null\n  this.children = []\n  this.polygon = null\n  this.removed = false\n}\n\nPolygonTreeNode.prototype = {\n    // fill the tree with polygons. Should be called on the root node only; child nodes must\n    // always be a derivate (split) of the parent node.\n  addPolygons: function (polygons) {\n    // new polygons can only be added to root node; children can only be splitted polygons\n    if (!this.isRootNode()) {\n      throw new Error('Assertion failed')\n    }\n    let _this = this\n    polygons.map(function (polygon) {\n      _this.addChild(polygon)\n    })\n  },\n\n    // remove a node\n    // - the siblings become toplevel nodes\n    // - the parent is removed recursively\n  remove: function () {\n    if (!this.removed) {\n      this.removed = true\n\n      if (_CSGDEBUG) {\n        if (this.isRootNode()) throw new Error('Assertion failed') // can't remove root node\n        if (this.children.length) throw new Error('Assertion failed') // we shouldn't remove nodes with children\n      }\n\n            // remove ourselves from the parent's children list:\n      let parentschildren = this.parent.children\n      let i = parentschildren.indexOf(this)\n      if (i < 0) throw new Error('Assertion failed')\n      parentschildren.splice(i, 1)\n\n            // invalidate the parent's polygon, and of all parents above it:\n      this.parent.recursivelyInvalidatePolygon()\n    }\n  },\n\n  isRemoved: function () {\n    return this.removed\n  },\n\n  isRootNode: function () {\n    return !this.parent\n  },\n\n    // invert all polygons in the tree. Call on the root node\n  invert: function () {\n    if (!this.isRootNode()) throw new Error('Assertion failed') // can only call this on the root node\n    this.invertSub()\n  },\n\n  getPolygon: function () {\n    if (!this.polygon) throw new Error('Assertion failed') // doesn't have a polygon, which means that it has been broken down\n    return this.polygon\n  },\n\n  getPolygons: function (result) {\n    let children = [this]\n    let queue = [children]\n    let i, j, l, node\n    for (i = 0; i < queue.length; ++i) { // queue size can change in loop, don't cache length\n      children = queue[i]\n      for (j = 0, l = children.length; j < l; j++) { // ok to cache length\n        node = children[j]\n        if (node.polygon) {\n                    // the polygon hasn't been broken yet. We can ignore the children and return our polygon:\n          result.push(node.polygon)\n        } else {\n                    // our polygon has been split up and broken, so gather all subpolygons from the children\n          queue.push(node.children)\n        }\n      }\n    }\n  },\n\n    // split the node by a plane; add the resulting nodes to the frontnodes and backnodes array\n    // If the plane doesn't intersect the polygon, the 'this' object is added to one of the arrays\n    // If the plane does intersect the polygon, two new child nodes are created for the front and back fragments,\n    //  and added to both arrays.\n  splitByPlane: function (plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n    if (this.children.length) {\n      let queue = [this.children]\n      let i\n      let j\n      let l\n      let node\n      let nodes\n      for (i = 0; i < queue.length; i++) { // queue.length can increase, do not cache\n        nodes = queue[i]\n        for (j = 0, l = nodes.length; j < l; j++) { // ok to cache length\n          node = nodes[j]\n          if (node.children.length) {\n            queue.push(node.children)\n          } else {\n                        // no children. Split the polygon:\n            node._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes)\n          }\n        }\n      }\n    } else {\n      this._splitByPlane(plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes)\n    }\n  },\n\n    // only to be called for nodes with no children\n  _splitByPlane: function (plane, coplanarfrontnodes, coplanarbacknodes, frontnodes, backnodes) {\n    let polygon = this.polygon\n    if (polygon) {\n      let bound = polygon.boundingSphere()\n      let sphereradius = bound[1] + EPS // FIXME Why add imprecision?\n      let planenormal = plane.normal\n      let spherecenter = bound[0]\n      let d = planenormal.dot(spherecenter) - plane.w\n      if (d > sphereradius) {\n        frontnodes.push(this)\n      } else if (d < -sphereradius) {\n        backnodes.push(this)\n      } else {\n        let splitresult = splitPolygonByPlane(plane, polygon)\n        switch (splitresult.type) {\n          case 0:\n                        // coplanar front:\n            coplanarfrontnodes.push(this)\n            break\n\n          case 1:\n                        // coplanar back:\n            coplanarbacknodes.push(this)\n            break\n\n          case 2:\n                        // front:\n            frontnodes.push(this)\n            break\n\n          case 3:\n                        // back:\n            backnodes.push(this)\n            break\n\n          case 4:\n                        // spanning:\n            if (splitresult.front) {\n              let frontnode = this.addChild(splitresult.front)\n              frontnodes.push(frontnode)\n            }\n            if (splitresult.back) {\n              let backnode = this.addChild(splitresult.back)\n              backnodes.push(backnode)\n            }\n            break\n        }\n      }\n    }\n  },\n\n    // PRIVATE methods from here:\n    // add child to a node\n    // this should be called whenever the polygon is split\n    // a child should be created for every fragment of the split polygon\n    // returns the newly created child\n  addChild: function (polygon) {\n    let newchild = new PolygonTreeNode()\n    newchild.parent = this\n    newchild.polygon = polygon\n    this.children.push(newchild)\n    return newchild\n  },\n\n  invertSub: function () {\n    let children = [this]\n    let queue = [children]\n    let i, j, l, node\n    for (i = 0; i < queue.length; i++) {\n      children = queue[i]\n      for (j = 0, l = children.length; j < l; j++) {\n        node = children[j]\n        if (node.polygon) {\n          node.polygon = node.polygon.flipped()\n        }\n        queue.push(node.children)\n      }\n    }\n  },\n\n  recursivelyInvalidatePolygon: function () {\n    let node = this\n    while (node.polygon) {\n      node.polygon = null\n      if (node.parent) {\n        node = node.parent\n      }\n    }\n  }\n}\n\n// # class Tree\n// This is the root of a BSP tree\n// We are using this separate class for the root of the tree, to hold the PolygonTreeNode root\n// The actual tree is kept in this.rootnode\nconst Tree = function (polygons) {\n  this.polygonTree = new PolygonTreeNode()\n  this.rootnode = new Node(null)\n  if (polygons) this.addPolygons(polygons)\n}\n\nTree.prototype = {\n  invert: function () {\n    this.polygonTree.invert()\n    this.rootnode.invert()\n  },\n\n    // Remove all polygons in this BSP tree that are inside the other BSP tree\n    // `tree`.\n  clipTo: function (tree, alsoRemovecoplanarFront) {\n    alsoRemovecoplanarFront = !!alsoRemovecoplanarFront\n    this.rootnode.clipTo(tree, alsoRemovecoplanarFront)\n  },\n\n  allPolygons: function () {\n    let result = []\n    this.polygonTree.getPolygons(result)\n    return result\n  },\n\n  addPolygons: function (polygons) {\n    let _this = this\n    let polygontreenodes = polygons.map(function (p) {\n      return _this.polygonTree.addChild(p)\n    })\n    this.rootnode.addPolygonTreeNodes(polygontreenodes)\n  }\n}\n\n// # class Node\n// Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\n// by picking a polygon to split along.\n// Polygons are not stored directly in the tree, but in PolygonTreeNodes, stored in\n// this.polygontreenodes. Those PolygonTreeNodes are children of the owning\n// Tree.polygonTree\n// This is not a leafy BSP tree since there is\n// no distinction between internal and leaf nodes.\nconst Node = function (parent) {\n  this.plane = null\n  this.front = null\n  this.back = null\n  this.polygontreenodes = []\n  this.parent = parent\n}\n\nNode.prototype = {\n    // Convert solid space to empty space and empty space to solid space.\n  invert: function () {\n    let queue = [this]\n    let node\n    for (let i = 0; i < queue.length; i++) {\n      node = queue[i]\n      if (node.plane) node.plane = node.plane.flipped()\n      if (node.front) queue.push(node.front)\n      if (node.back) queue.push(node.back)\n      let temp = node.front\n      node.front = node.back\n      node.back = temp\n    }\n  },\n\n    // clip polygontreenodes to our plane\n    // calls remove() for all clipped PolygonTreeNodes\n  clipPolygons: function (polygontreenodes, alsoRemovecoplanarFront) {\n    let args = {'node': this, 'polygontreenodes': polygontreenodes}\n    let node\n    let stack = []\n\n    do {\n      node = args.node\n      polygontreenodes = args.polygontreenodes\n\n            // begin \"function\"\n      if (node.plane) {\n        let backnodes = []\n        let frontnodes = []\n        let coplanarfrontnodes = alsoRemovecoplanarFront ? backnodes : frontnodes\n        let plane = node.plane\n        let numpolygontreenodes = polygontreenodes.length\n        for (let i = 0; i < numpolygontreenodes; i++) {\n          let node1 = polygontreenodes[i]\n          if (!node1.isRemoved()) {\n            node1.splitByPlane(plane, coplanarfrontnodes, backnodes, frontnodes, backnodes)\n          }\n        }\n\n        if (node.front && (frontnodes.length > 0)) {\n          stack.push({'node': node.front, 'polygontreenodes': frontnodes})\n        }\n        let numbacknodes = backnodes.length\n        if (node.back && (numbacknodes > 0)) {\n          stack.push({'node': node.back, 'polygontreenodes': backnodes})\n        } else {\n                    // there's nothing behind this plane. Delete the nodes behind this plane:\n          for (let i = 0; i < numbacknodes; i++) {\n            backnodes[i].remove()\n          }\n        }\n      }\n      args = stack.pop()\n    } while (typeof (args) !== 'undefined')\n  },\n\n    // Remove all polygons in this BSP tree that are inside the other BSP tree\n    // `tree`.\n  clipTo: function (tree, alsoRemovecoplanarFront) {\n    let node = this\n    let stack = []\n    do {\n      if (node.polygontreenodes.length > 0) {\n        tree.rootnode.clipPolygons(node.polygontreenodes, alsoRemovecoplanarFront)\n      }\n      if (node.front) stack.push(node.front)\n      if (node.back) stack.push(node.back)\n      node = stack.pop()\n    } while (typeof (node) !== 'undefined')\n  },\n\n  addPolygonTreeNodes: function (polygontreenodes) {\n    let args = {'node': this, 'polygontreenodes': polygontreenodes}\n    let node\n    let stack = []\n    do {\n      node = args.node\n      polygontreenodes = args.polygontreenodes\n\n      if (polygontreenodes.length === 0) {\n        args = stack.pop()\n        continue\n      }\n      let _this = node\n      if (!node.plane) {\n        let bestplane = polygontreenodes[0].getPolygon().plane\n        node.plane = bestplane\n      }\n      let frontnodes = []\n      let backnodes = []\n\n      for (let i = 0, n = polygontreenodes.length; i < n; ++i) {\n        polygontreenodes[i].splitByPlane(_this.plane, _this.polygontreenodes, backnodes, frontnodes, backnodes)\n      }\n\n      if (frontnodes.length > 0) {\n        if (!node.front) node.front = new Node(node)\n        stack.push({'node': node.front, 'polygontreenodes': frontnodes})\n      }\n      if (backnodes.length > 0) {\n        if (!node.back) node.back = new Node(node)\n        stack.push({'node': node.back, 'polygontreenodes': backnodes})\n      }\n\n      args = stack.pop()\n    } while (typeof (args) !== 'undefined')\n  },\n\n  getParentPlaneNormals: function (normals, maxdepth) {\n    if (maxdepth > 0) {\n      if (this.parent) {\n        normals.push(this.parent.plane.normal)\n        this.parent.getParentPlaneNormals(normals, maxdepth - 1)\n      }\n    }\n  }\n}\n\nmodule.exports = Tree\n\n},{\"./constants\":54,\"./math/Polygon3\":62,\"./math/Vertex3\":67}],72:[function(require,module,exports){\nfunction fnNumberSort (a, b) {\n  return a - b\n}\n\nfunction fnSortByIndex (a, b) {\n  return a.index - b.index\n}\n\nconst IsFloat = function (n) {\n  return (!isNaN(n)) || (n === Infinity) || (n === -Infinity)\n}\n\nconst solve2Linear = function (a, b, c, d, u, v) {\n  let det = a * d - b * c\n  let invdet = 1.0 / det\n  let x = u * d - b * v\n  let y = -u * c + a * v\n  x *= invdet\n  y *= invdet\n  return [x, y]\n}\n\nfunction insertSorted (array, element, comparefunc) {\n  let leftbound = 0\n  let rightbound = array.length\n  while (rightbound > leftbound) {\n    let testindex = Math.floor((leftbound + rightbound) / 2)\n    let testelement = array[testindex]\n    let compareresult = comparefunc(element, testelement)\n    if (compareresult > 0) // element > testelement\n    {\n      leftbound = testindex + 1\n    } else {\n      rightbound = testindex\n    }\n  }\n  array.splice(leftbound, 0, element)\n}\n\n// Get the x coordinate of a point with a certain y coordinate, interpolated between two\n// points (CSG.Vector2D).\n// Interpolation is robust even if the points have the same y coordinate\nconst interpolateBetween2DPointsForY = function (point1, point2, y) {\n  let f1 = y - point1.y\n  let f2 = point2.y - point1.y\n  if (f2 < 0) {\n    f1 = -f1\n    f2 = -f2\n  }\n  let t\n  if (f1 <= 0) {\n    t = 0.0\n  } else if (f1 >= f2) {\n    t = 1.0\n  } else if (f2 < 1e-10) { // FIXME Should this be CSG.EPS?\n    t = 0.5\n  } else {\n    t = f1 / f2\n  }\n  let result = point1.x + t * (point2.x - point1.x)\n  return result\n}\n\nfunction isCAG (object) {\n  // objects[i] instanceof CAG => NOT RELIABLE\n  // 'instanceof' causes huge issues when using objects from\n  // two different versions of CSG.js as they are not reckonized as one and the same\n  // so DO NOT use instanceof to detect matching types for CSG/CAG\n  if (!('sides' in object)) {\n    return false\n  }\n  if (!('length' in object.sides)) {\n    return false\n  }\n\n  return true\n}\n\nfunction isCSG (object) {\n  // objects[i] instanceof CSG => NOT RELIABLE\n  // 'instanceof' causes huge issues when using objects from\n  // two different versions of CSG.js as they are not reckonized as one and the same\n  // so DO NOT use instanceof to detect matching types for CSG/CAG\n  if (!('polygons' in object)) {\n    return false\n  }\n  if (!('length' in object.polygons)) {\n    return false\n  }\n  return true\n}\n\nmodule.exports = {\n  fnNumberSort,\n  fnSortByIndex,\n  IsFloat,\n  solve2Linear,\n  insertSorted,\n  interpolateBetween2DPointsForY,\n  isCAG,\n  isCSG\n}\n\n},{}],73:[function(require,module,exports){\nconst Vector2D = require('../math/Vector2')\n\n// see http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ :\n// Area of the polygon. For a counter clockwise rotating polygon the area is positive, otherwise negative\n// Note(bebbi): this looks wrong. See polygon getArea()\nconst area = function (cag) {\n  let polygonArea = 0\n  cag.sides.map(function (side) {\n    polygonArea += side.vertex0.pos.cross(side.vertex1.pos)\n  })\n  polygonArea *= 0.5\n  return polygonArea\n}\n\nconst getBounds = function (cag) {\n  let minpoint\n  if (cag.sides.length === 0) {\n    minpoint = new Vector2D(0, 0)\n  } else {\n    minpoint = cag.sides[0].vertex0.pos\n  }\n  let maxpoint = minpoint\n  cag.sides.map(function (side) {\n    minpoint = minpoint.min(side.vertex0.pos)\n    minpoint = minpoint.min(side.vertex1.pos)\n    maxpoint = maxpoint.max(side.vertex0.pos)\n    maxpoint = maxpoint.max(side.vertex1.pos)\n  })\n  return [minpoint, maxpoint]\n}\n\nmodule.exports = {area, getBounds}\n\n},{\"../math/Vector2\":64}],74:[function(require,module,exports){\nconst {areaEPS} = require('../constants')\nconst {linesIntersect} = require('../math/lineUtils')\n\n// check if we are a valid CAG (for debugging)\n// NOTE(bebbi) uneven side count doesn't work because rounding with EPS isn't taken into account\nconst isCAGValid = function (CAG) {\n  let errors = []\n  if (CAG.isSelfIntersecting(true)) {\n    errors.push('Self intersects')\n  }\n  let pointcount = {}\n  CAG.sides.map(function (side) {\n    function mappoint (p) {\n      let tag = p.x + ' ' + p.y\n      if (!(tag in pointcount)) pointcount[tag] = 0\n      pointcount[tag] ++\n    }\n    mappoint(side.vertex0.pos)\n    mappoint(side.vertex1.pos)\n  })\n  for (let tag in pointcount) {\n    let count = pointcount[tag]\n    if (count & 1) {\n      errors.push('Uneven number of sides (' + count + ') for point ' + tag)\n    }\n  }\n  let area = CAG.area()\n  if (area < areaEPS) {\n    errors.push('Area is ' + area)\n  }\n  if (errors.length > 0) {\n    let ertxt = ''\n    errors.map(function (err) {\n      ertxt += err + '\\n'\n    })\n    throw new Error(ertxt)\n  }\n}\n\nconst isSelfIntersecting = function (cag, debug) {\n  let numsides = cag.sides.length\n  for (let i = 0; i < numsides; i++) {\n    let side0 = cag.sides[i]\n    for (let ii = i + 1; ii < numsides; ii++) {\n      let side1 = cag.sides[ii]\n      if (linesIntersect(side0.vertex0.pos, side0.vertex1.pos, side1.vertex0.pos, side1.vertex1.pos)) {\n        if (debug) { console.log('side ' + i + ': ' + side0); console.log('side ' + ii + ': ' + side1) }\n        return true\n      }\n    }\n  }\n  return false\n}\n\n/** Check if the point stay inside the CAG shape\n* ray-casting algorithm based on :\n* https://github.com/substack/point-in-polygon/blob/master/index.js\n* http://www.ecse.rp1.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n* originaly writed for https://github.com/lautr3k/SLAcer.js/blob/dev/js/slacer/slicer.js#L82\n* @param {CAG} cag - CAG object\n* @param {Object} p0 - Vertex2 like object\n* @returns {Boolean}\n*/\nconst hasPointInside = function (cag, p0) {\n  let p1 = null\n  let p2 = null\n  let inside = false\n  cag.sides.forEach(side => {\n    p1 = side.vertex0.pos\n    p2 = side.vertex1.pos\n    if (hasPointInside.c1(p0, p1, p2) && hasPointInside.c2(p0, p1, p2)) {\n      inside = !inside\n    }\n  })\n  return inside\n}\n\nhasPointInside.c1 = (p0, p1, p2) => (p1.y > p0.y) !== (p2.y > p0.y)\nhasPointInside.c2 = (p0, p1, p2) => (p0.x < (p2.x - p1.x) * (p0.y - p1.y) / (p2.y - p1.y) + p1.x)\n\n/** Check if all points from one CAG stay inside another CAG\n* @param {CAG} cag1 - CAG object\n* @param {Object} cag2 - CAG object\n* @returns {Boolean}\n*/\nconst contains = function (cag1, cag2) {\n  for (let i = 0, il = cag2.sides.length; i < il; i++) {\n    if (!hasPointInside(cag1, cag2.sides[i].vertex0.pos)) {\n      return false\n    }\n  }\n  return true\n}\n\nmodule.exports = {\n  isCAGValid,\n  isSelfIntersecting,\n  hasPointInside,\n  contains\n}\n\n},{\"../constants\":54,\"../math/lineUtils\":68}],75:[function(require,module,exports){\nconst {EPS} = require('../constants')\nconst FuzzyCSGFactory = require('../FuzzyFactory3d')\nconst FuzzyCAGFactory = require('../FuzzyFactory2d')\nconst {fromPolygons} = require('../CSGFactories')\nconst {fromSides} = require('../CAGFactories')\n\n/**\n   * Returns a cannoicalized version of the input csg/cag : ie every very close\n   * points get deduplicated\n   * @returns {CSG|CAG}\n   * @example\n   * let rawInput = someCSGORCAGMakingFunction()\n   * let canonicalized= canonicalize(rawInput)\n   */\nconst canonicalize = function (csgOrCAG, options) {\n  if (csgOrCAG.isCanonicalized) {\n    return csgOrCAG\n  } else {\n    if ('sides' in csgOrCAG) {\n      return canonicalizeCAG(csgOrCAG, options)\n    } else {\n      return canonicalizeCSG(csgOrCAG, options)\n    }\n  }\n}\n\n/**\n   * Returns a cannoicalized version of the input csg : ie every very close\n   * points get deduplicated\n   * @returns {CSG}\n   * @example\n   * let rawCSG = someCSGMakingFunction()\n   * let canonicalizedCSG = canonicalize(rawCSG)\n   */\nconst canonicalizeCSG = function (csg, options) {\n  if (csg.isCanonicalized) {\n    return csg\n  } else {\n    const factory = new FuzzyCSGFactory()\n    let result = CSGFromCSGFuzzyFactory(factory, csg)\n    result.isCanonicalized = true\n    result.isRetesselated = csg.isRetesselated\n    result.properties = csg.properties // keep original properties\n    return result\n  }\n}\n\nconst canonicalizeCAG = function (cag, options) {\n  if (cag.isCanonicalized) {\n    return cag\n  } else {\n    let factory = new FuzzyCAGFactory()\n    let result = CAGFromCAGFuzzyFactory(factory, cag)\n    result.isCanonicalized = true\n    return result\n  }\n}\n\nconst CSGFromCSGFuzzyFactory = function (factory, sourcecsg) {\n  let _this = factory\n  let newpolygons = []\n  sourcecsg.polygons.forEach(function (polygon) {\n    let newpolygon = _this.getPolygon(polygon)\n          // see getPolygon above: we may get a polygon with no vertices, discard it:\n    if (newpolygon.vertices.length >= 3) {\n      newpolygons.push(newpolygon)\n    }\n  })\n  return fromPolygons(newpolygons)\n}\n\nconst CAGFromCAGFuzzyFactory = function (factory, sourcecag) {\n  let _this = factory\n  let newsides = sourcecag.sides.map(function (side) {\n    return _this.getSide(side)\n  })\n  // remove bad sides (mostly a user input issue)\n  .filter(function (side) {\n    return side.length() > EPS\n  })\n  return fromSides(newsides)\n}\n\nmodule.exports = canonicalize\n\n},{\"../CAGFactories\":46,\"../CSGFactories\":48,\"../FuzzyFactory2d\":50,\"../FuzzyFactory3d\":51,\"../constants\":54}],76:[function(require,module,exports){\nconst Vector3D = require('../math/Vector3')\n\n/**\n   * Returns an array of Vector3D, providing minimum coordinates and maximum coordinates\n   * of this solid.\n   * @returns {Vector3D[]}\n   * @example\n   * let bounds = A.getBounds()\n   * let minX = bounds[0].x\n   */\nconst bounds = function (csg) {\n  if (!csg.cachedBoundingBox) {\n    let minpoint = new Vector3D(0, 0, 0)\n    let maxpoint = new Vector3D(0, 0, 0)\n    let polygons = csg.polygons\n    let numpolygons = polygons.length\n    for (let i = 0; i < numpolygons; i++) {\n      let polygon = polygons[i]\n      let bounds = polygon.boundingBox()\n      if (i === 0) {\n        minpoint = bounds[0]\n        maxpoint = bounds[1]\n      } else {\n        minpoint = minpoint.min(bounds[0])\n        maxpoint = maxpoint.max(bounds[1])\n      }\n    }\n      // FIXME: not ideal, we are mutating the input, we need to move some of it out\n    csg.cachedBoundingBox = [minpoint, maxpoint]\n  }\n  return csg.cachedBoundingBox\n}\n\nconst volume = function (csg) {\n  let result = csg.toTriangles().map(function (triPoly) {\n    return triPoly.getTetraFeatures(['volume'])\n  })\n  console.log('volume', result)\n}\n\nconst area = function (csg) {\n  let result = csg.toTriangles().map(function (triPoly) {\n    return triPoly.getTetraFeatures(['area'])\n  })\n  console.log('area', result)\n}\n\nmodule.exports = {bounds, volume, area}\n\n},{\"../math/Vector3\":65}],77:[function(require,module,exports){\nconst CAG = require('../CAG') // FIXME: circular dependency !\nconst {EPS} = require('../constants')\n\n// project the 3D CSG onto a plane\n// This returns a 2D CAG with the 'shadow' shape of the 3D solid when projected onto the\n // plane represented by the orthonormal basis\nconst projectToOrthoNormalBasis = function (csg, orthobasis) {\n  let cags = []\n  csg.polygons.filter(function (p) {\n    // only return polys in plane, others may disturb result\n    return p.plane.normal.minus(orthobasis.plane.normal).lengthSquared() < (EPS * EPS)\n  })\n  .map(function (polygon) {\n    let cag = polygon.projectToOrthoNormalBasis(orthobasis)\n    if (cag.sides.length > 0) {\n      cags.push(cag)\n    }\n  })\n  let result = new CAG().union(cags)\n  return result\n}\n\nmodule.exports = {projectToOrthoNormalBasis}\n\n},{\"../CAG\":45,\"../constants\":54}],78:[function(require,module,exports){\nconst {EPS} = require('../constants')\nconst Polygon = require('../math/Polygon3')\nconst Plane = require('../math/Plane')\n\nfunction addSide (sidemap, vertextag2sidestart, vertextag2sideend, vertex0, vertex1, polygonindex) {\n  let starttag = vertex0.getTag()\n  let endtag = vertex1.getTag()\n  if (starttag === endtag) throw new Error('Assertion failed')\n  let newsidetag = starttag + '/' + endtag\n  let reversesidetag = endtag + '/' + starttag\n  if (reversesidetag in sidemap) {\n    // we have a matching reverse oriented side.\n    // Instead of adding the new side, cancel out the reverse side:\n    // console.log(\"addSide(\"+newsidetag+\") has reverse side:\");\n    deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, vertex1, vertex0, null)\n    return null\n  }\n  //  console.log(\"addSide(\"+newsidetag+\")\");\n  let newsideobj = {\n    vertex0: vertex0,\n    vertex1: vertex1,\n    polygonindex: polygonindex\n  }\n  if (!(newsidetag in sidemap)) {\n    sidemap[newsidetag] = [newsideobj]\n  } else {\n    sidemap[newsidetag].push(newsideobj)\n  }\n  if (starttag in vertextag2sidestart) {\n    vertextag2sidestart[starttag].push(newsidetag)\n  } else {\n    vertextag2sidestart[starttag] = [newsidetag]\n  }\n  if (endtag in vertextag2sideend) {\n    vertextag2sideend[endtag].push(newsidetag)\n  } else {\n    vertextag2sideend[endtag] = [newsidetag]\n  }\n  return newsidetag\n}\n\nfunction deleteSide (sidemap, vertextag2sidestart, vertextag2sideend, vertex0, vertex1, polygonindex) {\n  let starttag = vertex0.getTag()\n  let endtag = vertex1.getTag()\n  let sidetag = starttag + '/' + endtag\n  // console.log(\"deleteSide(\"+sidetag+\")\");\n  if (!(sidetag in sidemap)) throw new Error('Assertion failed')\n  let idx = -1\n  let sideobjs = sidemap[sidetag]\n  for (let i = 0; i < sideobjs.length; i++) {\n    let sideobj = sideobjs[i]\n    if (sideobj.vertex0 !== vertex0) continue\n    if (sideobj.vertex1 !== vertex1) continue\n    if (polygonindex !== null) {\n      if (sideobj.polygonindex !== polygonindex) continue\n    }\n    idx = i\n    break\n  }\n  if (idx < 0) throw new Error('Assertion failed')\n  sideobjs.splice(idx, 1)\n  if (sideobjs.length === 0) {\n    delete sidemap[sidetag]\n  }\n  idx = vertextag2sidestart[starttag].indexOf(sidetag)\n  if (idx < 0) throw new Error('Assertion failed')\n  vertextag2sidestart[starttag].splice(idx, 1)\n  if (vertextag2sidestart[starttag].length === 0) {\n    delete vertextag2sidestart[starttag]\n  }\n\n  idx = vertextag2sideend[endtag].indexOf(sidetag)\n  if (idx < 0) throw new Error('Assertion failed')\n  vertextag2sideend[endtag].splice(idx, 1)\n  if (vertextag2sideend[endtag].length === 0) {\n    delete vertextag2sideend[endtag]\n  }\n}\n\n/*\n     fixTJunctions:\n\n     Suppose we have two polygons ACDB and EDGF:\n\n      A-----B\n      |     |\n      |     E--F\n      |     |  |\n      C-----D--G\n\n     Note that vertex E forms a T-junction on the side BD. In this case some STL slicers will complain\n     that the solid is not watertight. This is because the watertightness check is done by checking if\n     each side DE is matched by another side ED.\n\n     This function will return a new solid with ACDB replaced by ACDEB\n\n     Note that this can create polygons that are slightly non-convex (due to rounding errors). Therefore the result should\n     not be used for further CSG operations!\n*/\nconst fixTJunctions = function (fromPolygons, csg) {\n  csg = csg.canonicalized()\n  let sidemap = {}\n\n  // STEP 1\n  for (let polygonindex = 0; polygonindex < csg.polygons.length; polygonindex++) {\n    let polygon = csg.polygons[polygonindex]\n    let numvertices = polygon.vertices.length\n    // should be true\n    if (numvertices >= 3) {\n      let vertex = polygon.vertices[0]\n      let vertextag = vertex.getTag()\n      for (let vertexindex = 0; vertexindex < numvertices; vertexindex++) {\n        let nextvertexindex = vertexindex + 1\n        if (nextvertexindex === numvertices) nextvertexindex = 0\n        let nextvertex = polygon.vertices[nextvertexindex]\n        let nextvertextag = nextvertex.getTag()\n        let sidetag = vertextag + '/' + nextvertextag\n        let reversesidetag = nextvertextag + '/' + vertextag\n        if (reversesidetag in sidemap) {\n          // this side matches the same side in another polygon. Remove from sidemap:\n          let ar = sidemap[reversesidetag]\n          ar.splice(-1, 1)\n          if (ar.length === 0) {\n            delete sidemap[reversesidetag]\n          }\n        } else {\n          let sideobj = {\n            vertex0: vertex,\n            vertex1: nextvertex,\n            polygonindex: polygonindex\n          }\n          if (!(sidetag in sidemap)) {\n            sidemap[sidetag] = [sideobj]\n          } else {\n            sidemap[sidetag].push(sideobj)\n          }\n        }\n        vertex = nextvertex\n        vertextag = nextvertextag\n      }\n    }\n  }\n  // STEP 2\n  // now sidemap contains 'unmatched' sides\n  // i.e. side AB in one polygon does not have a matching side BA in another polygon\n  let vertextag2sidestart = {}\n  let vertextag2sideend = {}\n  let sidestocheck = {}\n  let sidemapisempty = true\n  for (let sidetag in sidemap) {\n    sidemapisempty = false\n    sidestocheck[sidetag] = true\n    sidemap[sidetag].map(function (sideobj) {\n      let starttag = sideobj.vertex0.getTag()\n      let endtag = sideobj.vertex1.getTag()\n      if (starttag in vertextag2sidestart) {\n        vertextag2sidestart[starttag].push(sidetag)\n      } else {\n        vertextag2sidestart[starttag] = [sidetag]\n      }\n      if (endtag in vertextag2sideend) {\n        vertextag2sideend[endtag].push(sidetag)\n      } else {\n        vertextag2sideend[endtag] = [sidetag]\n      }\n    })\n  }\n\n  // STEP 3 : if sidemap is not empty\n  if (!sidemapisempty) {\n    // make a copy of the polygons array, since we are going to modify it:\n    let polygons = csg.polygons.slice(0)\n    while (true) {\n      let sidemapisempty = true\n      for (let sidetag in sidemap) {\n        sidemapisempty = false\n        sidestocheck[sidetag] = true\n      }\n      if (sidemapisempty) break\n      let donesomething = false\n      while (true) {\n        let sidetagtocheck = null\n        for (let sidetag in sidestocheck) {\n          sidetagtocheck = sidetag\n          break // FIXME  : say what now ?\n        }\n        if (sidetagtocheck === null) break // sidestocheck is empty, we're done!\n        let donewithside = true\n        if (sidetagtocheck in sidemap) {\n          let sideobjs = sidemap[sidetagtocheck]\n          if (sideobjs.length === 0) throw new Error('Assertion failed')\n          let sideobj = sideobjs[0]\n          for (let directionindex = 0; directionindex < 2; directionindex++) {\n            let startvertex = (directionindex === 0) ? sideobj.vertex0 : sideobj.vertex1\n            let endvertex = (directionindex === 0) ? sideobj.vertex1 : sideobj.vertex0\n            let startvertextag = startvertex.getTag()\n            let endvertextag = endvertex.getTag()\n            let matchingsides = []\n            if (directionindex === 0) {\n              if (startvertextag in vertextag2sideend) {\n                matchingsides = vertextag2sideend[startvertextag]\n              }\n            } else {\n              if (startvertextag in vertextag2sidestart) {\n                matchingsides = vertextag2sidestart[startvertextag]\n              }\n            }\n            for (let matchingsideindex = 0; matchingsideindex < matchingsides.length; matchingsideindex++) {\n              let matchingsidetag = matchingsides[matchingsideindex]\n              let matchingside = sidemap[matchingsidetag][0]\n              let matchingsidestartvertex = (directionindex === 0) ? matchingside.vertex0 : matchingside.vertex1\n              let matchingsideendvertex = (directionindex === 0) ? matchingside.vertex1 : matchingside.vertex0\n              let matchingsidestartvertextag = matchingsidestartvertex.getTag()\n              let matchingsideendvertextag = matchingsideendvertex.getTag()\n              if (matchingsideendvertextag !== startvertextag) throw new Error('Assertion failed')\n              if (matchingsidestartvertextag === endvertextag) {\n                // matchingside cancels sidetagtocheck\n                deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, startvertex, endvertex, null)\n                deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, endvertex, startvertex, null)\n                donewithside = false\n                directionindex = 2 // skip reverse direction check\n                donesomething = true\n                break\n              } else {\n                let startpos = startvertex.pos\n                let endpos = endvertex.pos\n                let checkpos = matchingsidestartvertex.pos\n                let direction = checkpos.minus(startpos)\n                // Now we need to check if endpos is on the line startpos-checkpos:\n                let t = endpos.minus(startpos).dot(direction) / direction.dot(direction)\n                if ((t > 0) && (t < 1)) {\n                  let closestpoint = startpos.plus(direction.times(t))\n                  let distancesquared = closestpoint.distanceToSquared(endpos)\n                  if (distancesquared < (EPS * EPS)) {\n                    // Yes it's a t-junction! We need to split matchingside in two:\n                    let polygonindex = matchingside.polygonindex\n                    let polygon = polygons[polygonindex]\n                    // find the index of startvertextag in polygon:\n                    let insertionvertextag = matchingside.vertex1.getTag()\n                    let insertionvertextagindex = -1\n                    for (let i = 0; i < polygon.vertices.length; i++) {\n                      if (polygon.vertices[i].getTag() === insertionvertextag) {\n                        insertionvertextagindex = i\n                        break\n                      }\n                    }\n                    if (insertionvertextagindex < 0) throw new Error('Assertion failed')\n                    // split the side by inserting the vertex:\n                    let newvertices = polygon.vertices.slice(0)\n                    newvertices.splice(insertionvertextagindex, 0, endvertex)\n                    let newpolygon = new Polygon(newvertices, polygon.shared /* polygon.plane */)\n\n                    // calculate plane with differents point\n                    if (isNaN(newpolygon.plane.w)) {\n                      let found = false\n                      let loop = function (callback) {\n                        newpolygon.vertices.forEach(function (item) {\n                          if (found) return\n                          callback(item)\n                        })\n                      }\n\n                      loop(function (a) {\n                        loop(function (b) {\n                          loop(function (c) {\n                            newpolygon.plane = Plane.fromPoints(a.pos, b.pos, c.pos)\n                            if (!isNaN(newpolygon.plane.w)) {\n                              found = true\n                            }\n                          })\n                        })\n                      })\n                    }\n                    polygons[polygonindex] = newpolygon\n                    // remove the original sides from our maps\n                    // deleteSide(sideobj.vertex0, sideobj.vertex1, null)\n                    deleteSide(sidemap, vertextag2sidestart, vertextag2sideend, matchingside.vertex0, matchingside.vertex1, polygonindex)\n                    let newsidetag1 = addSide(sidemap, vertextag2sidestart, vertextag2sideend, matchingside.vertex0, endvertex, polygonindex)\n                    let newsidetag2 = addSide(sidemap, vertextag2sidestart, vertextag2sideend, endvertex, matchingside.vertex1, polygonindex)\n                    if (newsidetag1 !== null) sidestocheck[newsidetag1] = true\n                    if (newsidetag2 !== null) sidestocheck[newsidetag2] = true\n                    donewithside = false\n                    directionindex = 2 // skip reverse direction check\n                    donesomething = true\n                    break\n                  } // if(distancesquared < 1e-10)\n                } // if( (t > 0) && (t < 1) )\n              } // if(endingstidestartvertextag === endvertextag)\n            } // for matchingsideindex\n          } // for directionindex\n        } // if(sidetagtocheck in sidemap)\n        if (donewithside) {\n          delete sidestocheck[sidetagtocheck]\n        }\n      }\n      if (!donesomething) break\n    }\n    let newcsg = fromPolygons(polygons)\n    newcsg.properties = csg.properties\n    newcsg.isCanonicalized = true\n    newcsg.isRetesselated = true\n    csg = newcsg\n  }\n\n  // FIXME : what is even the point of this ???\n  /* sidemapisempty = true\n  for (let sidetag in sidemap) {\n    sidemapisempty = false\n    break\n  }\n  */\n\n  return csg\n}\n\nmodule.exports = fixTJunctions\n\n},{\"../constants\":54,\"../math/Plane\":60,\"../math/Polygon3\":62}],79:[function(require,module,exports){\nconst FuzzyCSGFactory = require('../FuzzyFactory3d')\nconst reTesselateCoplanarPolygons = require('../math/reTesselateCoplanarPolygons')\nconst {fromPolygons} = require('../CSGFactories')\n\nconst reTesselate = function (csg) {\n  if (csg.isRetesselated) {\n    return csg\n  } else {\n    let polygonsPerPlane = {}\n    let isCanonicalized = csg.isCanonicalized\n    let fuzzyfactory = new FuzzyCSGFactory()\n    csg.polygons.map(function (polygon) {\n      let plane = polygon.plane\n      let shared = polygon.shared\n      if (!isCanonicalized) {\n        // in order to identify polygons having the same plane, we need to canonicalize the planes\n        // We don't have to do a full canonizalization (including vertices), to save time only do the planes and the shared data:\n        plane = fuzzyfactory.getPlane(plane)\n        shared = fuzzyfactory.getPolygonShared(shared)\n      }\n      let tag = plane.getTag() + '/' + shared.getTag()\n      if (!(tag in polygonsPerPlane)) {\n        polygonsPerPlane[tag] = [polygon]\n      } else {\n        polygonsPerPlane[tag].push(polygon)\n      }\n    })\n    let destpolygons = []\n    for (let planetag in polygonsPerPlane) {\n      let sourcepolygons = polygonsPerPlane[planetag]\n      if (sourcepolygons.length < 2) {\n        destpolygons = destpolygons.concat(sourcepolygons)\n      } else {\n        let retesselayedpolygons = []\n        reTesselateCoplanarPolygons(sourcepolygons, retesselayedpolygons)\n        destpolygons = destpolygons.concat(retesselayedpolygons)\n      }\n    }\n    let result = fromPolygons(destpolygons)\n    result.isRetesselated = true\n    // result = result.canonicalized();\n    result.properties = csg.properties // keep original properties\n    return result\n  }\n}\n\nmodule.exports = reTesselate\n\n},{\"../CSGFactories\":48,\"../FuzzyFactory3d\":51,\"../math/reTesselateCoplanarPolygons\":69}],80:[function(require,module,exports){\n/* converts input data to array if it is not already an array */\nfunction toArray (data) {\n  if (!data) return []\n  if (data.constructor !== Array) return [data]\n  return data\n}\n\nmodule.exports = toArray\n\n},{}],81:[function(require,module,exports){\n// -- data source from from http://paulbourke.net/dataformats/hershey/\n// -- reduced to save some bytes...\n// { [ascii code]: [width, x, y, ...] } - undefined value as path separator\nmodule.exports = {\n  height: 14,\n  32:[16],\n  33:[10,5,21,5,7,,5,2,4,1,5,0,6,1,5,2],\n  34:[16,4,21,4,14,,12,21,12,14],\n  35:[21,11,25,4,-7,,17,25,10,-7,,4,12,18,12,,3,6,17,6],\n  36:[20,8,25,8,-4,,12,25,12,-4,,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3],\n  37:[24,21,21,3,0,,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7],\n  38:[26,23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2],\n  39:[10,5,19,4,20,5,21,6,20,6,18,5,16,4,15],\n  40:[14,11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7],\n  41:[14,3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7],\n  42:[16,8,21,8,9,,3,18,13,12,,13,18,3,12],\n  43:[26,13,18,13,0,,4,9,22,9],\n  44:[10,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4],\n  45:[26,4,9,22,9],\n  46:[10,5,2,4,1,5,0,6,1,5,2],\n  47:[22,20,25,2,-7],\n  48:[20,9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21],\n  49:[20,6,17,8,18,11,21,11,0],\n  50:[20,4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0],\n  51:[20,5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4],\n  52:[20,13,21,3,7,18,7,,13,21,13,0],\n  53:[20,15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4],\n  54:[20,16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7],\n  55:[20,17,21,7,0,,3,21,17,21],\n  56:[20,8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21],\n  57:[20,16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3],\n  58:[10,5,14,4,13,5,12,6,13,5,14,,5,2,4,1,5,0,6,1,5,2],\n  59:[10,5,14,4,13,5,12,6,13,5,14,,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4],\n  60:[24,20,18,4,9,20,0],\n  61:[26,4,12,22,12,,4,6,22,6],\n  62:[24,4,18,20,9,4,0],\n  63:[18,3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,,9,2,8,1,9,0,10,1,9,2],\n  64:[27,18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,,12,16,10,14,9,11,9,8,10,6,11,5,,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,,19,16,18,8,18,6,19,5],\n  65:[18,9,21,1,0,,9,21,17,0,,4,7,14,7],\n  66:[21,4,21,4,0,,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0],\n  67:[21,18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5],\n  68:[21,4,21,4,0,,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0],\n  69:[19,4,21,4,0,,4,21,17,21,,4,11,12,11,,4,0,17,0],\n  70:[18,4,21,4,0,,4,21,17,21,,4,11,12,11],\n  71:[21,18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,,13,8,18,8],\n  72:[22,4,21,4,0,,18,21,18,0,,4,11,18,11],\n  73:[8,4,21,4,0],\n  74:[16,12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7],\n  75:[21,4,21,4,0,,18,21,4,7,,9,12,18,0],\n  76:[17,4,21,4,0,,4,0,16,0],\n  77:[24,4,21,4,0,,4,21,12,0,,20,21,12,0,,20,21,20,0],\n  78:[22,4,21,4,0,,4,21,18,0,,18,21,18,0],\n  79:[22,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21],\n  80:[21,4,21,4,0,,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10],\n  81:[22,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,,12,4,18,-2],\n  82:[21,4,21,4,0,,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,,11,11,18,0],\n  83:[20,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3],\n  84:[16,8,21,8,0,,1,21,15,21],\n  85:[22,4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21],\n  86:[18,1,21,9,0,,17,21,9,0],\n  87:[24,2,21,7,0,,12,21,7,0,,12,21,17,0,,22,21,17,0],\n  88:[20,3,21,17,0,,17,21,3,0],\n  89:[18,1,21,9,11,9,0,,17,21,9,11],\n  90:[20,17,21,3,0,,3,21,17,21,,3,0,17,0],\n  91:[14,4,25,4,-7,,5,25,5,-7,,4,25,11,25,,4,-7,11,-7],\n  92:[14,0,21,14,-3],\n  93:[14,9,25,9,-7,,10,25,10,-7,,3,25,10,25,,3,-7,10,-7],\n  94:[16,6,15,8,18,10,15,,3,12,8,17,13,12,,8,17,8,0],\n  95:[16,0,-2,16,-2],\n  96:[10,6,21,5,20,4,18,4,16,5,15,6,16,5,17],\n  97:[19,15,14,15,0,,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],\n  98:[19,4,21,4,0,,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3],\n  99:[18,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],\n  100:[19,15,21,15,0,,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],\n  101:[18,3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],\n  102:[12,10,21,8,21,6,20,5,17,5,0,,2,14,9,14],\n  103:[19,15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],\n  104:[19,4,21,4,0,,4,10,7,13,9,14,12,14,14,13,15,10,15,0],\n  105:[8,3,21,4,20,5,21,4,22,3,21,,4,14,4,0],\n  106:[10,5,21,6,20,7,21,6,22,5,21,,6,14,6,-3,5,-6,3,-7,1,-7],\n  107:[17,4,21,4,0,,14,14,4,4,,8,8,15,0],\n  108:[8,4,21,4,0],\n  109:[30,4,14,4,0,,4,10,7,13,9,14,12,14,14,13,15,10,15,0,,15,10,18,13,20,14,23,14,25,13,26,10,26,0],\n  110:[19,4,14,4,0,,4,10,7,13,9,14,12,14,14,13,15,10,15,0],\n  111:[19,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14],\n  112:[19,4,14,4,-7,,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3],\n  113:[19,15,14,15,-7,,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3],\n  114:[13,4,14,4,0,,4,8,5,11,7,13,9,14,12,14],\n  115:[17,14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3],\n  116:[12,5,21,5,4,6,1,8,0,10,0,,2,14,9,14],\n  117:[19,4,14,4,4,5,1,7,0,10,0,12,1,15,4,,15,14,15,0],\n  118:[16,2,14,8,0,,14,14,8,0],\n  119:[22,3,14,7,0,,11,14,7,0,,11,14,15,0,,19,14,15,0],\n  120:[17,3,14,14,0,,14,14,3,0],\n  121:[16,2,14,8,0,,14,14,8,0,6,-4,4,-6,2,-7,1,-7],\n  122:[17,14,14,3,0,,3,14,14,14,,3,0,14,0],\n  123:[14,9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7],\n  124:[8,4,25,4,-7],\n  125:[14,5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7],\n  126:[24,3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]\n}\n\n},{}],82:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2017 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n\nThanks to @issacs for the sax js library, and inspiration for this reader\n\n*/\n\n// DXF reader to emit groups of interest to handlers\n\n;(function (dxf) { // wrapper for non-node envs\n  dxf.reader = function (options) { return new DxfReader(options) }\n\n  dxf.STATES = [\n    'start',\n    'end',\n    'error'\n  ]\n\n  /**\n   * Class DxfReader\n   * A class to hold state while reading DXF formatted data.\n   * @param {Object} [options] - options for parsing\n   * @param {Boolean} [options.track=true] - track position for error reporting\n   * @param {Boolean} [options.strict=false] - obey strict DXF specifications\n   * @constructor\n   *\n   * @example\n   * const dxfPath = path.resolve(__dirname, 'circle10.dxf')\n   * let src = fs.readFileSync(dxfPath, 'UTF8')\n   * let reader = dxf.reader({track: true})\n   * // setup state handling\n   * reader.on('error',handleError)\n   * reader.on('start',handleStart)\n   * reader.on('end'  ,handleEnd)\n   * // setup handling for groups of interest, skip the rest\n   * reader.absorb(0,handleEntity)\n   * // start the reader\n   * reader.write(src).close()\n   */\n  function DxfReader (options) {\n    var reader = this\n    reader.options = options || {}\n\n    reader.trackPosition = (reader.options.track !== false)\n    if (reader.trackPosition) {\n      reader.line = reader.column = reader.c = 0\n    }\n  }\n\n  DxfReader.prototype = {\n  // set a handler for the given state\n  // see dxf.STATES above\n    on: function (state, callback) {\n    // verify the state\n    // set the callback\n      var reader = this\n      reader['on' + state] = callback\n    },\n\n    // set a handler for the given group and value\n    absorb: function (group, callback) {\n      if (this.absorbers === undefined) {\n        this.absorbers = new Map()\n      }\n      this.absorbers.set(group, callback)\n    },\n\n    // write the given data into the reader, initiating parsing\n    write: function (data) {\n      var reader = this\n      parse(reader, data)\n      return reader\n    },\n\n    // close and clear all state\n    close: function () {\n      var reader = this\n      reader.isclosed = true\n      return reader\n    }\n  }\n\n  //\n  // emit the start of processing to the onstart handler if any\n  //\n  function emitstart (reader) {\n    return emitstate(reader, 'onstart', reader.data)\n  }\n\n  //\n  // emit the group (code and value) to asorbers\n  //\n  function emitgroup (reader, group, value) {\n    // console.log(group+\": \"+value)\n    // emit this group to all listeners\n    if (reader.absorbers !== undefined) {\n      var absorber = reader.absorbers.get(group)\n      if (absorber !== undefined) {\n        absorber(reader, group, value)\n      }\n    }\n  }\n\n  //\n  // wrap and emit the given error to the onerror handler if any\n  //\n  function emiterror (reader, er) {\n    // closeText(reader)\n    if (reader.trackPosition) {\n      er += `\nLine: ${reader.line}\nColumn: ${reader.column}\nChar: ${reader.c}`\n    }\n    er = new Error(er)\n    reader.error = er\n    return emitstate(reader, 'onerror', er)\n  }\n\n  //\n  // emit the end of processing to the onend handler if any\n  //\n  function emitend (reader) {\n    return emitstate(reader, 'onend', reader.data)\n  }\n\n  function emitstate (reader, state, data) {\n    var onhandler = state.toString()\n    reader[onhandler] && reader[onhandler](reader, data)\n    return reader\n  }\n\n  //\n  // parse the given data in the context of the given reader\n  //\n  function parse (reader, data) {\n  // check reader state\n    if (reader.error) {\n      throw reader.error // throw the last error\n    }\n    if (reader.isclosed) {\n      return emiterror(reader, 'Cannot write after close')\n    }\n\n    emitstart(reader)\n\n    if (data === null) {\n      return emitend(reader)\n    }\n\n    // initial state to initiate parsing\n    reader.group = null\n    reader.value = null\n    reader.error = null\n\n    reader.position = 0\n    reader.line = 0\n    reader.column = 0\n\n    // use or convert the data to String\n    var i = 0\n    var c = ''\n    var l = ''\n    while (reader.error === null) {\n      c = charAt(data, i++)\n      if (!c) {\n        break\n      }\n      if (reader.trackPosition) {\n        reader.position++\n        if (c === '\\n') {\n          reader.line++\n          reader.column = 0\n        } else {\n          reader.column++\n        }\n      }\n      // dxf files are parsed line by line\n      if (c === '\\n') {\n        parseLine(reader, l)\n        l = ''\n      } else {\n        l += c\n      }\n    }\n    // emit state change\n    emitend(reader)\n    return reader\n  }\n\n  /** Parse the given line in the context of the given reader, emitting group value pairs\n   * @param reader {DxfReader} - context DxfReader to use\n   * @param line {String} - line to parse\n   */\n  function parseLine (reader, line) {\n    line = line.trim()\n    if (reader.group === null) {\n      setDxfGroup(reader, line)\n      reader.value = null\n    } else {\n      setDxfValue(reader, line)\n    }\n    // handle group and value pairs\n    if (reader.group !== null && reader.value !== null) {\n      // emit events for group and value pairs\n      emitgroup(reader, reader.group, reader.value)\n\n      reader.group = null\n      reader.value = null\n    }\n  }\n\n  /** Parse the given line in the context of the given reader, and update the group\n   * @param reader {DxfReader} - context DxfReader to use\n   * @param line {String} - line to parse\n   */\n  function setDxfGroup (reader, line) {\n  // groups are numeric\n    var code = parseInt(line)\n    if (isNaN(code)) {\n      emiterror(reader, 'Invalid group (int)')\n      reader.group = null\n    } else {\n      reader.group = code\n    }\n  }\n\n  /** Parse the given line in the context of the given reader, and update the (group) value\n   * @param reader {DxfReader} - context DxfReader to use\n   * @param line {String} - line to parse\n   */\n  function setDxfValue (reader, line) {\n    if (reader.options.strict) {\n      // TODO evaluate the value based on DXF specifications\n      reader.value = line\n    } else {\n      reader.value = line\n    }\n  }\n\n  //\n  // helper function to return expected values\n  //\n  function charAt (data, i) {\n    if (data && data.length > i) {\n      return data.charAt(i)\n    }\n    return ''\n  }\n})(typeof exports === 'undefined' ? this.dxf = {} : exports)\n\n},{}],83:[function(require,module,exports){\n/*\nAutoCAD Constants\n\n## License\n\nCopyright (c) 2017 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n*/\n\n//\n// translate group codes to names for use as object attributes\n//\nlet dxfTLA = [\n  [0  , 'etyp'], [1 , 'text'], [2 , 'name'], [3 , 'nam1'],\n  [5  , 'hdle'], [6 , 'ltyp'], [7 , 'lsty'], [8 , 'lnam'], [9 , 'vari'],\n  [10 , 'pptx'], [11, 'sptx'], [12, 'tptx'], [13, 'fptx'],\n  [20 , 'ppty'], [21, 'spty'], [22, 'tpty'], [23, 'fpty'],\n  [30 , 'pptz'], [31, 'sptz'], [32, 'tptz'], [33, 'fptz'],\n  [38 , 'elev'], [39, 'lthk'],\n  [40 , 'swid'], [41, 'ewid'], [42, 'bulg'], [43, 'cwid'],\n  [48 , 'lscl'],\n  [50 , 'ang0'], [51, 'ang1'],\n  [60 , 'visb'], [62, 'cnmb'],\n  [67 , 'spac'],\n  [70 , 'lflg'], [71, 'fvia'], [72, 'fvib'], [73, 'fvic'], [74, 'fvid'],\n  [75 , 'cflg'],\n  [90 , 'vlen'], [91, 'slen'], [92, 'plen'], [93, 'flen'], [94, 'elen'],\n  [95 , 'clen'],\n  [100, 'sbnm'],\n  [210, 'etrx'],\n  [220, 'etry'],\n  [230, 'etrz']\n]\n\nlet dxfMap = new Map(dxfTLA)\n\nconst getTLA = function (group) {\n  return dxfMap.get(group)\n}\n\n/*\n * AutoCAD Drawing Units\n */\nconst drawingUnits = [\n  [0, 'none'],\n  [1, 'inches'],\n  [2, 'feet'],\n  [3, 'miles'],\n  [4, 'millimeters'],\n  [5, 'centimeters'],\n  [6, 'meters'],\n  [7, 'kilometers'],\n  [8, 'microinches'],\n  [9, 'mils'],\n  [10, 'yards'],\n  [11, 'angstroms'],\n  [12, 'nanometers'],\n  [13, 'microns'],\n  [14, 'decimeters'],\n  [15, 'dekameters'],\n  [16, 'hectometers'],\n  [17, 'gigameters'],\n  [18, 'astrounits'],\n  [19, 'lightyears'],\n  [20, 'parsecs']\n]\n\n/*\n * AutoCAD Color Index (0-255) as RGB + ALPHA colors\n */\n\nconst colorIndex = [\n  [255, 0, 0, 255],\n  [255, 255, 0, 255],\n  [0, 255, 0, 255],\n  [0, 255, 255, 255],\n  [0, 0, 255, 255],\n  [255, 0, 255, 255],\n  [255, 255, 255, 255],\n  [128, 128, 128, 255],\n  [192, 192, 192, 255],\n  [255, 0, 0, 255],\n  // 10\n  [255, 127, 127, 255],\n  [165, 0, 0, 255],\n  [165, 82, 82, 255],\n  [127, 0, 0, 255],\n  [127, 63, 63, 255],\n  [76, 0, 0, 255],\n  [76, 38, 38, 255],\n  [38, 0, 0, 255],\n  [38, 19, 19, 255],\n  [255, 63, 0, 255],\n  // 20\n  [255, 159, 127, 255],\n  [165, 41, 0, 255],\n  [165, 103, 82, 255],\n  [127, 31, 0, 255],\n  [127, 79, 63, 255],\n  [76, 19, 0, 255],\n  [76, 47, 38, 255],\n  [38, 9, 0, 255],\n  [38, 23, 19, 255],\n  [255, 127, 0, 255],\n  // 30\n  [255, 191, 127, 255],\n  [165, 82, 0, 255],\n  [165, 124, 82, 255],\n  [127, 63, 0, 255],\n  [127, 95, 63, 255],\n  [76, 38, 0, 255],\n  [76, 57, 38, 255],\n  [38, 19, 0, 255],\n  [38, 28, 19, 255],\n  [255, 191, 0, 255],\n  // 40\n  [255, 223, 127, 255],\n  [165, 124, 0, 255],\n  [165, 145, 82, 255],\n  [127, 95, 0, 255],\n  [127, 111, 63, 255],\n  [76, 57, 0, 255],\n  [76, 66, 38, 255],\n  [38, 28, 0, 255],\n  [38, 33, 19, 255],\n  // 50\n  [255, 255, 0, 255],\n  [255, 255, 127, 255],\n  [165, 165, 0, 255],\n  [165, 165, 82, 255],\n  [127, 127, 0, 255],\n  [127, 127, 63, 255],\n  [76, 76, 0, 255],\n  [76, 76, 38, 255],\n  [38, 38, 0, 255],\n  [38, 38, 19, 255],\n  // 60\n  [191, 255, 0, 255],\n  [223, 255, 127, 255],\n  [124, 165, 0, 255],\n  [145, 165, 82, 255],\n  [95, 127, 0, 255],\n  [111, 127, 63, 255],\n  [57, 76, 0, 255],\n  [66, 76, 38, 255],\n  [28, 38, 0, 255],\n  [33, 38, 19, 255],\n  // 70\n  [127, 255, 0, 255],\n  [191, 255, 127, 255],\n  [82, 165, 0, 255],\n  [124, 165, 82, 255],\n  [63, 127, 0, 255],\n  [95, 127, 63, 255],\n  [38, 76, 0, 255],\n  [57, 76, 38, 255],\n  [19, 38, 0, 255],\n  [28, 38, 19, 255],\n  // 80\n  [63, 255, 0, 255],\n  [159, 255, 127, 255],\n  [41, 165, 0, 255],\n  [103, 165, 82, 255],\n  [31, 127, 0, 255],\n  [127, 63, 255],\n  [19, 76, 0, 255],\n  [47, 76, 38, 255],\n  [9, 38, 0, 255],\n  [23, 38, 19, 255],\n  // 90\n  [0, 255, 0, 255],\n  [127, 255, 127, 255],\n  [0, 165, 0, 255],\n  [82, 165, 82, 255],\n  [0, 127, 0, 255],\n  [63, 127, 63, 255],\n  [0, 76, 0, 255],\n  [38, 76, 38, 255],\n  [0, 38, 0, 255],\n  [19, 38, 19, 255],\n  // 100\n  [0, 255, 63, 255],\n  [127, 255, 159, 255],\n  [0, 165, 41, 255],\n  [82, 165, 103, 255],\n  [0, 127, 31, 255],\n  [63, 127, 79, 255],\n  [0, 76, 19, 255],\n  [38, 76, 47, 255],\n  [0, 38, 9, 255],\n  [19, 38, 23, 255],\n  // 110\n  [0, 255, 127, 255],\n  [127, 255, 191, 255],\n  [0, 165, 82, 255],\n  [82, 165, 124, 255],\n  [0, 127, 63, 255],\n  [63, 127, 95, 255],\n  [0, 76, 38, 255],\n  [38, 76, 57, 255],\n  [0, 38, 19, 255],\n  [19, 38, 28, 255],\n  // 120\n  [0, 255, 191, 255],\n  [127, 255, 223, 255],\n  [0, 165, 124, 255],\n  [82, 165, 145, 255],\n  [0, 127, 95, 255],\n  [63, 127, 111, 255],\n  [0, 76, 57, 255],\n  [38, 76, 66, 255],\n  [0, 38, 28, 255],\n  [19, 38, 33, 255],\n  // 130\n  [0, 255, 255, 255],\n  [127, 255, 255, 255],\n  [0, 165, 165, 255],\n  [82, 165, 165, 255],\n  [0, 127, 127, 255],\n  [63, 127, 127, 255],\n  [0, 76, 76, 255],\n  [38, 76, 76, 255],\n  [0, 38, 38, 255],\n  [19, 38, 38, 255],\n  // 140\n  [0, 191, 255, 255],\n  [127, 223, 255, 255],\n  [0, 124, 165, 255],\n  [82, 145, 165, 255],\n  [0, 95, 127, 255],\n  [63, 111, 127, 255],\n  [0, 57, 76, 255],\n  [38, 66, 76, 255],\n  [0, 28, 38, 255],\n  [19, 33, 38, 255],\n  // 150\n  [0, 127, 255, 255],\n  [127, 191, 255, 255],\n  [0, 82, 165, 255],\n  [82, 124, 165, 255],\n  [0, 63, 127, 255],\n  [63, 95, 127, 255],\n  [0, 38, 76, 255],\n  [38, 57, 76, 255],\n  [0, 19, 38, 255],\n  [19, 28, 38, 255],\n  // 160\n  [0, 63, 255, 255],\n  [127, 159, 255, 255],\n  [0, 41, 165, 255],\n  [82, 103, 165, 255],\n  [0, 31, 127, 255],\n  [63, 79, 127, 255],\n  [0, 19, 76, 255],\n  [38, 47, 76, 255],\n  [0, 9, 38, 255],\n  [19, 23, 38, 255],\n  // 170\n  [0, 0, 255, 255],\n  [127, 127, 255, 255],\n  [0, 0, 165, 255],\n  [82, 82, 165, 255],\n  [0, 0, 127, 255],\n  [63, 63, 127, 255],\n  [0, 0, 76, 255],\n  [38, 38, 76, 255],\n  [0, 0, 38, 255],\n  [19, 19, 38, 255],\n  // 180\n  [63, 0, 255, 255],\n  [159, 127, 255, 255],\n  [41, 0, 165, 255],\n  [103, 82, 165, 255],\n  [31, 0, 127, 255],\n  [79, 63, 127, 255],\n  [19, 0, 76, 255],\n  [47, 38, 76, 255],\n  [9, 0, 38, 255],\n  [23, 19, 38, 255],\n  // 190\n  [127, 0, 255, 255],\n  [191, 127, 255, 255],\n  [82, 0, 165, 255],\n  [124, 82, 165, 255],\n  [63, 0, 127, 255],\n  [95, 63, 127, 255],\n  [38, 0, 76, 255],\n  [57, 38, 76, 255],\n  [19, 0, 38, 255],\n  [28, 19, 38, 255],\n  // 200\n  [191, 0, 255, 255],\n  [223, 127, 255, 255],\n  [124, 0, 165, 255],\n  [145, 82, 165, 255],\n  [95, 0, 127, 255],\n  [111, 63, 127, 255],\n  [57, 0, 76, 255],\n  [66, 38, 76, 255],\n  [28, 0, 38, 255],\n  [33, 19, 38, 255],\n  // 210\n  [255, 0, 255, 255],\n  [255, 127, 255, 255],\n  [165, 0, 165, 255],\n  [165, 82, 165, 255],\n  [127, 0, 127, 255],\n  [127, 63, 127, 255],\n  [76, 0, 76, 255],\n  [76, 38, 76, 255],\n  [38, 0, 38, 255],\n  [38, 19, 38, 255],\n  // 220\n  [255, 0, 191, 255],\n  [255, 127, 223, 255],\n  [165, 0, 124, 255],\n  [165, 82, 145, 255],\n  [127, 0, 95, 255],\n  [127, 63, 111, 255],\n  [76, 0, 57, 255],\n  [76, 38, 66, 255],\n  [38, 0, 28, 255],\n  [38, 19, 33, 255],\n  // 230\n  [255, 0, 127, 255],\n  [255, 127, 191, 255],\n  [165, 0, 82, 255],\n  [165, 82, 124, 255],\n  [127, 0, 63, 255],\n  [127, 63, 95, 255],\n  [76, 0, 38, 255],\n  [76, 38, 57, 255],\n  [38, 0, 19, 255],\n  [38, 19, 28, 255],\n  // 240\n  [255, 0, 63, 255],\n  [255, 127, 159, 255],\n  [165, 0, 41, 255],\n  [165, 82, 103, 255],\n  [127, 0, 31, 255],\n  [127, 63, 79, 255],\n  [76, 0, 19, 255],\n  [76, 38, 47, 255],\n  [38, 0, 9, 255],\n  [38, 19, 23, 255],\n  // 250\n  [84, 84, 84, 255],\n  [118, 118, 118, 255],\n  [160, 160, 160, 255],\n  [192, 192, 192, 255],\n  [224, 224, 224, 255],\n  [0, 0, 0, 255]\n]\n\nconst BYBLOCK = 0\nconst BYLAYER = 256\n\nmodule.exports = {\n  colorIndex,\n  BYBLOCK,\n  BYLAYER,\n  getTLA\n}\n\n},{}],84:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2017 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n\n*/\n\nconst {colorIndex, BYLAYER, getTLA} = require('./autocad')\nconst dxf = require('./DxfReader')\nconst {instantiateAsciiDxf} = require('./instantiate')\nconst translateAsciiDxf = require('./translate')\n\n// //////////////////////////////////////////\n//\n// DXF (Drawing Exchange Format) is a CAD data file format developed by Autodesk\n//\n// //////////////////////////////////////////\n\nfunction handleError (reader, error) {\n  if (reader.options.strict === true) {\n    throw error\n  } else {\n    console.log(`error: line ${error.line}, column ${error.column}, bad character [${error.c}]`)\n  }\n}\nfunction handleStart (reader, data) {\n  //console.log('DXF reader started')\n}\nfunction handleEnd (reader, data) {\n  //console.log('DXF reader completed')\n}\n\n//\n// handle a entity as provided by the reader\n// groups: 0\n// special handling to set defaults as per DXF specifications\n//\nfunction handleEntity (reader, group, value) {\n  // console.log('entity: '+group+','+value)\n\n  let obj = null\n  switch (value) {\n    case 'LAYER':\n      obj = {type: 'layer'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      // obj[getTLA(62)] = 256\n      obj[getTLA(67)] = 0\n      // layer defaults\n      reader.objstack.push(obj)\n      break\n    case 'LINE':\n      obj = {type: 'line'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // line defaults\n      obj[getTLA(210)] = 0\n      obj[getTLA(220)] = 0\n      obj[getTLA(230)] = 0\n\n      reader.objstack.push(obj)\n      break\n    case 'LWPOLYLINE':\n      obj = {type: 'lwpolyline'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // lwpolyline defaults\n      obj[getTLA(38)] = 0\n      obj[getTLA(39)] = 0\n      obj[getTLA(43)] = 0\n      obj[getTLA(70)] = 0\n      obj[getTLA(90)] = 0\n      obj[getTLA(210)] = 0\n      obj[getTLA(220)] = 0\n      obj[getTLA(230)] = 1\n\n      reader.objstack.push(obj)\n      break\n    case 'MESH':\n      obj = {type: 'mesh'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // mesh defaults\n      obj[getTLA(91)] = 0 // initialize lengths\n      obj[getTLA(92)] = 0\n      obj[getTLA(93)] = 0\n      obj[getTLA(94)] = 0\n      obj[getTLA(95)] = 0\n      obj['state'] = 0 // keep a state\n      reader.objstack.push(obj)\n      break\n    case 'POLYLINE':\n      obj = {type: 'polyline'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // polyline defaults\n      obj[getTLA(10)] = 0\n      obj[getTLA(20)] = 0\n      obj[getTLA(30)] = 0\n      obj[getTLA(39)] = 0\n      obj[getTLA(40)] = 0\n      obj[getTLA(41)] = 0\n      obj[getTLA(70)] = 0\n      obj[getTLA(71)] = 0\n      obj[getTLA(72)] = 0\n      obj[getTLA(73)] = 0\n      obj[getTLA(74)] = 0\n      obj[getTLA(75)] = 0\n      obj[getTLA(210)] = 0\n      obj[getTLA(220)] = 0\n      obj[getTLA(230)] = 1\n\n      reader.objstack.push(obj)\n      break\n    case 'ARC':\n      obj = {type: 'arc'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // arc defaults\n      obj[getTLA(39)] = 0\n      obj[getTLA(210)] = 0\n      obj[getTLA(220)] = 0\n      obj[getTLA(230)] = 1\n\n      reader.objstack.push(obj)\n      break\n    case 'CIRCLE':\n      obj = {type: 'circle'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // circle defaults\n      obj[getTLA(39)] = 0\n      obj[getTLA(210)] = 0\n      obj[getTLA(220)] = 0\n      obj[getTLA(230)] = 1\n\n      reader.objstack.push(obj)\n      break\n    case 'ELLIPSE':\n      obj = {type: 'ellipse'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // ellipse defaults\n      obj[getTLA(210)] = 0\n      obj[getTLA(220)] = 0\n      obj[getTLA(230)] = 1\n\n      reader.objstack.push(obj)\n      break\n    case 'VERTEX':\n      obj = {type: 'vertex'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // vertex defaults\n      obj[getTLA(10)] = 0\n      obj[getTLA(20)] = 0\n      obj[getTLA(30)] = 0\n      obj[getTLA(40)] = 0\n      obj[getTLA(41)] = 0\n      obj[getTLA(42)] = 0\n      obj[getTLA(70)] = 0\n      // polyface defaults (optional)\n      obj[getTLA(71)] = 0\n      obj[getTLA(72)] = 0\n      obj[getTLA(73)] = 0\n      obj[getTLA(74)] = 0\n\n      reader.objstack.push(obj)\n      break\n    case '3DFACE':\n      obj = {type: '3dface'}\n      // entity defaults\n      obj[getTLA(48)] = 1.0\n      obj[getTLA(60)] = 0\n      obj[getTLA(62)] = BYLAYER\n      obj[getTLA(67)] = 0\n      // face defaults\n      obj[getTLA(70)] = 0\n\n      reader.objstack.push(obj)\n      break\n    case 'SEQEND':\n      obj = {type: 'seqend'}\n      reader.objstack.push(obj)\n      break\n    default:\n      // push on an anonymous object which does not have type / attributes / values\n      obj = {}\n      reader.objstack.push(obj)\n      break\n  }\n}\n\n//\n// handle a varible as provided by the reader\n// groups: 9\n//\nfunction handleVariable (reader, group, value) {\n  // console.log('variable: '+group+','+value)\n  let obj = {type: 'variable', name: value}\n  reader.objstack.push(obj)\n}\n\n//\n// handle a int as provided by the reader\n// groups: 62, 70, 71, 72, 73, 74, 75, 210, 220, 230\n//\nfunction handleInt (reader, group, value) {\n  // console.log('int: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    obj[getTLA(group)] = parseFloat(value)\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a double as provided by the reader\n// groups: 11, 12, 13, 21, 22, 23, 31, 32, 33, 39, 40, 41, 50, 51\n//\nfunction handleDouble (reader, group, value) {\n  // console.log('double: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    obj[getTLA(group)] = parseFloat(value)\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a X coordinate as provided by the reader\n// groups: 10\n// special handling of (lwpolyline and mesh) float values\n//\nfunction handleXcoord (reader, group, value) {\n  // console.log('xcoord: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    if (obj['type'] === 'lwpolyline') {\n    // special handling to build a list of vertices\n      if (obj['pptxs'] === undefined) {\n        obj['pptxs'] = []\n        obj['bulgs'] = []\n      }\n      obj['pptxs'].push(parseFloat(value))\n      obj['bulgs'].push(0)\n    } else {\n      if (obj['type'] === 'mesh') {\n      // special handling to build a list of vertices\n        if (obj['pptxs'] === undefined) {\n          obj['pptxs'] = []\n        }\n        obj['pptxs'].push(parseFloat(value))\n      } else {\n        obj[getTLA(group)] = parseFloat(value)\n      }\n    }\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a Y coordinate as provided by the reader\n// groups: 20\n// special handling of (lwpolyline and mesh) float values\n//\nfunction handleYcoord (reader, group, value) {\n  // console.log('ycoord: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    if (obj['type'] === 'lwpolyline' || obj['type'] === 'mesh') {\n    // special handling to build a list of vertices\n      if (obj['pptys'] === undefined) {\n        obj['pptys'] = []\n      }\n      obj['pptys'].push(parseFloat(value))\n    } else {\n      obj[getTLA(group)] = parseFloat(value)\n    }\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a Z coordinate as provided by the reader\n// groups: 30\n// special handling of (mesh) float values\n//\nfunction handleZcoord (reader, group, value) {\n  // console.log('ycoord: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    if (obj['type'] === 'mesh') {\n    // special handling to build a list of vertices\n      if (obj['pptzs'] === undefined) {\n        obj['pptzs'] = []\n      }\n      obj['pptzs'].push(parseFloat(value))\n    } else {\n      obj[getTLA(group)] = parseFloat(value)\n    }\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a bulge as provided by the reader\n// groups: 41\n// special handling of (lwpolyline) float values\n//\nfunction handleBulge (reader, group, value) {\n  // console.log('bulg: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    if (obj['type'] === 'lwpolyline') {\n    // special handling to build a list of vertices\n      let bulgs = obj['bulgs']\n      if (bulgs !== undefined) {\n        let pptxs = obj['pptxs']\n        if (pptxs.length === bulgs.length) {\n          bulgs[bulgs.length - 1] = parseFloat(value)\n        }\n      }\n    } else {\n      obj[getTLA(group)] = parseFloat(value)\n    }\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a len as provided by the reader\n// groups: 91, 92, 93, 94, 95\n// special handling of (mesh) float values based on group and state\n//\nfunction handleLen (reader, group, value) {\n  // console.log('len: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    if (obj['type'] === 'mesh') {\n    // mesh has an order of lengths\n      let state = obj['state']\n      // console.log('mesh len: '+group+','+value+','+state)\n      switch (group) {\n        case 91: // length of subdivisions\n          obj[getTLA(group)] = parseFloat(value)\n          obj['state'] = 1\n          break\n        case 92: // vertex count OR overriden property count\n          if (state === 1) {\n            obj['vlen'] = parseFloat(value) // override attribute\n            obj['state'] = 2\n          } else {\n            obj['plen'] = parseFloat(value) // override attribute\n            obj['state'] = 6\n          }\n          break\n        case 93: // face count\n          obj[getTLA(group)] = parseFloat(value)\n          obj['state'] = 3\n          break\n        case 94: // edge count\n          obj[getTLA(group)] = parseFloat(value)\n          obj['state'] = 4\n          break\n        case 95: // edge crease count\n          obj[getTLA(group)] = parseFloat(value)\n          obj['state'] = 5\n          break\n        default:\n          obj['state'] = 7\n          break\n      }\n    } else {\n      obj[getTLA(group)] = parseFloat(value)\n    }\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a value as provided by the reader\n// groups: 90\n// special handling of (mesh) float values based on state\n//\nfunction handleValue (reader, group, value) {\n  // console.log('int: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    if (obj['type'] === 'mesh') {\n      let state = obj['state']\n      // console.log('mesh value: '+group+','+value+','+state)\n      // mesh has an order of values based on state\n      switch (state) {\n        case 3: // accumulate face values\n          if (obj['fvals'] === undefined) {\n            obj['fvals'] = []\n          }\n          obj['fvals'].push(parseFloat(value))\n          break\n        case 4: // accumulate edge values\n          if (obj['evals'] === undefined) {\n            obj['evals'] = []\n          }\n          obj['evals'].push(parseFloat(value))\n          break\n        default:\n          break\n      }\n    } else {\n      obj[getTLA(group)] = parseFloat(value)\n    }\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a string as provided by the reader\n// groups: 1,6,7,8,\n//\nfunction handleString (reader, group, value) {\n  // console.log('string: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    obj[getTLA(group)] = value\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// handle a name as provided by the reader\n// groups: 2,3\n//\nfunction handleName (reader, group, value) {\n  // console.log('name: '+group+','+value)\n  let obj = reader.objstack.pop()\n  if ('type' in obj) {\n    if (obj[getTLA(group)] === undefined) {\n      obj[getTLA(group)] = value\n    }\n  }\n  reader.objstack.push(obj)\n}\n\n//\n// Create a DXF reader using the given source and options.\n// This routine sets up a series of callbacks (absorb calls) to handle the various DXF groups, then starts the reader.\n// While reading, the callback routine (handle*) converts the value and then:\n// - pushes a new group onto the objstack\n// OR\n// - adds a new attribute to the current object\n//\nfunction createReader (src, options) {\n  // create a reader for the DXF\n  let reader = dxf.reader(options)\n\n  // setup event handling from the reader\n  reader.on('error', handleError)\n  reader.on('start', handleStart)\n  reader.on('end', handleEnd)\n\n  // setup group handling\n  reader.absorb(0, handleEntity)\n  reader.absorb(1, handleString)\n  reader.absorb(2, handleName)\n  reader.absorb(3, handleName)\n  reader.absorb(6, handleString)\n  reader.absorb(7, handleString)\n  reader.absorb(8, handleString)\n  reader.absorb(9, handleVariable)\n  reader.absorb(10, handleXcoord)\n  reader.absorb(11, handleDouble)\n  reader.absorb(12, handleDouble)\n  reader.absorb(13, handleDouble)\n  reader.absorb(20, handleYcoord)\n  reader.absorb(21, handleDouble)\n  reader.absorb(22, handleDouble)\n  reader.absorb(23, handleDouble)\n  reader.absorb(30, handleZcoord)\n  reader.absorb(31, handleDouble)\n  reader.absorb(32, handleDouble)\n  reader.absorb(33, handleDouble)\n  reader.absorb(39, handleDouble)\n  reader.absorb(40, handleDouble)\n  reader.absorb(41, handleDouble)\n  reader.absorb(42, handleBulge)\n  reader.absorb(50, handleDouble)\n  reader.absorb(51, handleDouble)\n  reader.absorb(62, handleInt)\n  reader.absorb(70, handleInt)\n  reader.absorb(71, handleInt)\n  reader.absorb(72, handleInt)\n  reader.absorb(73, handleInt)\n  reader.absorb(74, handleInt)\n  reader.absorb(75, handleInt)\n  reader.absorb(90, handleValue)\n  reader.absorb(91, handleLen) // MESH\n  reader.absorb(92, handleLen) // MESH\n  reader.absorb(93, handleLen) // MESH\n  reader.absorb(94, handleLen) // MESH\n  reader.absorb(95, handleLen) // MESH\n  reader.absorb(210, handleInt)\n  reader.absorb(220, handleInt)\n  reader.absorb(230, handleInt)\n\n  // initial state\n  reader.objstack = []\n  reader.objstack.push({type: 'dxf'})\n\n  // start the reader\n  reader.write(src).close()\n  return reader\n}\n\n//\n// instantiate the give DXF definition (src) into a set of CSG library objects\n//\nfunction instantiate (src, filename, options) {\n  let reader = createReader(src, options)\n  let objs = instantiateAsciiDxf(reader, options)\n  return objs\n}\n\n//\n// translate the give DXF definition (src) into a  JSCAD script\n//\nfunction translate (src, filename, options) {\n  let reader = createReader(src, options)\n\n  let code = `// Produced by JSCAD IO Library : DXF Deserialization (${options.version})\n\n`\n  // code += '// date: ' + (new Date()) + '\\n'\n  // code += '// source: ' + filename + '\\n'\n  code += translateAsciiDxf(reader, options)\n  return code\n}\n\n/**\n * Deserialize the given source and return the requested 'output'\n * @param {string} src DXF data stream\n * @param {string} filename (optional) original filename of DXF data stream if any\n * @param {object} options (optional) anonymous object with:\n * @param {string} [options.version='0.0.1'] version number to add to the metadata\n * @param {string} [options.output='jscad'] either jscad or csg to set desired output\n * @param {boolean} [options.strict=true] obey strict DXF specifications\n * @param {array} [options.colorindex=[]] list of colors (256) for use during rendering\n * @return {string|[objects]} a string (jscad script) or array of objects\n */\nconst deserialize = function (src, filename, options) {\n  const defaults = {\n    version: '0.0.1',\n    output: 'jscad',\n    strict: true,\n    colorindex: colorIndex,\n    dxf: {\n      angdir: 0, // counter clockwise\n      insunits: 4, // millimeters\n      pfacevmax: 4, // number of vertices per face\n    }\n  }\n  options = Object.assign({}, defaults, options)\n  return options.output === 'jscad' ? translate(src, filename, options) : instantiate(src, filename, options)\n}\n\nmodule.exports = {\n  deserialize\n}\n\n},{\"./DxfReader\":82,\"./autocad\":83,\"./instantiate\":85,\"./translate\":86}],85:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2017 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n\n*/\nconst { CSG, CAG } = require('@jscad/csg')\n\nconst {BYBLOCK, BYLAYER} = require('./autocad')\n\n//\n// instantiate the given object (3dface) as a polygon\n//\nfunction instantiatePolygon (obj, layers, options) {\n  let vertices = []\n  // FIXME: should check global variable to instantiate in the proper orientation\n  vertices.push(new CSG.Vertex(new CSG.Vector3D([obj['pptx'], obj['ppty'], obj['pptz']])))\n  vertices.push(new CSG.Vertex(new CSG.Vector3D([obj['sptx'], obj['spty'], obj['sptz']])))\n  vertices.push(new CSG.Vertex(new CSG.Vector3D([obj['tptx'], obj['tpty'], obj['tptz']])))\n  if (obj['fptx']) {\n    let pushit = false\n    if (obj['tptx'] !== obj['fptx']) { pushit = true }\n    if (obj['tpty'] !== obj['fpty']) { pushit = true }\n    if (obj['tptz'] !== obj['fptz']) { pushit = true }\n    if (pushit) {\n      vertices.push(new CSG.Vertex(new CSG.Vector3D([obj['fptx'], obj['fpty'], obj['fptz']])))\n    }\n  }\n  let cn = getColorNumber(obj, layers)\n  let shared = getColor(cn, options.colorindex)\n  return new CSG.Polygon(vertices, shared)\n}\n\n//\n// instantiate the given object (line) as CSG.Line2D or CSG.Line3D\n//\nfunction instantiateLine (obj, layers, options) {\n  let csg = null\n  if (obj['pptz'] === obj['sptz'] & obj['pptz'] === 0) {\n    let p1 = new CSG.Vector2D([obj['pptx'], obj['ppty']])\n    let p2 = new CSG.Vector2D([obj['sptx'], obj['spty']])\n    csg = CSG.Line2D.fromPoints(p1, p2)\n  } else {\n    let p1 = new CSG.Vector3D([obj['pptx'], obj['ppty'], obj['pptz']])\n    let p2 = new CSG.Vector3D([obj['sptx'], obj['spty'], obj['sptz']])\n    csg = CSG.Line3D.fromPoints(p1, p2)\n  }\n  return csg\n}\n\n//\n// instantiate the give object as CSG.Vector2D or CSG.Vector3D\n//\nfunction instantiateVector (obj) {\n  const d3line = parseInt('00000000000100000', 2)\n  const d3mesh = parseInt('00000000001000000', 2)\n  const d3face = parseInt('00000000010000000', 2)\n\n  let flags = obj['lflg']\n  let vtype = null\n  if ((flags & d3line) === d3line) {\n    vtype = new CSG.Vector3D([obj['pptx'], obj['ppty'], obj['pptz']])\n  } else\n  if ((flags & d3mesh) === d3mesh) {\n    vtype = new CSG.Vector3D([obj['pptx'], obj['ppty'], obj['pptz']])\n  } else\n  if ((flags & d3face) === d3face) {\n    vtype = new CSG.Vector3D([obj['pptx'], obj['ppty'], obj['pptz']])\n    // pass on face indexes\n    vtype['fvia'] = obj['fvia']\n    vtype['fvib'] = obj['fvib']\n    vtype['fvic'] = obj['fvic']\n    vtype['fvid'] = obj['fvid']\n  } else {\n    vtype = new CSG.Vector2D(obj['pptx'], obj['ppty'])\n    vtype['bulg'] = obj['bulg'] // for rendering curved sections\n  }\n  return vtype\n}\n\n//\n// append a section to the given path\n//\nfunction addSection (path, x1, y1, bulg) {\n  if (bulg === 0) {\n  // add straight line to the end of the path\n    path = path.appendPoint([x1, y1])\n  } else {\n  // add arc to the end of the path\n    let prev = path.points[path.points.length - 1]\n    let curr = new CSG.Vector2D(x1, y1)\n    let u = prev.distanceTo(curr)\n    let r = u * ((1 + Math.pow(bulg, 2)) / (4 * bulg))\n    let clockwise = (bulg < 0)\n    let large = false // FIXME how to determine?\n    let d = Math.atan(bulg) / (Math.PI / 180) * 4\n    // FIXME; add resolution\n    path = path.appendArc([x1, y1], {radius: r, xaxisrotation: d, clockwise: clockwise, large: large})\n  }\n  return path\n}\n\n//\n// instantiate the given object (lwpolyline) into a CSG.Path2D\n//\nfunction instantiatePath2D (obj, layers, options) {\n  const closed = parseInt('00000000000000001', 2)\n\n  // expected values\n  let  vlen = obj['vlen']\n  let pptxs = obj['pptxs']\n  let pptys = obj['pptys']\n  let bulgs = obj['bulgs']\n  let flags = obj['lflg']\n\n  // conversion\n  let path = new CSG.Path2D()\n  let isclosed = ((flags & closed) === closed)\n  if (vlen === pptxs.length && vlen === pptys.length && vlen === bulgs.length) {\n    pptxs.forEach(function (item, index, array) {\n      let bulg = 0\n      if (index > 0) {\n        bulg = bulgs[index - 1] // apply the previous bulg\n      }\n      path = addSection(path, pptxs[index], pptys[index], bulg)\n    })\n  } else {\n  // FIXME flag this DXF error\n    return path\n  }\n  // FIXME add optional to create CAG from the path\n  if (isclosed) {\n  // apply the last section between last and first points\n    path = addSection(path, pptxs[0], pptys[0], bulgs[vlen - 1])\n    path = path.close()\n    return CAG.fromPoints(path.points)\n  }\n  return path\n}\n\n//\n// instantiate the given object (arc) into CSG.Path2D or CSG??\n//\nfunction instantiateArc (obj, layers, options) {\n  // expected values\n  let lthk = obj['lthk']\n  let pptx = obj['pptx']\n  let ppty = obj['ppty']\n  // let pptz = obj['pptz']\n  let swid = obj['swid']\n  let ang0 = obj['ang0'] // start angle\n  let ang1 = obj['ang1'] // end angle\n  // FIXME need to determine resolution from object/layer/variables\n  let res = CSG.defaultResolution2D\n\n  // conversion\n  if (lthk === 0.0) {\n    // convert to 2D object\n    return CSG.Path2D.arc({center: [pptx, ppty], radius: swid, startangle: ang0, endangle: ang1, resolution: res})\n  }\n  // FIXME how to represent 3D arc?\n  return CSG.Path2D.arc({center: [pptx, ppty], radius: swid, startangle: ang0, endangle: ang1, resolution: res})\n}\n\n//\n// instantiate the given object (circle) into CAG.circle (or extrude to CSG)\n//\nfunction instantiateCircle (obj, layers, options) {\n  // expected values\n  let lthk = obj['lthk']\n  let pptx = obj['pptx']\n  let ppty = obj['ppty']\n  // let pptz = obj['pptz']\n  let swid = obj['swid']\n\n  // conversion\n  // FIXME add color when supported\n  // let cn = getColorNumber(obj,layers)\n  // let shared = getColor(cn,options.colorindex)\n  // FIXME need to determine resolution from object/layer/variables\n  let res = CSG.defaultResolution2D\n\n  // convert to 2D object\n  if (lthk === 0.0) {\n    let cag = CAG.circle({center: [pptx, ppty], radius: swid, resolution: res})\n    return cag\n  }\n  // convert to 3D object\n  let cag = CAG.circle({center: [pptx, ppty], radius: swid, resolution: res})\n  let csg = cag.extrude({offset: [0, 0, lthk]})\n  // FIXME need to use 210/220/230 for direction of extrusion\n  return csg\n}\n\n//\n// instantiate the give object (ellipse) into CAG.ellipse (or extrude to CSG)\n//\nfunction instantiateEllipse (obj, layers, options) {\n  // expected values\n  let pptx = obj['pptx'] // center point\n  let ppty = obj['ppty']\n  let pptz = obj['pptz']\n  let sptx = obj['sptx'] // MAJOR axis point (about center point)\n  let spty = obj['spty']\n  let sptz = obj['sptz']\n  let swid = obj['swid'] // Ratio of minor axis to major axis\n  // FIXME need to determine resolution from object/layer/variables\n  let res = CSG.defaultResolution2D\n\n  // convert to 2D object\n  if (pptz === 0.0 && sptz === 0.0) {\n    let center = new CSG.Vector2D(0, 0)\n    let mjaxis = new CSG.Vector2D(sptx, spty)\n    let rx = center.distanceTo(mjaxis)\n    let ry = rx * swid\n    let angle = Math.atan2(spty, sptx) * 180 / Math.PI\n    if (angle < CSG.EPS) angle = 0\n    // FIXME add start and end angle when supported\n    let cag = CAG.ellipse({center: [0,0], radius: [rx, ry], resolution: res}).rotateZ(angle).translate([pptx,ppty])\n    return cag\n  }\n  // convert to 3D object\n}\n\nfunction createEdges (vlen, faces) {\n  let edges = []\n  while (vlen > 0) {\n    edges.push([])\n    vlen--\n  }\n  let mod3 = Math.floor(faces.length / 3) * 3\n  if (mod3 === faces.length) {\n    let fi = 0\n    while (fi < faces.length) {\n      let v1 = faces[fi++]\n      let v2 = faces[fi++]\n      let v3 = faces[fi++]\n      if (v1 === v2 || v1 === v3 || v2 === v3) continue\n\n      let edge = edges[v1]\n      if (edge.indexOf(v2) < 0) { edge.push(v2) }\n      if (edge.indexOf(v3) < 0) { edge.push(v3) }\n\n      edge = edges[v2]\n      if (edge.indexOf(v3) < 0) { edge.push(v3) }\n      if (edge.indexOf(v1) < 0) { edge.push(v1) }\n\n      edge = edges[v3]\n      if (edge.indexOf(v1) < 0) { edge.push(v1) }\n      if (edge.indexOf(v2) < 0) { edge.push(v2) }\n    }\n  }\n  return edges\n}\n\nfunction createFaces (edgesByVertex) {\n  let v1 = edgesByVertex.length\n  let faces = []\n  while (v1 > 0) {\n    v1--\n    let v1edges = edgesByVertex[v1]\n    let e1i = v1edges.length\n    while (e1i > 0) {\n      e1i--\n      let v2 = v1edges[e1i]\n      let v2edges = edgesByVertex[v2]\n      // search for common vertexes\n      let e2i = v2edges.length\n      while (e2i > 0) {\n        e2i--\n        let v3 = v2edges[e2i]\n        if (v1edges.indexOf(v3) < 0) continue\n        faces.push([v1, v2, v3])\n      }\n    }\n  }\n  return faces\n}\n\nfunction instantiateFaces (fvals) {\n  let faces = []\n  let vi = 0\n  while (vi < fvals.length) {\n    let fi = fvals[vi++]\n    let face = []\n    while (fi > 0) {\n      face.push(fvals[vi++])\n      fi--\n    }\n    faces.push(face)\n  }\n  return faces\n}\n\nfunction instantiatePoints (pptxs, pptys, pptzs) {\n  let points = []\n  let vi = 0\n  while (vi < pptxs.length) {\n    let x = pptxs[vi]\n    let y = pptys[vi]\n    let z = pptzs[vi]\n    points.push([x, y, z])\n    vi++\n  }\n  return points\n}\n\n//\n// instantiate the given object (mesh) into a CSG\n//\n// Note: See Face-Vertex meshes on Wikipedia\n//\nfunction instantiateMesh (obj, layers, options) {\n  // expected values\n  let  vlen = obj['vlen']\n  let pptxs = obj['pptxs'] // vertices\n  let pptys = obj['pptys']\n  let pptzs = obj['pptzs']\n\n  let flen = obj['flen']\n  let fvals = obj['fvals'] // faces\n\n  // conversion\n  let cn = getColorNumber(obj, layers)\n  let shared = getColor(cn, options.colorindex)\n\n  CSG._CSGDEBUG = false\n\n  let polygons = []\n  if (vlen === pptxs.length && vlen === pptys.length && vlen === pptzs.length) {\n    if (flen === fvals.length) {\n      let faces = instantiateFaces(fvals)\n      let points = instantiatePoints(pptxs, pptys, pptzs)\n\n      let fi = 0\n      while (fi < faces.length) {\n        let face = faces[fi]\n        let vectors = []\n        let vertices = [] // did i hear someone say REDUNDANCY\n        let vi = 0\n        while (vi < face.length) {\n          let pi = face[vi]\n          let vector = new CSG.Vector3D(points[pi])\n          vectors.push(vector)\n          let vertex = new CSG.Vertex(vector)\n          vertices.push(vertex)\n          vi++\n        }\n        if (options.dxf.angdir === 1) {\n          vertices = vertices.reverse()\n        }\n        // FIXME how to correct bad normals?\n\n        let poly = new CSG.Polygon(vertices, shared)\n        polygons.push(poly)\n\n        fi++\n      }\n    } else {\n      // invalid flen\n    }\n  } else {\n    // invalid vlen\n  }\n  return CSG.fromPolygons(polygons)\n}\n\n//\n// find the layer referenced by the given object\n//\nfunction findLayer (obj, layers) {\n  let lname = obj['lnam'] || '0'\n  for (let layer of layers) {\n    if (layer['name'] === lname) {\n      return layer\n    }\n  }\n  return null\n}\n\n//\n// get the color number of the object, possibly looking at layer\n// returns -1 if a color number was not found\n//\nfunction getColorNumber (obj, layers) {\n  let cn = obj['cnmb'] || -1\n  if (cn === BYLAYER) {\n  // use the color number from the layer\n    cn = -1\n    let layer = findLayer(obj, layers)\n    if (layer !== null) {\n      cn = layer['cnmb'] || -1\n    }\n  } else\n  if (cn === BYBLOCK) {\n  // use the color number from the block\n    cn = -1\n  }\n  return cn\n}\n\nfunction mod (num, mod) {\n  let remain = num % mod\n  return Math.floor(remain >= 0 ? remain : remain + mod)\n}\n\n//\n// instantiate Polygon.Shared(color) using the given index into the given color index\n//\nfunction getColor (index, colorindex) {\n  if (index < 0) { return null }\n\n  index = mod(index, colorindex.length)\n  let rgba = colorindex[index]\n  // FIXME : colors should be cached and shared\n  return new CSG.Polygon.Shared(rgba)\n}\n\n// works for both POLYLINE\nfunction getPolyType (obj) {\n  const closed = parseInt('00000000000000001', 2)\n  const d3line = parseInt('00000000000001000', 2)\n  const d3mesh = parseInt('00000000000010000', 2)\n\n  let flags = obj['lflg']\n  let ptype = null\n  if ((flags & d3line) === d3line) {\n    ptype = null // FIXME what to do?\n  } else\n  if ((flags & d3mesh) === d3mesh) {\n    ptype = new CSG()\n  } else {\n    let isclosed = ((flags & closed) === closed)\n    ptype = new CSG.Path2D([], isclosed)\n  }\n  return ptype\n}\n\n//\n// complete a complex object from the given base object and parts\n// - a series of 3dfaces => polygons => CSG\n// - a series of vertex => vectors => Path2D\n//\nfunction completeCurrent (objects, baseobj, polygons, vectors, options) {\n  if (baseobj instanceof CSG.Path2D) {\n    // console.log('##### completing Path2D')\n    objects.push(new CSG.Path2D(vectors, baseobj.closed))\n  }\n  if (baseobj instanceof CSG) {\n    // console.log('##### completing CSG')\n    objects.push(CSG.fromPolygons(polygons))\n  }\n  return null\n}\n\nconst instantiateAsciiDxf = function (reader, options) {\n  // console.log('**************************************************')\n  // console.log(JSON.stringify(reader.objstack));\n  // console.log('**************************************************')\n\n  let   layers = [] // list of layers with various information like color\n  let  current = null // the object being created\n  let polygons = [] // the list of 3D polygons\n  let  objects = [] // the list of objects instantiated\n  let  vectors = [] // the list of vectors for paths or meshes\n\n  let p = null\n  for (let obj of reader.objstack) {\n    p = null\n\n    if (!('type' in obj)) {\n      // console.log('##### skip')\n      continue\n    }\n    // console.log(JSON.stringify(obj));\n\n    switch (obj.type) {\n    // control objects\n      case 'dxf':\n        break\n      case 'layer':\n        // console.log('##### layer')\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        layers.push(obj)\n        break\n      case 'variable':\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        break\n\n      // 3D entities\n      case '3dface':\n        // console.log('##### 3dface')\n        p = instantiatePolygon(obj, layers, options)\n        if (current === null) {\n          // console.log('##### start of 3dfaces CSG')\n          current = new CSG()\n        }\n        break\n      case 'mesh':\n        // console.log('##### mesh')\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        objects.push(instantiateMesh(obj, layers, options))\n        break\n\n      // 2D or 3D entities\n      case 'arc':\n        // console.log('##### arc')\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        objects.push(instantiateArc(obj, layers, options))\n        break\n      case 'circle':\n        // console.log('##### circle')\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        objects.push(instantiateCircle(obj, layers, options))\n        break\n      case 'ellipse':\n        // console.log('##### ellipse')\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        objects.push(instantiateEllipse(obj, layers, options))\n        break\n      case 'line':\n        // console.log('##### line')\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        objects.push(instantiateLine(obj, layers, options))\n        break\n      case 'polyline':\n        if (current === null) {\n          // console.log('##### start of polyline')\n          current = getPolyType(obj)\n        }\n        break\n      case 'vertex':\n        // console.log('##### vertex')\n        p = instantiateVector(obj)\n        break\n      case 'seqend':\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        break\n\n      // 2D entities\n      case 'lwpolyline':\n        // console.log('##### lwpolyline')\n        current = completeCurrent(objects, current, polygons, vectors, options)\n        objects.push(instantiatePath2D(obj, layers, options))\n        break\n\n      default:\n        // console.log('##### ERROR')\n        // console.log(obj.type)\n        break\n    }\n    // accumlate polygons if necessary\n    if (p instanceof CSG.Polygon) {\n      polygons.push(p)\n    }\n    // accumlate vectors if necessary\n    if (p instanceof CSG.Vector3D) {\n      vectors.push(p)\n    }\n    if (p instanceof CSG.Vector2D) {\n      vectors.push(p)\n    }\n  }\n  // instantiate the last object if necessary\n  current = completeCurrent(objects, current, polygons, vectors, options)\n\n  // debug output\n  // console.log('**************************************************')\n  // objects.forEach(\n  //   function(e) {\n  //     console.log(JSON.stringify(e));\n  //   }\n  // );\n  // console.log('**************************************************')\n  return objects\n}\n\nmodule.exports = {\n  instantiatePolygon,\n  instantiateVector,\n  instantiateAsciiDxf\n}\n\n},{\"./autocad\":83,\"@jscad/csg\":22}],86:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2017 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n\n*/\nconst { CSG } = require('@jscad/csg')\n\nconst {BYBLOCK, BYLAYER} = require('./autocad')\nconst {instantiatePolygon, instantiateVector} = require('./instantiate')\n\n//\n// helper function to simplify code\n//\nfunction createVertex(vector) {\n  return new CSG.Vertex(vector)\n}\n\n//\n// translate the give 2D vector to JSCAD script\n//\nfunction translateVector2D (vector) {\n  let script = `new CSG.Vector2D(${vector.x},${vector.y})`\n  return script\n}\n\n//\n// translate the give 3D vector to JSCAD script\n//\nfunction translateVector3D (vector) {\n  let script = `${vector.x},${vector.y},${vector.z}`\n  return script\n}\n\n//\n// translate the given CSG.Polygon into JSCAD script\n//\nfunction translatePolygon (polygon) {\n  let script = 'createPolygon(['\n  for (let vertex of polygon.vertices) {\n    script += `${translateVertex(vertex)},`\n  }\n  script += `],${translateShared(polygon.shared)},${translatePlane(polygon.plane)})`\n  return script\n}\n\n//\n// translate the given CSG.Plane to JSCAD script\n//\nfunction translatePlane (plane) {\n  let script = `[${translateVector3D(plane.normal)},${plane.w}]`\n  return script\n}\n\n//\n// translate the given CSG.Polygon.Shared to JSCAD script\n//\nfunction translateShared (shared) {\n  let script = 'null'\n  if (shared !== null && shared.color !== null) {\n    let rgb = shared.color\n    script = `[${rgb[0]},${rgb[1]},${rgb[2]},${rgb[3]}]`\n  }\n  return script\n}\n\n//\n// translate the given CSG.Vertex to JSCAD script\n//\nfunction translateVertex (vertex) {\n  let script = `[${translateVector3D(vertex.pos)}]`\n  return script\n}\n\n//\n// translate the given DXF object (line) into 2D or 3D line\n//\nfunction translateLine (obj, layers, options) {\n  let name = obj['name']\n  let script = ''\n  if (obj['pptz'] === obj['sptz'] & obj['pptz'] === 0) {\n    let p1 = new CSG.Vector2D([obj['pptx'], obj['ppty']])\n    let p2 = new CSG.Vector2D([obj['sptx'], obj['spty']])\n    script = `  let ${name} = CSG.Line2D.fromPoints(${translateVector2D(p1)},${translateVector2D(p2)})\n`\n  } else {\n    let p1 = new CSG.Vector3D([obj['pptx'], obj['ppty'], obj['pptz']])\n    let p2 = new CSG.Vector3D([obj['sptx'], obj['spty'], obj['sptz']])\n    script = `  let ${name} = CSG.Line3D.fromPoints(${translateVector3D(p1)},${translateVector3D(p2)})\n`\n  }\n  obj['script'] = script\n  addToLayer(obj, layers)\n}\n\n//\n// append a Path section to the given script\n//\nfunction translateSection (script, x1, y1, bulg, px, py) {\n  if (bulg === 0) {\n  // add straight line to the end of the path\n    script += `.appendPoint( [${x1},${y1}] )`\n  } else {\n  // add arc to the end of the path\n    let prev = new CSG.Vector2D(px, py)\n    let curr = new CSG.Vector2D(x1, y1)\n    let u = prev.distanceTo(curr)\n    let r = u * ((1 + Math.pow(bulg, 2)) / (4 * bulg))\n    let clockwise = (bulg < 0)\n    let large = false // FIXME how to determine?\n    let d = Math.atan(bulg) / (Math.PI / 180) * 4\n    // FIXME need to determine resolution from object/layer/variables\n    let res = CSG.defaultResolution2D\n    script += `.appendArc([${x1},${y1}],{radius: ${r},xaxisrotation: ${d},clockwise: ${clockwise},large: ${large},resolution: ${res}})`\n  }\n  return script\n}\n\n//\n// translate the given obj (lwpolyline) into a CSG.Path2D\n//\nfunction translatePath2D (obj, layers, options) {\n  const closed = parseInt('00000000000000001', 2)\n\n  // expected values\n  let  vlen = obj['vlen']\n  let pptxs = obj['pptxs']\n  let pptys = obj['pptys']\n  let bulgs = obj['bulgs']\n  let flags = obj['lflg']\n  let  name = obj['name']\n\n  // translation\n  let script = `  let ${name} = new CSG.Path2D()\n`\n  let isclosed = ((flags & closed) === closed)\n  if (vlen === pptxs.length && vlen === pptys.length && vlen === bulgs.length) {\n    script += `  ${name} = ${name}` // sections appended below\n    pptxs.forEach(function (item, index, array) {\n      let bulg = 0\n      let px = 0\n      let py = 0\n      if (index > 0) {\n        bulg = bulgs[index - 1] // apply the previous bulg\n        px = pptxs[index - 1]\n        py = pptys[index - 1]\n      }\n      script = translateSection(script, pptxs[index], pptys[index], bulg, px, py)\n    })\n  } else {\n  // FIXME flag this DXF error\n    return\n  }\n  // FIXME add optional to create CAG from the path\n  if (isclosed) {\n  // apply the last section between last and first points\n    let bulg = bulgs[vlen - 1] // apply the previous bulg\n    let px = pptxs[vlen - 1]\n    let py = pptys[vlen - 1]\n    script = translateSection(script, pptxs[0], pptys[0], bulg, px, py)\n    script += `\n  ${name} = ${name}.close()\n  ${name} = CAG.fromPoints(${name}.points)\n`\n  } else {\n    script += '\\n'\n  }\n  obj['script'] = script\n  addToLayer(obj, layers)\n}\n\n//\n// translate the given object (arc) into CAG.Path2D or CSG??\n//\nfunction translateArc (obj, layers, options) {\n// expected values\n  let lthk = obj['lthk']\n  let pptx = obj['pptx']\n  let ppty = obj['ppty']\n  let pptz = obj['pptz']\n  let swid = obj['swid']\n  let ang0 = obj['ang0'] // start angle\n  let ang1 = obj['ang1'] // end angle\n  let name = obj['name']\n\n  // convert to 2D object\n  if (lthk === 0.0) {\n  // FIXME need to determine resolution from object/layer/variables\n    let res = CSG.defaultResolution2D\n    let script = `  let ${name} = CSG.Path2D.arc({center: [${pptx},${ppty}],radius: ${swid},startangle: ${ang0},endangle: ${ang1}, resolution: ${res}})\n`\n    obj['script'] = script\n    addToLayer(obj, layers)\n    return\n  }\n  // FIXME how to represent 3D arc?\n}\n\n//\n// translate the given obj (circle) into CAG.circle (or extrude to CSG)\n//\nfunction translateCircle (obj, layers, options) {\n// expected values\n  let lthk = obj['lthk']\n  let pptx = obj['pptx']\n  let ppty = obj['ppty']\n  let pptz = obj['pptz']\n  let swid = obj['swid']\n  let name = obj['name']\n\n  // FIXME add color when supported\n  // let cn = getColorNumber(obj,layers)\n  // let shared = getColor(cn,options.colorindex)\n  // FIXME need to determine resolution from object/layer/variables\n  let res = CSG.defaultResolution2D\n\n  // convert to 2D object\n  if (lthk === 0.0) {\n    let script = `  let ${name} = CAG.circle({center: [${pptx},${ppty}],radius: ${swid},resolution: ${res}})\n`\n    obj['script'] = script\n    addToLayer(obj, layers)\n    return\n  }\n\n  // convert to 3D object\n  let script = `  let ${name} = CAG.circle({center: [${pptx},${ppty}],radius: ${swid},resolution: ${res}).extrude({offset: [0,0,${lthk}]})\n`\n  // FIXME need to use 210/220/230 for direction of rotation\n  obj['script'] = script\n  addToLayer(obj, layers)\n}\n\n//\n// translate the given object (ellipse) into CAG.ellipse or CSG??\n//\nfunction translateEllipse (obj, layers, options) {\n// expected values\n  let pptx = obj['pptx'] // center point\n  let ppty = obj['ppty']\n  let pptz = obj['pptz']\n  let sptx = obj['sptx'] // MAJOR axis point (about center point)\n  let spty = obj['spty']\n  let sptz = obj['sptz']\n  let swid = obj['swid'] // Ratio of minor axis to major axis\n  let name = obj['name']\n  // FIXME need to determine resolution from object/layer/variables\n  let res = CSG.defaultResolution2D\n\n  // convert to 2D object\n  if (pptz === 0.0 && sptz === 0.0) {\n    let center = new CSG.Vector2D(0, 0)\n    let mjaxis = new CSG.Vector2D(sptx, spty)\n    let rx = center.distanceTo(mjaxis)\n    let ry = rx * swid\n    let angle = Math.atan2(spty, sptx) * 180 / Math.PI\n    if (angle < CSG.EPS) angle = 0\n    // FIXME add start and end angle when supported\n    let script = `  let ${name} = CAG.ellipse({center: [0,0],radius: [${rx},${ry}],resolution: ${res}}).rotateZ(${angle}).translate([${pptx},${ppty}])\n`\n    obj['script'] = script\n    addToLayer(obj, layers)\n    return\n  }\n  // convert to 3D object\n}\n\nfunction instantiateFaces (fvals) {\n  let faces = []\n  let vi = 0\n  while (vi < fvals.length) {\n    let fi = fvals[vi++]\n    let face = []\n    while (fi > 0) {\n      face.push(fvals[vi++])\n      fi--\n    }\n    faces.push(face)\n  }\n  return faces\n}\n\nfunction instantiatePoints (pptxs, pptys, pptzs) {\n  let points = []\n  let vi = 0\n  while (vi < pptxs.length) {\n    let x = pptxs[vi]\n    let y = pptys[vi]\n    let z = pptzs[vi]\n    points.push([x, y, z])\n    vi++\n  }\n  return points\n}\n\n//\n// instantiate the MESH as an CSG object, consisting of the polygons given\n//\n// Note: See Face-Vertex meshes on Wikipedia\n//\nfunction translateMesh (obj, layers, options) {\n// expected values\n  let vlen = obj['vlen']\n  let pptxs = obj['pptxs'] // vertices\n  let pptys = obj['pptys']\n  let pptzs = obj['pptzs']\n\n  let flen = obj['flen']\n  let fvals = obj['fvals'] // faces\n\n  // conversion\n  let cn = getColorNumber(obj, layers)\n  let shared = getColor(cn, options.colorindex)\n\n  CSG._CSGDEBUG = false\n\n  let polygons = []\n  if (vlen === pptxs.length && vlen === pptys.length && vlen === pptzs.length) {\n    if (flen === fvals.length) {\n      let faces = instantiateFaces(fvals)\n      let points = instantiatePoints(pptxs, pptys, pptzs)\n\n      let fi = 0\n      while (fi < faces.length) {\n        let face = faces[fi]\n        let vectors = []\n        let vertices = [] // did i hear someone say REDUNDANCY\n        let vi = 0\n        while (vi < face.length) {\n          let pi = face[vi]\n          let vector = new CSG.Vector3D(points[pi])\n          vectors.push(vector)\n          let vertex = createVertex(vector)\n          vertices.push(vertex)\n          vi++\n        }\n        if (options.dxf.angdir === 1) {\n          vertices = vertices.reverse()\n        }\n        // FIXME how to correct bad normals?\n\n        let poly = new CSG.Polygon(vertices, shared)\n        polygons.push(poly)\n\n        fi++\n      }\n    } else {\n    }\n  } else {\n  // invalid vlen\n  }\n  // convert the polygons into a script\n  let name = obj['name']\n  let script = `  const ${name}_polygons = [\n`\n  for (let polygon of polygons) {\n    script += '    ' + translatePolygon(polygon) + ',\\n'\n  }\n  script += `  ]\n  let ${name} = CSG.fromPolygons(${name}_polygons)\n`\n  obj['script'] = script\n  addToLayer(obj, layers)\n  return null\n}\n\nfunction findLayer (obj, layers) {\n  let lname = obj['lnam'] || '0'\n\n  // lookup the layer associated with the object\n  for (let layer of layers) {\n    if (layer['name'] === lname) {\n      return layer\n    }\n  }\n  return null\n}\n\nfunction findLayer0 (layers) {\n  for (let layer of layers) {\n    if (layer['name'] === '0') {\n      return layer\n    }\n  }\n  // this DXF did not specify so create\n  let layer = {type: 'layer'}\n  layer['lnam'] = 'layer0'\n  layer['name'] = '0'\n  layer['lscl'] = 1.0\n  layer['visb'] = 0\n  layer['spac'] = 0\n  layer['objects'] = []\n\n  layers.push(layer)\n  return layer\n}\n\nfunction addToLayer (obj, layers) {\n  let layer = findLayer(obj, layers)\n  if (layer === null) {\n    // hmmm... add to layer '0'\n    layer = findLayer0(layers)\n  }\n  if (!('objects' in layer)) {\n    layer['objects'] = []\n  }\n  layer['objects'].push(obj)\n}\n\n//\n// get the color number of the object, possibly looking at layer\n// returns -1 if a color number was not found\n//\nfunction getColorNumber (obj, layers) {\n  let cn = obj['cnmb'] || -1\n  if (cn === BYLAYER) {\n    // use the color number from the layer\n    cn = -1\n    let layer = findLayer(obj, layers)\n    if (layer !== null) {\n      cn = layer['cnmb'] || -1\n    }\n  } else\n  if (cn === BYBLOCK) {\n    // use the color number from the block\n  }\n  return cn\n}\n\nfunction mod (num, mod) {\n  let remain = num % mod\n  return Math.floor(remain >= 0 ? remain : remain + mod)\n}\n\n//\n// instantiate Polygon.Shared(color) using the given index into the given color index\n// Note: 0 > index <= length of colorindex\nfunction getColor (index, colorindex) {\n  if (index < 1) { return null }\n\n  index = mod(index, colorindex.length)\n  let rgba = colorindex[index-1]\n  return new CSG.Polygon.Shared.fromColor([rgba[0]/255,rgba[1]/255,rgba[2]/255,rgba[3]/255])\n}\n\n//\n// get the (internal) object type from the given object\n//\n// This assumes the given object is a POLYLINE.\n// DXF POLYLINE entities are over-loaded objects with various shapes.\n// - 2D line, with following 2D VERTEX entities\n// - 3D line, with following 3D VERTEX entities\n// - 3D polymesh, with following 3D VERTEX entities\n// - 3D polyface, with following 3D VERTEX entities\n//\nfunction getPolyType (obj) {\n  const closedM = parseInt('00000000000000001', 2)\n  const  d3line = parseInt('00000000000001000', 2)\n  const  d3mesh = parseInt('00000000000010000', 2)\n  const closedN = parseInt('00000000000100000', 2)\n  const  d3face = parseInt('00000000001000000', 2)\n\n  let flags = obj['lflg']\n  let ptype = null\n  if ((flags & d3line) === d3line) {\n    let isclosed = ((flags & closedM) === closedM)\n    ptype = {type: '3dline',isclosed: isclosed}\n  } else\n  if ((flags & d3mesh) === d3mesh) {\n    ptype = {type: '3dpolymesh'}\n    // need the mesh shape for interpretation\n    ptype['fvia'] = obj['fvia']\n    ptype['fvib'] = obj['fvib']\n    let closed = ((flags & closedM) === closedM)\n    ptype.closedM = closed\n    closed = ((flags & closedN) === closedN)\n    ptype.closedN = closed\n  } else\n  if ((flags & d3face) === d3face) {\n    ptype = {type: '3dpolyfaces'}\n    // need the vertex and face counts for interpretation\n    ptype['fvia'] = obj['fvia']\n    ptype['fvib'] = obj['fvib']\n  } else {\n    let isclosed = ((flags & closedM) === closedM)\n    ptype = {type: '2dline',isclosed: isclosed}\n  }\n  if ('cnmb' in obj) { ptype['cnmb'] = obj['cnmb'] }\n  if ('lnam' in obj) { ptype['lnam'] = obj['lnam'] }\n  return ptype\n}\n\n//\n// Instantiate the facets of the POLYLINE poly-mesh as a set of polygons.\n//\n// DXF POLYLINE entities can contain a mesh defined by a MxN set of vertices.\n// The mesh is defined in terms of a matrix of M and N vertices, like a grid consisting of columns and rows.\n// M and N specify the column and row position, respectively, of any given vertex.\n// The mesh is constructed row by row; M rows which contain N vertexes.\n//\nfunction instantiateFacets (meshM, meshN, vectors, shared, options) {\n  // console.log('##### instantiateFacets('+meshM+','+meshN+')')\n\n  function getVector (x, y) {\n    let n = (((x - 1) * meshN) + (y - 1))\n    return vectors[n]\n  }\n\n  let facets = []\n\n  // sanity check\n  let fcount = meshM * meshN\n  if (fcount !== vectors.length) {\n    return facets\n  }\n  if (meshM < 2 | meshN < 2) {\n    return facets\n  }\n  // instantiate VALID polygons\n  let i = 1\n  while (i < meshM) {\n    let j = 1\n    while (j < meshN) {\n      let v0 = createVertex(getVector(i, j))\n      let v1 = createVertex(getVector(i + 1, j))\n      let v2 = createVertex(getVector(i + 1, j + 1))\n      let v3 = createVertex(getVector(i, j + 1)) // CCW vectors\n      let facet = [v0, v1, v2, v3]\n      if (options.dxf.angdir === 1) {\n        facet = facet.reverse()\n      }\n      let polygon = new CSG.Polygon(facet, shared)\n      if (Number.isFinite(polygon.plane.w)) {\n        facets.push(polygon)\n      }\n      j++\n    }\n    i++\n  }\n  return facets\n}\n\n//\n// Instantiate the faces of the POLYLINE face-mesh as a set of polygons.\n//\n// DXF POLYLINE entities can contain a face mesh defined by a series of vertices.\n// The first part of the series are the (meshM) vertices.\n// The second part of the series are the (meshN) faces.\n// Each face of the mesh is defined by the indexes provided by the face (group codes 71-74).\n// The first zero(0) index marks the end of the vertices.\n// Negative indexes indicate invisible edges (not implemented).\n//\nfunction instantiatePolyFaces (meshM, meshN, vectors, shared, options) {\n  // console.log('##### instantiatePolyFaces('+meshM+','+meshN+')')\n  let faces = []\n\n  // sanity check\n  if ((meshM + meshN) !== vectors.length) {\n    return faces\n  }\n  // conversion\n  let i = meshM // skip to the faces\n  while (i < vectors.length) {\n    let face = vectors[i]\n    let indexes = [Math.abs(face['fvia']),Math.abs(face['fvib']),Math.abs(face['fvic']),Math.abs(face['fvid'])]\n    let vertices = []\n    if (indexes[0] > 0) {\n      vertices.push(createVertex(vectors[indexes[0] - 1]))\n      if (indexes[1] > 0) {\n        vertices.push(createVertex(vectors[indexes[1] - 1]))\n        if (indexes[2] > 0) {\n          vertices.push(createVertex(vectors[indexes[2] - 1]))\n          if (indexes[3] > 0) {\n            vertices.push(createVertex(vectors[indexes[3] - 1]))\n          }\n        }\n      }\n    }\n    // only use valid face definitions\n    if (vertices.length > 2) {\n      // reverse the order of vertices if necessary\n      if (options.dxf.angdir === 1) {\n        vertices = vertices.reverse()\n      }\n      faces.push(new CSG.Polygon(vertices, shared))\n    }\n    i++\n  }\n  return faces\n}\n\n//\n// Translate a 2D line from the given base object and parts.\n// The translation uses the parts as 2D vertexes from POLYLINE.\n//\nfunction translateAs2Dline(obj, layers, parts, options) {\n  // console.log('##### completing Path2D using vectors')\n  // convert the parts to a series of X/Y/BULG lists\n  obj['vlen'] = parts.length\n  obj['pptxs'] = []\n  obj['pptys'] = []\n  obj['bulgs'] = []\n  for (let vector of parts) {\n    obj['pptxs'].push(vector.x)\n    obj['pptys'].push(vector.y)\n    obj['bulgs'].push(vector['bulg'])\n  }\n  if (obj.closed) {\n    obj['lflg'] = parseInt('00000000000000001', 2)\n  } else {\n    obj['lflg'] = 0\n  }\n  translatePath2D(obj, layers, options)\n  return null\n}\n\n//\n// translate a complex object from the given base object and parts\n// - CSG plus a series of polygons => CSG\n// - Path2D plus a series of 2D vectors => Path2D\n// - CSG plus a series of 3D vectors => CSG\n//\nfunction translateCurrent (obj, layers, parts, options) {\n  if (obj === null) return null\n\n  let type = obj.type\n  // console.log('##### translating Current as '+type)\n  if (type === '2dline') {\n    return translateAs2Dline(obj, layers, parts, options)\n  }\n\n  if (type === '3dline') {\n    // FIXME what to do?\n    return null\n  }\n\n  if (type === '3dpolymesh') {\n    let m = obj['fvia']\n    let n = obj['fvib']\n    let i = parts.length\n    // console.log('##### m: '+m+' n: '+n+' i: '+i)\n    let cn = getColorNumber(obj, layers)\n    let shared = getColor(cn, options.colorindex)\n    let facets = instantiateFacets(m, n, parts, shared, options)\n    parts = facets\n    // fall through, translating the parts (polygons)\n  }\n\n  if (type === '3dpolyfaces') {\n    if ('fvia' in obj) {\n      let m = obj['fvia']\n      let n = obj['fvib']\n      let cn = getColorNumber(obj, layers)\n      let shared = getColor(cn, options.colorindex)\n      let faces = instantiatePolyFaces(m, n, parts, shared, options)\n      parts = faces\n      // fall through, translating the parts (polygons)\n    }\n  }\n  // convert the polygons into a script\n  let name = obj['name']\n  let script = `  const ${name}_polygons = [\n`\n  for (let polygon of parts) {\n    script += '    ' + translatePolygon(polygon) + ',\\n'\n  }\n  script += `  ]\n  let ${name} = CSG.fromPolygons(${name}_polygons)\n`\n  obj['script'] = script\n  addToLayer(obj, layers)\n  return null\n}\n\n//\n// translate the given layer into a wrapper function for the previous translated objects\n//\nfunction translateLayer (layer) {\n  let name = layer['lnam'] || 'Unknown'\n\n  let script = `function ${name}() {\n`\n  for (let object of layer['objects']) {\n    script += object['script']\n  }\n  script += '  return ['\n  for (let object of layer['objects']) {\n    script += object['name'] + ','\n  }\n  script += ']\\n}\\n'\n  return script\n}\n\nfunction saveVariable (obj, options) {\n  let name = obj['name'] || 'Unknown'\n\n  switch (name) {\n    case '$ANGDIR':\n      if ('lflg' in obj) {\n        options.dxf.angdir = obj['lflg']\n      }\n      break\n\n    default:\n      break\n  }\n}\n\nconst translateAsciiDxf = function (reader, options) {\n  // console.log('**************************************************')\n  // console.log(JSON.stringify(reader.objstack))\n  // console.log('**************************************************')\n\n  let  layers = [] // list of layers with various information like color\n  let current = null // the object being created\n  let   parts = [] // the list of object subparts (polygons or vectors)\n  let objects = [] // the list of objects translated\n  let numobjs = 0\n\n  findLayer0(layers)\n\n  let p = null\n  for (let obj of reader.objstack) {\n    p = null\n\n    if (!('type' in obj)) {\n      // console.log('##### skip')\n      continue\n    }\n    if (!('name' in obj)) {\n      obj['name'] = 'jscad' + numobjs\n      numobjs = numobjs + 1\n    } else {\n      // UGG... javascript variable names\n      name = obj['name']\n      name = name.replace(/ /g,'_')\n      name = name.replace(/-/g,'_')\n      name = name.replace(/\\./g,'_')\n      obj['name'] = name\n    }\n    // console.log(JSON.stringify(obj))\n\n    switch (obj.type) {\n      // control objects\n      case 'dxf':\n        break\n      case 'layer':\n        // console.log('##### layer')\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        // save the layer for later reference\n        obj['objects'] = [] // with a list of objects\n        obj['lnam'] = 'layer' + layers.length\n        layers.push(obj)\n        break\n      case 'variable':\n        // console.log(JSON.stringify(obj))\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        saveVariable(obj, options)\n        break\n\n      // 3D entities\n      case '3dface':\n        // console.log('##### 3dface')\n        p = instantiatePolygon(obj, layers, options)\n        if (current === null) {\n          // console.log('##### start of 3dfaces CSG')\n          current = {type: '3dfaces'}\n          current['name'] = 'jscad' + numobjs\n          numobjs = numobjs + 1\n        }\n        break\n      case 'mesh':\n        // console.log('##### mesh')\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        //objects.push(instantiateMesh(obj, layers, options))\n        translateMesh(obj, layers, options)\n        break\n\n      // 2D or 3D entities\n      case 'arc':\n        // console.log('##### arc')\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        translateArc(obj, layers, options)\n        break\n      case 'circle':\n        // console.log('##### circle')\n        current = translateCurrent(current, layers, parts, options)\n        translateCircle(obj, layers, options)\n        parts = []\n        break\n      case 'ellipse':\n        // console.log('##### ellipse')\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        translateEllipse(obj, layers, options)\n        break\n      case 'line':\n        // console.log('##### line')\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        translateLine(obj, layers, options)\n        break\n      case 'polyline':\n        if (current === null) {\n          // console.log('##### start of polyline')\n          current = getPolyType(obj)\n          current['name'] = 'jscad' + numobjs\n          numobjs = numobjs + 1\n        }\n        break\n      case 'vertex':\n        // console.log('##### vertex')\n        p = instantiateVector(obj)\n        break\n      case 'seqend':\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        break\n\n      // 2D entities\n      case 'lwpolyline':\n        // console.log('##### lwpolyline')\n        current = translateCurrent(current, layers, parts, options)\n        parts = []\n        translatePath2D(obj, layers, options)\n        break\n\n      default:\n        // console.log('##### ERROR')\n        // console.log(obj.type)\n        break\n    }\n    // accumlate polygons if necessary\n    if (p instanceof CSG.Polygon) {\n      // console.log('##### push Polygon')\n      parts.push(p)\n    }\n    // accumlate vectors if necessary\n    if (p instanceof CSG.Vector3D) {\n      // console.log('##### push Vector3D')\n      parts.push(p)\n    }\n    if (p instanceof CSG.Vector2D) {\n      // console.log('##### push Vector2D')\n      parts.push(p)\n    }\n  }\n  // translate the last object if necessary\n  current = translateCurrent(current, layers, parts, options)\n\n  // debug output\n  // console.log('**************************************************')\n  let script = 'function main() {\\n  let layers = []\\n  return layers.concat('\n  layers.forEach(\n    function (layer) {\n      let name = layer['lnam'] || 'Unknown'\n      script += `${name}(),`\n    }\n  )\n  script += '[])\\n}\\n'\n\n  // add helper functions for polygons and lines\n  script += \n`function createVertex(point) {\n  return new CSG.Vertex(new CSG.Vector3D(point[0],point[1],point[2]))\n}\nfunction createPlane(pointandw) {\n  return new CSG.Plane(new CSG.Vector3D(pointandw[0],pointandw[1],pointandw[2]),pointandw[3])\n}\nfunction createPolygon(listofpoints,color,pointandw) {\n  let vertices = []\n  for (let point of listofpoints) {\n    vertices.push(createVertex(point))\n  }\n  let shared = new CSG.Polygon.Shared(color)\n  let plane = createPlane(pointandw)\n  return new CSG.Polygon(vertices,shared,plane)\n}\n`\n\n  layers.forEach(\n    function (layer) {\n      script += translateLayer(layer)\n    }\n  )\n  // console.log(script)\n  // console.log('**************************************************')\n  return script\n}\n\nmodule.exports = translateAsciiDxf\n\n},{\"./autocad\":83,\"./instantiate\":85,\"@jscad/csg\":22}],87:[function(require,module,exports){\n/*\nAutoCAD DXF Content\n\nThese are the common headers, classes, tables, blocks, and objects required for AC2017 DXF files.\n\n## License\n\nCopyright (c) 2018 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n*/\n\n// Important Variables\n//   ANGDIR = 0 : counter clockwise angles\n//   INSUNITS = 4 : millimeters\n//\nconst dxfHeaders = function () {\n  const content = `  0\nSECTION\n  2\nHEADER\n  9\n$ACADVER\n  1\nAC1027\n  9\n$ACADMAINTVER\n 70\n8\n  9\n$DWGCODEPAGE\n  3\nANSI_1252\n  9\n$LASTSAVEDBY\n  1\nunknown\n  9\n$REQUIREDVERSIONS\n160\n0\n  9\n$INSBASE\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$EXTMIN\n 10\n1e+20\n 20\n1e+20\n 30\n1e+20\n  9\n$EXTMAX\n 10\n-1e+20\n 20\n-1e+20\n 30\n-1e+20\n  9\n$LIMMIN\n 10\n0.0\n 20\n0.0\n  9\n$LIMMAX\n 10\n12.0\n 20\n9.0\n  9\n$ORTHOMODE\n 70\n0\n  9\n$REGENMODE\n 70\n1\n  9\n$FILLMODE\n 70\n1\n  9\n$QTEXTMODE\n 70\n0\n  9\n$MIRRTEXT\n 70\n0\n  9\n$LTSCALE\n 40\n1.0\n  9\n$ATTMODE\n 70\n1\n  9\n$TEXTSIZE\n 40\n0.2\n  9\n$TRACEWID\n 40\n0.05\n  9\n$TEXTSTYLE\n  7\nNotes\n  9\n$CLAYER\n  8\n0\n  9\n$CELTYPE\n  6\nByLayer\n  9\n$CECOLOR\n 62\n256\n  9\n$CELTSCALE\n 40\n1.0\n  9\n$DISPSILH\n 70\n0\n  9\n$DIMSCALE\n 40\n1.0\n  9\n$DIMASZ\n 40\n3.0\n  9\n$DIMEXO\n 40\n1.5\n  9\n$DIMDLI\n 40\n6.0\n  9\n$DIMRND\n 40\n0.0\n  9\n$DIMDLE\n 40\n0.0\n  9\n$DIMEXE\n 40\n3.0\n  9\n$DIMTP\n 40\n0.0\n  9\n$DIMTM\n 40\n0.0\n  9\n$DIMTXT\n 40\n3.0\n  9\n$DIMCEN\n 40\n3.0\n  9\n$DIMTSZ\n 40\n0.0\n  9\n$DIMTOL\n 70\n0\n  9\n$DIMLIM\n 70\n0\n  9\n$DIMTIH\n 70\n0\n  9\n$DIMTOH\n 70\n0\n  9\n$DIMSE1\n 70\n0\n  9\n$DIMSE2\n 70\n0\n  9\n$DIMTAD\n 70\n1\n  9\n$DIMZIN\n 70\n3\n  9\n$DIMBLK\n  1\n\n  9\n$DIMASO\n 70\n1\n  9\n$DIMSHO\n 70\n1\n  9\n$DIMPOST\n  1\n\n  9\n$DIMAPOST\n  1\n\n  9\n$DIMALT\n 70\n0\n  9\n$DIMALTD\n 70\n2\n  9\n$DIMALTF\n 40\n25.4\n  9\n$DIMLFAC\n 40\n1.0\n  9\n$DIMTOFL\n 70\n0\n  9\n$DIMTVP\n 40\n0.0\n  9\n$DIMTIX\n 70\n0\n  9\n$DIMSOXD\n 70\n0\n  9\n$DIMSAH\n 70\n0\n  9\n$DIMBLK1\n  1\n\n  9\n$DIMBLK2\n  1\n\n  9\n$DIMSTYLE\n  2\nCivil-Metric\n  9\n$DIMCLRD\n 70\n0\n  9\n$DIMCLRE\n 70\n0\n  9\n$DIMCLRT\n 70\n0\n  9\n$DIMTFAC\n 40\n1.0\n  9\n$DIMGAP\n 40\n2.0\n  9\n$DIMJUST\n 70\n0\n  9\n$DIMSD1\n 70\n0\n  9\n$DIMSD2\n 70\n0\n  9\n$DIMTOLJ\n 70\n1\n  9\n$DIMTZIN\n 70\n0\n  9\n$DIMALTZ\n 70\n0\n  9\n$DIMALTTZ\n 70\n0\n  9\n$DIMUPT\n 70\n0\n  9\n$DIMDEC\n 70\n2\n  9\n$DIMTDEC\n 70\n2\n  9\n$DIMALTU\n 70\n2\n  9\n$DIMALTTD\n 70\n2\n  9\n$DIMTXSTY\n  7\nStandard\n  9\n$DIMAUNIT\n 70\n0\n  9\n$DIMADEC\n 70\n2\n  9\n$DIMALTRND\n 40\n0.0\n  9\n$DIMAZIN\n 70\n2\n  9\n$DIMDSEP\n 70\n46\n  9\n$DIMATFIT\n 70\n3\n  9\n$DIMFRAC\n 70\n1\n  9\n$DIMLDRBLK\n  1\n\n  9\n$DIMLUNIT\n 70\n2\n  9\n$DIMLWD\n 70\n-2\n  9\n$DIMLWE\n 70\n-2\n  9\n$DIMTMOVE\n 70\n0\n  9\n$DIMFXL\n 40\n1.0\n  9\n$DIMFXLON\n 70\n0\n  9\n$DIMJOGANG\n 40\n0.785398163397\n  9\n$DIMTFILL\n 70\n0\n  9\n$DIMTFILLCLR\n 70\n0\n  9\n$DIMARCSYM\n 70\n0\n  9\n$DIMLTYPE\n  6\n\n  9\n$DIMLTEX1\n  6\n\n  9\n$DIMLTEX2\n  6\n\n  9\n$DIMTXTDIRECTION\n 70\n0\n  9\n$LUNITS\n 70\n2\n  9\n$LUPREC\n 70\n4\n  9\n$SKETCHINC\n 40\n0.1\n  9\n$FILLETRAD\n 40\n0.0\n  9\n$AUNITS\n 70\n4\n  9\n$AUPREC\n 70\n5\n  9\n$MENU\n  1\n.\n  9\n$ELEVATION\n 40\n0.0\n  9\n$PELEVATION\n 40\n0.0\n  9\n$THICKNESS\n 40\n0.0\n  9\n$LIMCHECK\n 70\n0\n  9\n$CHAMFERA\n 40\n0.0\n  9\n$CHAMFERB\n 40\n0.0\n  9\n$CHAMFERC\n 40\n0.0\n  9\n$CHAMFERD\n 40\n0.0\n  9\n$SKPOLY\n 70\n0\n  9\n$TDCREATE\n 40\n2457986.69756\n  9\n$TDUCREATE\n 40\n2455631.2632\n  9\n$TDUPDATE\n 40\n2457986.69756\n  9\n$TDUUPDATE\n 40\n2456436.43179\n  9\n$TDINDWG\n 40\n0.0003490741\n  9\n$TDUSRTIMER\n 40\n0.0003487153\n  9\n$USRTIMER\n 70\n1\n  9\n$ANGBASE\n 50\n0.0\n  9\n$ANGDIR\n 70\n0\n  9\n$PDMODE\n 70\n0\n  9\n$PDSIZE\n 40\n0.0\n  9\n$PLINEWID\n 40\n0.0\n  9\n$SPLFRAME\n 70\n0\n  9\n$SPLINETYPE\n 70\n6\n  9\n$SPLINESEGS\n 70\n8\n  9\n$HANDSEED\n  5\n5C7\n  9\n$SURFTAB1\n 70\n6\n  9\n$SURFTAB2\n 70\n6\n  9\n$SURFTYPE\n 70\n6\n  9\n$SURFU\n 70\n6\n  9\n$SURFV\n 70\n6\n  9\n$UCSBASE\n  2\n\n  9\n$UCSNAME\n  2\n\n  9\n$UCSORG\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$UCSXDIR\n 10\n1.0\n 20\n0.0\n 30\n0.0\n  9\n$UCSYDIR\n 10\n0.0\n 20\n1.0\n 30\n0.0\n  9\n$UCSORTHOREF\n  2\n\n  9\n$UCSORTHOVIEW\n 70\n0\n  9\n$UCSORGTOP\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$UCSORGBOTTOM\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$UCSORGLEFT\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$UCSORGRIGHT\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$UCSORGFRONT\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$UCSORGBACK\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSBASE\n  2\n\n  9\n$PUCSNAME\n  2\n\n  9\n$PUCSORG\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSXDIR\n 10\n1.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSYDIR\n 10\n0.0\n 20\n1.0\n 30\n0.0\n  9\n$PUCSORTHOREF\n  2\n\n  9\n$PUCSORTHOVIEW\n 70\n0\n  9\n$PUCSORGTOP\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSORGBOTTOM\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSORGLEFT\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSORGRIGHT\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSORGFRONT\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PUCSORGBACK\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$USERI1\n 70\n0\n  9\n$USERI2\n 70\n0\n  9\n$USERI3\n 70\n0\n  9\n$USERI4\n 70\n0\n  9\n$USERI5\n 70\n0\n  9\n$USERR1\n 40\n0.0\n  9\n$USERR2\n 40\n0.0\n  9\n$USERR3\n 40\n0.0\n  9\n$USERR4\n 40\n0.0\n  9\n$USERR5\n 40\n0.0\n  9\n$WORLDVIEW\n 70\n1\n  9\n$SHADEDGE\n 70\n3\n  9\n$SHADEDIF\n 70\n70\n  9\n$TILEMODE\n 70\n1\n  9\n$MAXACTVP\n 70\n64\n  9\n$PINSBASE\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  9\n$PLIMCHECK\n 70\n0\n  9\n$PEXTMIN\n 10\n0.628866766397\n 20\n0.799999952316\n 30\n0.0\n  9\n$PEXTMAX\n 10\n9.02886638493\n 20\n7.19999957085\n 30\n0.0\n  9\n$PLIMMIN\n 10\n-0.700541819174\n 20\n-0.228100386192\n  9\n$PLIMMAX\n 10\n10.2994579405\n 20\n8.27189937351\n  9\n$UNITMODE\n 70\n0\n  9\n$VISRETAIN\n 70\n1\n  9\n$PLINEGEN\n 70\n0\n  9\n$PSLTSCALE\n 70\n1\n  9\n$TREEDEPTH\n 70\n3020\n  9\n$CMLSTYLE\n  2\nStandard\n  9\n$CMLJUST\n 70\n0\n  9\n$CMLSCALE\n 40\n1.0\n  9\n$PROXYGRAPHICS\n 70\n1\n  9\n$MEASUREMENT\n 70\n1\n  9\n$CELWEIGHT\n370\n-1\n  9\n$ENDCAPS\n280\n0\n  9\n$JOINSTYLE\n280\n0\n  9\n$LWDISPLAY\n290\n0\n  9\n$INSUNITS\n 70\n4\n  9\n$HYPERLINKBASE\n  1\n\n  9\n$STYLESHEET\n  1\n\n  9\n$XEDIT\n290\n1\n  9\n$CEPSNTYPE\n380\n0\n  9\n$PSTYLEMODE\n290\n1\n  9\n$FINGERPRINTGUID\n  2\n{39DB1BDD-BC6C-46D3-A333-DFCC0DC4782D}\n  9\n$VERSIONGUID\n  2\n{69EEBB2D-7039-498F-9366-3F994E4A07E7}\n  9\n$EXTNAMES\n290\n1\n  9\n$PSVPSCALE\n 40\n0.0\n  9\n$OLESTARTUP\n290\n0\n  9\n$SORTENTS\n280\n127\n  9\n$INDEXCTL\n280\n0\n  9\n$HIDETEXT\n280\n1\n  9\n$XCLIPFRAME\n280\n0\n  9\n$HALOGAP\n280\n0\n  9\n$OBSCOLOR\n 70\n257\n  9\n$OBSLTYPE\n280\n0\n  9\n$INTERSECTIONDISPLAY\n280\n0\n  9\n$INTERSECTIONCOLOR\n 70\n257\n  9\n$DIMASSOC\n280\n2\n  9\n$PROJECTNAME\n  1\n\n  9\n$CAMERADISPLAY\n290\n0\n  9\n$LENSLENGTH\n 40\n50.0\n  9\n$CAMERAHEIGHT\n 40\n0.0\n  9\n$STEPSPERSEC\n 40\n2.0\n  9\n$STEPSIZE\n 40\n6.0\n  9\n$3DDWFPREC\n 40\n2.0\n  9\n$PSOLWIDTH\n 40\n0.25\n  9\n$PSOLHEIGHT\n 40\n4.0\n  9\n$LOFTANG1\n 40\n1.57079632679\n  9\n$LOFTANG2\n 40\n1.57079632679\n  9\n$LOFTMAG1\n 40\n0.0\n  9\n$LOFTMAG2\n 40\n0.0\n  9\n$LOFTPARAM\n 70\n7\n  9\n$LOFTNORMALS\n280\n1\n  9\n$LATITUDE\n 40\n37.795\n  9\n$LONGITUDE\n 40\n-122.394\n  9\n$NORTHDIRECTION\n 40\n0.0\n  9\n$TIMEZONE\n 70\n-8000\n  9\n$LIGHTGLYPHDISPLAY\n280\n1\n  9\n$TILEMODELIGHTSYNCH\n280\n1\n  9\n$CMATERIAL\n347\n96\n  9\n$SOLIDHIST\n280\n1\n  9\n$SHOWHIST\n280\n1\n  9\n$DWFFRAME\n280\n2\n  9\n$DGNFRAME\n280\n0\n  9\n$REALWORLDSCALE\n290\n1\n  9\n$INTERFERECOLOR\n 62\n1\n  9\n$INTERFEREOBJVS\n345\nA3\n  9\n$INTERFEREVPVS\n346\nA0\n  9\n$CSHADOW\n280\n0\n  9\n$SHADOWPLANELOCATION\n 40\n0.0\n  0\nENDSEC`\n  return content\n}\n\nconst dxfClasses = function () {\n  const content = `  0\nSECTION\n  2\nCLASSES\n  0\nCLASS\n  1\nACDBDICTIONARYWDFLT\n  2\nAcDbDictionaryWithDefault\n  3\nObjectDBX Classes\n 90\n0\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nDICTIONARYVAR\n  2\nAcDbDictionaryVar\n  3\nObjectDBX Classes\n 90\n0\n 91\n15\n280\n0\n281\n0\n  0\nCLASS\n  1\nTABLESTYLE\n  2\nAcDbTableStyle\n  3\nObjectDBX Classes\n 90\n4095\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nMATERIAL\n  2\nAcDbMaterial\n  3\nObjectDBX Classes\n 90\n1153\n 91\n3\n280\n0\n281\n0\n  0\nCLASS\n  1\nVISUALSTYLE\n  2\nAcDbVisualStyle\n  3\nObjectDBX Classes\n 90\n4095\n 91\n26\n280\n0\n281\n0\n  0\nCLASS\n  1\nSCALE\n  2\nAcDbScale\n  3\nObjectDBX Classes\n 90\n1153\n 91\n17\n280\n0\n281\n0\n  0\nCLASS\n  1\nMLEADERSTYLE\n  2\nAcDbMLeaderStyle\n  3\nACDB_MLEADERSTYLE_CLASS\n 90\n4095\n 91\n3\n280\n0\n281\n0\n  0\nCLASS\n  1\nCELLSTYLEMAP\n  2\nAcDbCellStyleMap\n  3\nObjectDBX Classes\n 90\n1152\n 91\n2\n280\n0\n281\n0\n  0\nCLASS\n  1\nEXACXREFPANELOBJECT\n  2\nExAcXREFPanelObject\n  3\nEXAC_ESW\n 90\n1025\n 91\n0\n280\n0\n281\n0\n  0\nCLASS\n  1\nNPOCOLLECTION\n  2\nAcDbImpNonPersistentObjectsCollection\n  3\nObjectDBX Classes\n 90\n1153\n 91\n0\n280\n0\n281\n0\n  0\nCLASS\n  1\nLAYER_INDEX\n  2\nAcDbLayerIndex\n  3\nObjectDBX Classes\n 90\n0\n 91\n0\n280\n0\n281\n0\n  0\nCLASS\n  1\nSPATIAL_INDEX\n  2\nAcDbSpatialIndex\n  3\nObjectDBX Classes\n 90\n0\n 91\n0\n280\n0\n281\n0\n  0\nCLASS\n  1\nIDBUFFER\n  2\nAcDbIdBuffer\n  3\nObjectDBX Classes\n 90\n0\n 91\n0\n280\n0\n281\n0\n  0\nCLASS\n  1\nDIMASSOC\n  2\nAcDbDimAssoc\n  3\n\"AcDbDimAssoc|Product Desc:     AcDim ARX App For Dimension|Company:          Autodesk, Inc.|WEB Address:      www.autodesk.com\"\n 90\n0\n 91\n0\n280\n0\n281\n0\n  0\nCLASS\n  1\nACDBSECTIONVIEWSTYLE\n  2\nAcDbSectionViewStyle\n  3\nObjectDBX Classes\n 90\n1025\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nACDBDETAILVIEWSTYLE\n  2\nAcDbDetailViewStyle\n  3\nObjectDBX Classes\n 90\n1025\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nIMAGEDEF\n  2\nAcDbRasterImageDef\n  3\nISM\n 90\n0\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nRASTERVARIABLES\n  2\nAcDbRasterVariables\n  3\nISM\n 90\n0\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nIMAGEDEF_REACTOR\n  2\nAcDbRasterImageDefReactor\n  3\nISM\n 90\n1\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nIMAGE\n  2\nAcDbRasterImage\n  3\nISM\n 90\n2175\n 91\n1\n280\n0\n281\n1\n  0\nCLASS\n  1\nPDFDEFINITION\n  2\nAcDbPdfDefinition\n  3\nObjectDBX Classes\n 90\n1153\n 91\n1\n280\n0\n281\n0\n  0\nCLASS\n  1\nPDFUNDERLAY\n  2\nAcDbPdfReference\n  3\nObjectDBX Classes\n 90\n4095\n 91\n1\n280\n0\n281\n1\n  0\nCLASS\n  1\nDWFDEFINITION\n  2\nAcDbDwfDefinition\n  3\nObjectDBX Classes\n 90\n1153\n 91\n2\n280\n0\n281\n0\n  0\nCLASS\n  1\nDWFUNDERLAY\n  2\nAcDbDwfReference\n  3\nObjectDBX Classes\n 90\n1153\n 91\n1\n280\n0\n281\n1\n  0\nCLASS\n  1\nDGNDEFINITION\n  2\nAcDbDgnDefinition\n  3\nObjectDBX Classes\n 90\n1153\n 91\n2\n280\n0\n281\n0\n  0\nCLASS\n  1\nDGNUNDERLAY\n  2\nAcDbDgnReference\n  3\nObjectDBX Classes\n 90\n1153\n 91\n1\n280\n0\n281\n1\n  0\nENDSEC`\n  return content\n}\n\nconst dxfTables = function () {\n  const content = `  0\nSECTION\n  2\nTABLES\n  0\nTABLE\n  2\nVPORT\n  5\n8\n330\n0\n100\nAcDbSymbolTable\n 70\n0\n  0\nENDTAB\n  0\nTABLE\n  2\nLTYPE\n  5\n5F\n330\n0\n100\nAcDbSymbolTable\n 70\n7\n  0\nLTYPE\n  5\n14\n330\n5F\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n  2\nByBlock\n 70\n0\n  3\n\n 72\n65\n 73\n0\n 40\n0.0\n  0\nLTYPE\n  5\n15\n330\n5F\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n  2\nByLayer\n 70\n0\n  3\n\n 72\n65\n 73\n0\n 40\n0.0\n  0\nLTYPE\n  5\n16\n330\n5F\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n  2\nContinuous\n 70\n0\n  3\nSolid line\n 72\n65\n 73\n0\n 40\n0.0\n  0\nLTYPE\n  5\n1B1\n330\n5F\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n  2\nCENTER\n 70\n0\n  3\nCenter ____ _ ____ _ ____ _ ____ _ ____ _ ____\n 72\n65\n 73\n4\n 40\n2.0\n 49\n1.25\n 74\n0\n 49\n-0.25\n 74\n0\n 49\n0.25\n 74\n0\n 49\n-0.25\n 74\n0\n  0\nLTYPE\n  5\n1B2\n330\n5F\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n  2\nDASHED\n 70\n0\n  3\nDashed __ __ __ __ __ __ __ __ __ __ __ __ __ _\n 72\n65\n 73\n2\n 40\n0.75\n 49\n0.5\n 74\n0\n 49\n-0.25\n 74\n0\n  0\nLTYPE\n  5\n1B3\n330\n5F\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n  2\nPHANTOM\n 70\n0\n  3\nPhantom ______  __  __  ______  __  __  ______\n 72\n65\n 73\n6\n 40\n2.5\n 49\n1.25\n 74\n0\n 49\n-0.25\n 74\n0\n 49\n0.25\n 74\n0\n 49\n-0.25\n 74\n0\n 49\n0.25\n 74\n0\n 49\n-0.25\n 74\n0\n  0\nLTYPE\n  5\n39E\n330\n5F\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n  2\nHIDDEN\n 70\n0\n  3\nHidden __ __ __ __ __ __ __ __ __ __ __ __ __ __\n 72\n65\n 73\n2\n 40\n9.525\n 49\n6.35\n 74\n0\n 49\n-3.175\n 74\n0\n  0\nENDTAB\n  0\nTABLE\n  2\nLAYER\n  5\n2\n330\n0\n100\nAcDbSymbolTable\n 70\n3\n  0\nLAYER\n  5\n10\n330\n2\n100\nAcDbSymbolTableRecord\n100\nAcDbLayerTableRecord\n  2\n0\n 70\n0\n 62\n7\n  6\nContinuous\n370\n-3\n390\nF\n347\n98\n348\n0\n  0\nLAYER\n  5\n1B4\n330\n2\n100\nAcDbSymbolTableRecord\n100\nAcDbLayerTableRecord\n  2\nView Port\n 70\n0\n 62\n7\n  6\nContinuous\n290\n0\n370\n-3\n390\nF\n347\n98\n348\n0\n  0\nLAYER\n  5\n21D\n330\n2\n100\nAcDbSymbolTableRecord\n100\nAcDbLayerTableRecord\n  2\nDefpoints\n 70\n0\n 62\n7\n  6\nContinuous\n290\n0\n370\n-3\n390\nF\n347\n98\n348\n0\n  0\nENDTAB\n  0\nTABLE\n  2\nSTYLE\n  5\n3\n330\n0\n100\nAcDbSymbolTable\n 70\n3\n  0\nSTYLE\n  5\n11\n330\n3\n100\nAcDbSymbolTableRecord\n100\nAcDbTextStyleTableRecord\n  2\nStandard\n 70\n0\n 40\n0.0\n 41\n1.0\n 50\n0.0\n 71\n0\n 42\n0.2\n  3\narial.ttf\n  4\n\n  0\nSTYLE\n  5\nDC\n330\n3\n100\nAcDbSymbolTableRecord\n100\nAcDbTextStyleTableRecord\n  2\nAnnotative\n 70\n0\n 40\n0.0\n 41\n1.0\n 50\n0.0\n 71\n0\n 42\n0.2\n  3\narial.ttf\n  4\n\n  0\nSTYLE\n  5\n178\n330\n3\n100\nAcDbSymbolTableRecord\n100\nAcDbTextStyleTableRecord\n  2\nNotes\n 70\n0\n 40\n3.0\n 41\n1.0\n 50\n0.0\n 71\n0\n 42\n0.2\n  3\narial.ttf\n  4\n\n  0\nENDTAB\n  0\nTABLE\n  2\nVIEW\n  5\n6\n330\n0\n100\nAcDbSymbolTable\n 70\n0\n  0\nENDTAB\n  0\nTABLE\n  2\nUCS\n  5\n7\n330\n0\n100\nAcDbSymbolTable\n 70\n0\n  0\nENDTAB\n  0\nTABLE\n  2\nAPPID\n  5\n9\n330\n0\n100\nAcDbSymbolTable\n 70\n12\n  0\nAPPID\n  5\n12\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD\n 70\n0\n  0\nAPPID\n  5\nDD\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nAcadAnnoPO\n 70\n0\n  0\nAPPID\n  5\nDE\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nAcadAnnotative\n 70\n0\n  0\nAPPID\n  5\nDF\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD_DSTYLE_DIMJAG\n 70\n0\n  0\nAPPID\n  5\nE0\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD_DSTYLE_DIMTALN\n 70\n0\n  0\nAPPID\n  5\n107\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD_MLEADERVER\n 70\n0\n  0\nAPPID\n  5\n1B5\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nAcAecLayerStandard\n 70\n0\n  0\nAPPID\n  5\n1BA\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD_EXEMPT_FROM_CAD_STANDARDS\n 70\n0\n  0\nAPPID\n  5\n237\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD_DSTYLE_DIMBREAK\n 70\n0\n  0\nAPPID\n  5\n28E\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD_PSEXT\n 70\n0\n  0\nAPPID\n  5\n4B0\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nACAD_NAV_VCDISPLAY\n 70\n0\n  0\nAPPID\n  5\n4E3\n330\n9\n100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n  2\nHATCHBACKGROUNDCOLOR\n 70\n0\n  0\nENDTAB\n  0\nTABLE\n  2\nDIMSTYLE\n  5\nA\n330\n0\n100\nAcDbSymbolTable\n 70\n3\n100\nAcDbDimStyleTable\n 71\n3\n340\n242\n340\n27\n340\nE1\n  0\nDIMSTYLE\n105\n27\n330\nA\n100\nAcDbSymbolTableRecord\n100\nAcDbDimStyleTableRecord\n  2\nStandard\n 70\n0\n 41\n3.0\n 42\n2.0\n 43\n9.0\n 44\n5.0\n140\n3.0\n141\n2.0\n147\n2.0\n340\n11\n1001\nACAD_DSTYLE_DIMJAG\n1070\n388\n1040\n38.0\n1001\nACAD_DSTYLE_DIMBREAK\n1070\n391\n1040\n90.0\n1001\nACAD_DSTYLE_DIMTALN\n1070\n392\n1070\n0\n  0\nDIMSTYLE\n105\nE1\n330\nA\n100\nAcDbSymbolTableRecord\n100\nAcDbDimStyleTableRecord\n  2\nAnnotative\n 70\n0\n 40\n0.0\n 41\n3.0\n 42\n2.5\n 43\n10.0\n 44\n5.0\n140\n3.0\n141\n2.0\n147\n2.0\n340\n11\n1001\nAcadAnnotative\n1000\nAnnotativeData\n1002\n{\n1070\n1\n1070\n1\n1002\n}\n1001\nACAD_DSTYLE_DIMJAG\n1070\n388\n1040\n38.0\n1001\nACAD_DSTYLE_DIMBREAK\n1070\n391\n1040\n90.0\n1001\nACAD_DSTYLE_DIMTALN\n1070\n392\n1070\n0\n  0\nDIMSTYLE\n105\n242\n330\nA\n100\nAcDbSymbolTableRecord\n100\nAcDbDimStyleTableRecord\n  2\nCivil-Metric\n 70\n0\n 41\n3.0\n 42\n1.5\n 43\n6.0\n 44\n3.0\n 73\n0\n 74\n0\n 77\n1\n 78\n3\n 79\n2\n140\n3.0\n141\n3.0\n147\n2.0\n179\n2\n271\n2\n272\n2\n276\n1\n340\n11\n1001\nACAD_DSTYLE_DIMBREAK\n1070\n391\n1040\n3.0\n1001\nACAD_DSTYLE_DIMJAG\n1070\n388\n1040\n38.0\n1001\nACAD_DSTYLE_DIMTALN\n1070\n392\n1070\n0\n  0\nENDTAB\n  0\nTABLE\n  2\nBLOCK_RECORD\n  5\n1\n330\n0\n100\nAcDbSymbolTable\n 70\n4\n  0\nBLOCK_RECORD\n  5\n1F\n330\n1\n100\nAcDbSymbolTableRecord\n100\nAcDbBlockTableRecord\n  2\n*Model_Space\n340\n530\n 70\n0\n280\n1\n281\n0\n  0\nBLOCK_RECORD\n  5\n58\n330\n1\n100\nAcDbSymbolTableRecord\n100\nAcDbBlockTableRecord\n  2\n*Paper_Space\n340\n531\n 70\n0\n280\n1\n281\n0\n  0\nBLOCK_RECORD\n  5\n238\n330\n1\n100\nAcDbSymbolTableRecord\n100\nAcDbBlockTableRecord\n  2\n_ArchTick\n340\n0\n 70\n0\n280\n1\n281\n0\n  0\nBLOCK_RECORD\n  5\n23C\n330\n1\n100\nAcDbSymbolTableRecord\n100\nAcDbBlockTableRecord\n  2\n_Open30\n340\n0\n 70\n0\n280\n1\n281\n0\n  0\nENDTAB\n  0\nENDSEC`\n  return content\n}\n\nconst dxfBlocks = function () {\n  const content = `  0\nSECTION\n  2\nBLOCKS\n  0\nBLOCK\n  5\n23A\n330\n238\n100\nAcDbEntity\n  8\n0\n100\nAcDbBlockBegin\n  2\n_ArchTick\n 70\n0\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  3\n_ArchTick\n  1\n\n  0\nLWPOLYLINE\n  5\n239\n330\n238\n100\nAcDbEntity\n  8\n0\n  6\nByBlock\n 62\n0\n100\nAcDbPolyline\n 90\n2\n 70\n0\n 43\n0.15\n 10\n-0.5\n 20\n-0.5\n 10\n0.5\n 20\n0.5\n  0\nENDBLK\n  5\n23B\n330\n238\n100\nAcDbEntity\n  8\n0\n100\nAcDbBlockEnd\n  0\nBLOCK\n  5\n20\n330\n1F\n100\nAcDbEntity\n  8\n0\n100\nAcDbBlockBegin\n  2\n*Model_Space\n 70\n0\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  3\n*Model_Space\n  1\n\n  0\nENDBLK\n  5\n21\n330\n1F\n100\nAcDbEntity\n  8\n0\n100\nAcDbBlockEnd\n  0\nBLOCK\n  5\n5A\n330\n58\n100\nAcDbEntity\n 67\n1\n  8\n0\n100\nAcDbBlockBegin\n  2\n*Paper_Space\n 70\n0\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  3\n*Paper_Space\n  1\n\n  0\nENDBLK\n  5\n5B\n330\n58\n100\nAcDbEntity\n 67\n1\n  8\n0\n100\nAcDbBlockEnd\n  0\nBLOCK\n  5\n240\n330\n23C\n100\nAcDbEntity\n  8\n0\n100\nAcDbBlockBegin\n  2\n_Open30\n 70\n0\n 10\n0.0\n 20\n0.0\n 30\n0.0\n  3\n_Open30\n  1\n\n  0\nLINE\n  5\n23D\n330\n23C\n100\nAcDbEntity\n  8\n0\n  6\nByBlock\n 62\n0\n370\n-2\n100\nAcDbLine\n 10\n-1.0\n 20\n0.26794919\n 30\n0.0\n 11\n0.0\n 21\n0.0\n 31\n0.0\n  0\nLINE\n  5\n23E\n330\n23C\n100\nAcDbEntity\n  8\n0\n  6\nByBlock\n 62\n0\n370\n-2\n100\nAcDbLine\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 11\n-1.0\n 21\n-0.26794919\n 31\n0.0\n  0\nLINE\n  5\n23F\n330\n23C\n100\nAcDbEntity\n  8\n0\n  6\nByBlock\n 62\n0\n370\n-2\n100\nAcDbLine\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 11\n-1.0\n 21\n0.0\n 31\n0.0\n  0\nENDBLK\n  5\n241\n330\n23C\n100\nAcDbEntity\n  8\n0\n100\nAcDbBlockEnd\n  0\nENDSEC`\n  return content\n}\n\nconst dxfObjects = function () {\n  const content = `  0\nSECTION\n  2\nOBJECTS\n  0\nDICTIONARY\n  5\nC\n330\n0\n100\nAcDbDictionary\n281\n1\n  3\nACAD_COLOR\n350\n524\n  3\nACAD_GROUP\n350\n525\n  3\nACAD_LAYOUT\n350\n526\n  3\nACAD_MATERIAL\n350\n527\n  3\nACAD_MLEADERSTYLE\n350\n528\n  3\nACAD_MLINESTYLE\n350\n529\n  3\nACAD_PLOTSETTINGS\n350\n52A\n  3\nACAD_PLOTSTYLENAME\n350\n52C\n  3\nACAD_SCALELIST\n350\n52D\n  3\nACAD_TABLESTYLE\n350\n52E\n  3\nACAD_VISUALSTYLE\n350\n52F\n  0\nDICTIONARY\n  5\n524\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nDICTIONARY\n  5\n525\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nDICTIONARY\n  5\n526\n330\nC\n100\nAcDbDictionary\n281\n1\n  3\nModel\n350\n530\n  3\nLayout1\n350\n531\n  0\nDICTIONARY\n  5\n527\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nDICTIONARY\n  5\n528\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nDICTIONARY\n  5\n529\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nDICTIONARY\n  5\n52A\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nACDBPLACEHOLDER\n  5\n52B\n330\n52C\n  0\nACDBDICTIONARYWDFLT\n  5\n52C\n330\nC\n100\nAcDbDictionary\n281\n1\n  3\nNormal\n350\n52B\n100\nAcDbDictionaryWithDefault\n340\n52B\n  0\nDICTIONARY\n  5\n52D\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nDICTIONARY\n  5\n52E\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nDICTIONARY\n  5\n52F\n330\nC\n100\nAcDbDictionary\n281\n1\n  0\nLAYOUT\n  5\n530\n330\n526\n100\nAcDbPlotSettings\n  1\n\n  2\nDWFx ePlot (XPS Compatible).pc3\n  4\nANSI_A_(8.50_x_11.00_Inches)\n  6\n\n 40\n5.8\n 41\n17.8\n 42\n5.8\n 43\n17.8\n 44\n215.9\n 45\n279.4\n 46\n0.0\n 47\n0.0\n 48\n0.0\n 49\n0.0\n140\n0.0\n141\n0.0\n142\n1.0\n143\n14.53\n 70\n11952\n 72\n0\n 73\n1\n 74\n0\n  7\n\n 75\n0\n147\n0.069\n148\n114.98\n149\n300.29\n100\nAcDbLayout\n  1\nModel\n 70\n1\n 71\n0\n 10\n0.0\n 20\n0.0\n 11\n12.0\n 21\n9.0\n 12\n0.0\n 22\n0.0\n 32\n0.0\n 14\n0.0\n 24\n0.0\n 34\n0.0\n 15\n0.0\n 25\n0.0\n 35\n0.0\n146\n0.0\n 13\n0.0\n 23\n0.0\n 33\n0.0\n 16\n1.0\n 26\n0.0\n 36\n0.0\n 17\n0.0\n 27\n1.0\n 37\n0.0\n 76\n0\n330\n1F\n  0\nLAYOUT\n  5\n531\n330\n526\n100\nAcDbPlotSettings\n  1\n\n  2\nDWFx ePlot (XPS Compatible).pc3\n  4\nANSI_A_(8.50_x_11.00_Inches)\n  6\n\n 40\n5.8\n 41\n17.8\n 42\n5.8\n 43\n17.8\n 44\n215.9\n 45\n279.4\n 46\n0.0\n 47\n0.0\n 48\n0.0\n 49\n0.0\n140\n0.0\n141\n0.0\n142\n1.0\n143\n1.0\n 70\n688\n 72\n0\n 73\n1\n 74\n5\n  7\nacad.ctb\n 75\n16\n147\n1.0\n148\n0.0\n149\n0.0\n100\nAcDbLayout\n  1\nLayout1\n 70\n1\n 71\n1\n 10\n-0.7\n 20\n-0.23\n 11\n10.3\n 21\n8.27\n 12\n0.0\n 22\n0.0\n 32\n0.0\n 14\n0.63\n 24\n0.8\n 34\n0.0\n 15\n9.0\n 25\n7.2\n 35\n0.0\n146\n0.0\n 13\n0.0\n 23\n0.0\n 33\n0.0\n 16\n1.0\n 26\n0.0\n 36\n0.0\n 17\n0.0\n 27\n1.0\n 37\n0.0\n 76\n0\n330\n58\n  0\nENDSEC`\n  return content\n}\n\nmodule.exports = {\n  dxfHeaders,\n  dxfClasses,\n  dxfTables,\n  dxfBlocks,\n  dxfObjects\n}\n\n},{}],88:[function(require,module,exports){\n/*\nJSCAD Object to AutoCAD DXF Entity Serialization\n\n## License\n\nCopyright (c) 2018 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n\nNotes:\n1) CAG conversion to:\n     POLYLINE\n     LWPOLYLINE\n2) CSG conversion to:\n     3DFACE\n     POLYLINE (face mesh)\n3) Path2D conversion to:\n     LWPOLYLINE\nTBD\n1) support binary output\n2) add color conversion, and translation for CSG\n\n*/\n\nconst {isCAG, isCSG} = require('@jscad/csg')\nconst {ensureManifoldness} = require('@jscad/io-utils')\nconst {dxfHeaders, dxfClasses, dxfTables, dxfBlocks, dxfObjects} = require('./autocad_AC2017')\n\nconst mimeType = 'application/dxf'\n\n/** Serialize the give objects to AutoCad DXF format.\n * @param {Object|Array} objects - objects to serialize as DXF\n * @param {Object} [options] - options for serialization\n * @returns {Array} serialized contents, DXF format\n */\nconst serialize = function (objects, options) {\n  const defaults = {\n    cagTo: 'lwpolyline', // or polyline\n    csgTo: '3dface', // or polyline\n    pathTo: 'lwpolyline',\n    statusCallback: null\n  }\n  options = Object.assign({}, defaults, options)\n\n  let dxfContent = `999\nDXF generated by JSCAD\n${dxfHeaders(options)}\n${dxfClasses(options)}\n${dxfTables(options)}\n${dxfBlocks(options)}\n${dxfEntities(objects, options)}\n${dxfObjects(options)}\n  0\nEOF\n`\n  return [dxfContent]\n}\n\n/** Serialize the given objects as a DXF entity section\n * @param {Array} objects - objects to serialize as DXF\n * @param {Object} options - options for serialization\n * @returns {Object} serialized contents, DXF format\n */\nconst dxfEntities = function (objects, options) {\n  objects = toArray(objects)\n  let entityContents = objects.map(function (object, i) {\n    if (isCAG(object)) {\n      let paths = object.getOutlinePaths()\n      if (options.cagTo === 'polyline') {\n        return PathsToPolyine(paths, options)\n      }\n      return PathsToLwpolyine(paths, options)\n    }\n    if (isCSG(object)) {\n      object = ensureManifoldness(object)\n      if (options.csgTo === 'polyline') {\n        return PolygonsToPolyline(object, options)\n      }\n      return PolygonsTo3DFaces(object, options)\n    }\n    if (isPath(object)) {\n    // mimic a CAG outline path\n      let points = object.getPoints()\n      let closed = object.isClosed()\n      let path = {closed: closed, points: points}\n      return PathsToLwpolyine([path], options)\n    }\n    return ''\n  })\n  let section = `  0\nSECTION\n  2\nENTITIES\n`\n  entityContents.forEach(function (content) {\n    if (content) {\n      section += content\n    }\n  })\n  section += `  0\nENDSEC`\n  return section\n}\n\n//\n// convert the given paths (from CAG outlines) to DXF lwpolyline entities\n// @return array of strings\n//\n// Group Codes Used:\n// 5 - Handle, unique HEX value, e.g. 5C6\n// 8 - layer name (0 is default layer)\n// 67 (0 - model space, 1 - paper space)\n// 100 -\n//\nconst PathsToLwpolyine = function (paths, options) {\n  options.statusCallback && options.statusCallback({progress: 0})\n  let str = ''\n  paths.map(function (path, i) {\n    if (path.points.length < 1) return\n    let numpointsClosed = path.points.length + (path.closed ? 1 : 0)\n    str += `  0\nLWPOLYLINE\n  5\n${getEntityId()}\n  100\nAcDbEntity\n  8\n0\n  67\n0\n  100\nAcDbPolyline\n  90\n${numpointsClosed}\n  70\n${(path.closed ? 1 : 0)}\n`\n    for (let pointindex = 0; pointindex < numpointsClosed; pointindex++) {\n      let pointindexwrapped = pointindex\n      if (pointindexwrapped >= path.points.length) pointindexwrapped -= path.points.length\n      let point = path.points[pointindexwrapped]\n      str += `  10\n${point.x}\n  20\n${point.y}\n`\n    }\n    options.statusCallback && options.statusCallback({progress: 100 * i / paths.length})\n  })\n  options.statusCallback && options.statusCallback({progress: 100})\n  return [str]\n}\n\n//\n// convert the given paths (from CAG outlines) to DXF polyline (2D line) entities\n// @return array of strings\n//\nconst PathsToPolyine = function (paths, options) {\n  options.statusCallback && options.statusCallback({progress: 0})\n  let str = ''\n  paths.map(function (path, i) {\n    let numpointsClosed = path.points.length + (path.closed ? 1 : 0)\n    str += `  0\nPOLYLINE\n  5\n${getEntityId()}\n  100\nAcDbEntity\n  8\n0\n  100\nAcDb2dPolyline\n`\n    for (let pointindex = 0; pointindex < numpointsClosed; pointindex++) {\n      let pointindexwrapped = pointindex\n      if (pointindexwrapped >= path.points.length) pointindexwrapped -= path.points.length\n      let point = path.points[pointindexwrapped]\n      str += `  0\nVERTEX\n  5\n${getEntityId()}\n  100\nAcDbEntity\n  8\n0\n  100\nAcDbVertex\n  100\nAcDb2dVertex\n 10\n${point.x}\n 20\n${point.y}\n`\n    }\n    str += `  0\nSEQEND\n  5\n${getEntityId()}\n  100\nAcDbEntity\n`\n    options.statusCallback && options.statusCallback({progress: 100 * i / paths.length})\n  })\n  options.statusCallback && options.statusCallback({progress: 100})\n  return [str]\n}\n\n//\n// convert the given CSG to DXF 3D face entities\n// @return array of strings\n//\nconst PolygonsTo3DFaces = function (csg, options) {\n  options.statusCallback && options.statusCallback({progress: 0})\n  let str = ''\n  csg.polygons.map(function (polygon, i) {\n    let triangles = polygonToTriangles(polygon)\n    triangles.map(function (triangle, i) {\n      str += triangleTo3DFaces(triangle, options)\n    })\n  })\n  options.statusCallback && options.statusCallback({progress: 100})\n  return [str]\n}\n\n//\n// convert the given polygon to triangles\n//\n// NOTE: This only works for CONVEX polygons\nconst polygonToTriangles = (polygon) => {\n  let length = polygon.vertices.length - 2\n  if (length < 1) return []\n\n  let pivot = polygon.vertices[0]\n  let triangles = []\n  for (let i = 0; i < length; i++) {\n    triangles.push([pivot, polygon.vertices[i + 1], polygon.vertices[i + 2]])\n  }\n  return triangles\n}\n\n//\n// convert the given triangle to DXF 3D face entity\n//\nconst triangleTo3DFaces = (triangle, options) => {\n  let corner10 = triangle[0].pos\n  let corner11 = triangle[1].pos\n  let corner12 = triangle[2].pos\n  let corner13 = triangle[2].pos // same in DXF\n  let str = `  0\n3DFACE\n  5\n${getEntityId()}\n  100\nAcDbEntity\n  8\n0\n  100\nAcDbFace\n  70\n0\n  10\n${corner10.x}\n  20\n${corner10.y}\n  30\n${corner10.z}\n  11\n${corner11.x}\n  21\n${corner11.y}\n  31\n${corner11.z}\n  12\n${corner12.x}\n  22\n${corner12.y}\n  32\n${corner12.z}\n  13\n${corner13.x}\n  23\n${corner13.y}\n  33\n${corner13.z}\n`\n  return str\n}\n\n// convert the given CSG to DXF POLYLINE (polyface mesh)\n// FIXME The entity types are wrong, resulting in imterpretation as a 3D lines, not faces\n// @return array of strings\nconst PolygonsToPolyline = function (csg, options) {\n  options.statusCallback && options.statusCallback({progress: 100})\n  options.statusCallback && options.statusCallback({progress: 0})\n  let str = ''\n  let mesh = polygons2polyfaces(csg.polygons)\n  if (mesh.faces.length > 0) {\n    str += `  0\nPOLYLINE\n  5\n${getEntityId()}\n  100\nAcDbEntity\n  8\n0\n  100\nAcDb3dPolyline\n  70\n64\n  71\n${mesh.vertices.length}\n  72\n${mesh.faces.length}\n`\n    mesh.vertices.forEach(function (vertex) {\n      str += `  0\nVERTEX\n  5\n${getEntityId()}\n  100\nAcDbEntity\n  8\n0\n  100\nAcDbVertex\n  100\nAcDb3dPolylineVertex\n  10\n${vertex[0]}\n  20\n${vertex[1]}\n  30\n${vertex[2]}\n  70\n192\n`\n    })\n    mesh.faces.forEach(function (face) {\n      str += `  0\nVERTEX\n  5\n${getEntityId()}\n  100\nAcDbEntity\n  8\n0\n  100\nAcDbVertex\n  100\nAcDb3dPolylineVertex\n  10\n0\n  20\n0\n  30\n0\n  70\n128\n  71\n${face[0]}\n  72\n${face[1]}\n  73\n${face[2]}\n  74\n${face[3]}\n`\n    })\n  }\n  return [str]\n}\n\n// convert the given polygons (CSG) to polyfaces (DXF)\n// @return array of faces, array of vertices\nconst polygons2polyfaces = function (polygons) {\n  var faces = []\n  var vertices = []\n  for (var i = 0; i < polygons.length; ++i) {\n    let polygon = polygons[i]\n    var face = []\n    for (var j = 0; j < polygon.vertices.length; ++j) {\n      var vv = polygon.vertices[j].pos\n      vertices.push([vv.x, vv.y, vv.z])\n      face.push(vertices.length)\n    }\n    while (face.length < 4) { face.push(0) }\n    faces.push(face)\n  }\n  return {faces: faces, vertices: vertices}\n}\n\n// get a unique id for a DXF entity\n// @return unique id string\nvar entityId = 0\n\nfunction getEntityId () {\n  entityId++\n  // add more zeros if the id needs to be larger\n  let padded = '00000' + entityId.toString(16).toUpperCase()\n  return 'CAD' + padded.substr(padded.length - 5)\n}\n\n// convert the given data to array if not already\n// @return array of data\nfunction toArray (data) {\n  if (Array.isArray(data)) return data\n  return [data]\n}\n\n// determin if the given object is a Path2D object\n// NOTE: Can be removed once CSG provides this functionality\n// @return true or false\nfunction isPath (object) {\n  if (object && 'points' in object && Array.isArray(object.points)) {\n    return true\n  }\n  return false\n}\n\nmodule.exports = {\n  serialize,\n  mimeType\n}\n\n},{\"./autocad_AC2017\":87,\"@jscad/csg\":22,\"@jscad/io-utils\":92}],89:[function(require,module,exports){\n\nfunction deserialize (gcode, filename, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  // http://reprap.org/wiki/G-code\n  const defaults = {version: '0.0.0', addMetaData: true, output: 'jscad'}\n  options = Object.assign({}, defaults, options)\n  const {version, output, addMetaData} = options\n  // just as experiment ...\n  var l = gcode.split(/[\\n]/) // for now just GCODE ASCII\n  var srci = ''\n  var d = 0\n  var pos = []\n  var lpos = []\n  var le = 0\n  var p = []\n  var origin = [-100, -100]\n  var layers = 0\n  var lh = 0.35\n  var lz = 0\n  var ld = 0\n\n  for (var i = 0; i < l.length; i++) {\n    var val = ''\n    var k\n    var e = 0\n    if (l[i].match(/^\\s*;/)) { continue }\n    var c = l[i].split(/\\s+/)\n    for (var j = 0; j < c.length; j++) {\n      if (c[j].match(/G(\\d+)/)) {\n        var n = parseInt(RegExp.$1)\n        if (n === 1) d++\n        if (n === 90) pos.type = 'abs'\n        if (n === 91) pos.type = 'rel'\n      } else if (c[j].match(/M(\\d+)/)) {\n        let n = parseInt(RegExp.$1)\n        if (n === 104 || n === 109) { k = 'temp' }\n      } else if (c[j].match(/S([\\d\\.]+)/)) {\n        var v = parseInt(RegExp.$1)\n        if (k !== undefined) {\n          val[k] = v\n        }\n      } else if (c[j].match(/([XYZE])([\\-\\d\\.]+)/)) {\n        var a = RegExp.$1\n        let v = parseFloat(RegExp.$2)\n        if (pos.type === 'abs') {\n          if (d) pos[a] = v\n        } else {\n          if (d) pos[a] += v\n        }\n        // console.log(d,a,pos.E,lpos.E);\n        if (d && a === 'E' && lpos.E === undefined) {\n          lpos.E = pos.E\n        }\n        if (d && a === 'E' && (pos.E - lpos.E) > 0) {\n          // console.log(pos.E,lpos.E);\n          e++\n        }\n      }\n    }\n    if (d && pos.X && pos.Y) {\n      if (e) {\n        if (!le && lpos.X && lpos.Y) {\n          // console.log(lpos.X,lpos.Y);\n          p.push('[' + (lpos.X + origin[0]) + ',' + (lpos.Y + origin[1]) + ']')\n        }\n        p.push('[' + (pos.X + origin[0]) + ',' + (pos.Y + origin[1]) + ']')\n      }\n      if (!e && le && p.length > 1) {\n        if (srci.length) srci += ',\\n\\t\\t'\n        if (pos.Z !== lz) {\n          lh = pos.Z - lz\n          layers++\n        }\n        srci += 'EX([' + p.join(', ') + '],{w: ' + lh * 1.1 + ', h:' + lh * 1.02 + ', fn:1, closed: false}).translate([0,0,' + pos['Z'] + '])'\n        p = []\n        lz = pos.Z\n        // if(layers>2)\n        //   break;\n      }\n      le = e\n      lpos.X = pos.X\n      lpos.Y = pos.Y\n      lpos.Z = pos.Z\n      lpos.E = pos.E\n    }\n    ld = d\n    options && options.statusCallback && options.statusCallback({progress: 100 * i / l.length})\n  }\n\n  let code = addMetaData ? `//\n  // producer: OpenJSCAD.org Compatibility${version} GCode deserializer\n  // date: ${new Date()}\n  // source: ${filename}\n  //\n  ` : ''\n  code += `// layers: ${layers}\n  function main() {\\n\\tvar EX = function(p,opt) { return rectangular_extrude(p,opt); }\\n\\treturn [\n    ${srci}\n  }\n}\n  `\n  // if(err) src += \"// WARNING: import errors: \"+err+\" (some triangles might be misaligned or missing)\\n\";\n\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  \n  return code\n}\n\nmodule.exports = {\n  deserialize\n}\n\n},{}],90:[function(require,module,exports){\n// BinaryReader\n// Refactored by Vjeux <vjeuxx@gmail.com>\n// http://blog.vjeux.com/2010/javascript/javascript-binary-reader.html\n\n// Original\n// + Jonas Raoni Soares Silva\n// @ http://jsfromhell.com/classes/binary-deserializer [rev. #1]\n\nfunction BinaryReader (data) {\n  this._buffer = data\n  this._pos = 0\n}\n\nBinaryReader.prototype = {\n  /* Public */\n  readInt8: function () { return this._decodeInt(8, true) },\n  readUInt8: function () { return this._decodeInt(8, false) },\n  readInt16: function () { return this._decodeInt(16, true) },\n  readUInt16: function () { return this._decodeInt(16, false) },\n  readInt32: function () { return this._decodeInt(32, true) },\n  readUInt32: function () { return this._decodeInt(32, false) },\n\n  readFloat: function () { return this._decodeFloat(23, 8) },\n  readDouble: function () { return this._decodeFloat(52, 11) },\n\n  readChar: function () { return this.readString(1) },\n  readString: function (length) {\n    this._checkSize(length * 8)\n    var result = this._buffer.substr(this._pos, length)\n    this._pos += length\n    return result\n  },\n\n  seek: function (pos) {\n    this._pos = pos\n    this._checkSize(0)\n  },\n\n  getPosition: function () {\n    return this._pos\n  },\n\n  getSize: function () {\n    return this._buffer.length\n  },\n\n  /* Private */\n  _decodeFloat: function (precisionBits, exponentBits) {\n    var length = precisionBits + exponentBits + 1\n    var size = length >> 3\n    this._checkSize(length)\n\n    var bias = Math.pow(2, exponentBits - 1) - 1\n    var signal = this._readBits(precisionBits + exponentBits, 1, size)\n    var exponent = this._readBits(precisionBits, exponentBits, size)\n    var significand = 0\n    var divisor = 2\n    var curByte = 0 // length + (-precisionBits >> 3) - 1;\n    do {\n      var byteValue = this._readByte(++curByte, size)\n      var startBit = precisionBits % 8 || 8\n      var mask = 1 << startBit\n      while (mask >>= 1) {\n        if (byteValue & mask) {\n          significand += 1 / divisor\n        }\n        divisor *= 2\n      }\n    } while (precisionBits -= startBit)\n\n    this._pos += size\n\n    return exponent === (bias << 1) + 1 ? significand ? NaN : signal ? -Infinity : +Infinity\n      : (1 + signal * -2) * (exponent || significand ? !exponent ? Math.pow(2, -bias + 1) * significand\n        : Math.pow(2, exponent - bias) * (1 + significand) : 0)\n  },\n\n  _decodeInt: function (bits, signed) {\n    var x = this._readBits(0, bits, bits / 8)\n    var max = Math.pow(2, bits)\n    var result = signed && x >= max / 2 ? x - max : x\n\n    this._pos += bits / 8\n    return result\n  },\n\n  // shl fix: Henri Torgemane ~1996 (compressed by Jonas Raoni)\n  _shl: function (a, b) {\n    for (++b; --b; a = ((a %= 0x7fffffff + 1) & 0x40000000) === 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1);\n    return a\n  },\n\n  _readByte: function (i, size) {\n    return this._buffer.charCodeAt(this._pos + size - i - 1) & 0xff\n  },\n\n  _readBits: function (start, length, size) {\n    var offsetLeft = (start + length) % 8\n    var offsetRight = start % 8\n    var curByte = size - (start >> 3) - 1\n    var lastByte = size + (-(start + length) >> 3)\n    var diff = curByte - lastByte\n\n    var sum = (this._readByte(curByte, size) >> offsetRight) & ((1 << (diff ? 8 - offsetRight : length)) - 1)\n\n    if (diff && offsetLeft) {\n      sum += (this._readByte(lastByte++, size) & ((1 << offsetLeft) - 1)) << (diff-- << 3) - offsetRight\n    }\n\n    while (diff) {\n      sum += this._shl(this._readByte(lastByte++, size), (diff-- << 3) - offsetRight)\n    }\n\n    return sum\n  },\n\n  _checkSize: function (neededBits) {\n    if (!(this._pos + Math.ceil(neededBits / 8) < this._buffer.length)) {\n      // throw new Error(\"Index out of bound\");\n    }\n  }\n}\n\nmodule.exports = BinaryReader\n\n},{}],91:[function(require,module,exports){\n/**\n * wrapper around internal csg methods (in case they change) to make sure\n * it resuts in a manifold mesh\n * @constructor\n * @param {string} title - The title of the book.\n * @return {csg}\n */\nfunction ensureManifoldness (input) {\n  const transform = input => {\n    input = 'reTesselated' in input ? input.reTesselated() : input\n    input = 'fixTJunctions' in input ? input.fixTJunctions() : input // fixTJunctions also calls this.canonicalized() so no need to do it twice\n    return input\n  }\n\n  return input.constructor !== Array ? transform(input) : input.map(transform)\n}\n\nmodule.exports = ensureManifoldness\n\n},{}],92:[function(require,module,exports){\nconst makeBlob = require('./makeBlob')\nconst BinaryReader = require('./BinaryReader')\nconst ensureManifoldness = require('./ensureManifoldness')\nmodule.exports = {makeBlob, BinaryReader, ensureManifoldness}\n\n},{\"./BinaryReader\":90,\"./ensureManifoldness\":91,\"./makeBlob\":93}],93:[function(require,module,exports){\n(function (Buffer){\n/*\n * Blob.js\n * See https://developer.mozilla.org/en-US/docs/Web/API/Blob\n *\n * Node and Browserify Compatible\n *\n * Copyright (c) 2015 by Z3 Dev (@zdev/www.z3dev.jp)\n * License: MIT License\n *\n * This implementation uses the Buffer class for all storage.\n * See https://nodejs.org/api/buffer.html\n *\n * URL.createObjectURL(blob)\n *\n * History:\n * 2015/07/02: 0.0.1: contributed to OpenJSCAD.org CLI openjscad\n */\n\nfunction makeBlob (contents, options) {\n  const blob = typeof window !== 'undefined' ? window.Blob : Blob\n  return blob\n}\n\nfunction Blob (contents, options) {\n  // make the optional options non-optional\n  options = options || {}\n  // number of bytes\n  this.size = 0 // contents, not allocation\n  // media type\n  this.type = ''\n  // readability state (CLOSED: true, OPENED: false)\n  this.isClosed = false\n  // encoding of given strings\n  this.encoding = 'utf8'\n  // storage\n  this.buffer = null\n  this.length = 32e+6 // allocation, not contents\n\n  if (!contents) return\n  if (!Array.isArray(contents)) return\n\n  // process options if any\n  if (options.type) {\n    // TBD if type contains any chars outside range U+0020 to U+007E, then set type to the empty string\n    // Convert every character in type to lowercase\n    this.type = options.type.toLowerCase()\n  }\n  if (options.endings) {\n    // convert the EOL on strings\n  }\n  if (options.encoding) {\n    this.encoding = options.encoding.toLowerCase()\n  }\n  if (options.length) {\n    this.length = options.length\n  }\n\n  let wbytes\n  let object\n  // convert the contents (String, ArrayBufferView, ArrayBuffer, Blob)\n  this.buffer = Buffer.alloc(this.length) // new Buffer(this.length)\n  var index = 0\n  for (index = 0; index < contents.length; index++) {\n    switch (typeof (contents[index])) {\n      case 'string':\n        wbytes = this.buffer.write(contents[index], this.size, this.encoding)\n        this.size = this.size + wbytes\n        break\n      case 'object':\n        object = contents[index] // this should be a reference to an object\n        if (Buffer.isBuffer(object)) {\n        }\n        if (object instanceof ArrayBuffer) {\n          var view = new DataView(object)\n          var bindex = 0\n          for (bindex = 0; bindex < object.byteLength; bindex++) {\n            var xbyte = view.getUint8(bindex)\n            wbytes = this.buffer.writeUInt8(xbyte, this.size, false)\n            this.size++\n          }\n        }\n        break\n      default:\n        break\n    }\n  }\n  return this\n}\n\nBlob.prototype = {\n  asBuffer: function () {\n    return this.buffer.slice(0, this.size)\n  },\n\n  slice: function (start, end, type) {\n    start = start || 0\n    end = end || this.size\n    type = type || ''\n    return new Blob()\n  },\n\n  close: function () {\n    // if state of context objext is already CLOSED then return\n    if (this.isClosed) return\n    // set the readbility state of the context object to CLOSED and remove storage\n    this.isClosed = true\n  },\n\n  toString: function () {\n    return 'blob blob blob'\n  }\n}\n\nmodule.exports = makeBlob\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":154}],94:[function(require,module,exports){\nconst {makeBlob} = require('@jscad/io-utils')\n\nconst amfSerializer = require('@jscad/amf-serializer')\nconst dxfSerializer = require('@jscad/dxf-serializer')\nconst jsonSerializer = require('@jscad/json-serializer')\nconst stlSerializer = require('@jscad/stl-serializer')\nconst svgSerializer = require('@jscad/svg-serializer')\nconst x3dSerializer = require('@jscad/x3d-serializer')\n\nconst amfDeSerializer = require('@jscad/amf-deserializer')\nconst dxfDeSerializer = require('@jscad/dxf-deserializer')\nconst gcodeDeSerializer = require('@jscad/gcode-deserializer')\nconst jsonDeSerializer = require('@jscad/json-deserializer')\nconst objDeSerializer = require('@jscad/obj-deserializer')\nconst stlDeSerializer = require('@jscad/stl-deserializer')\nconst svgDeSerializer = require('@jscad/svg-deserializer')\n\nmodule.exports = {\n  makeBlob,\n  amfSerializer,\n  dxfSerializer,\n  jsonSerializer,\n  stlSerializer,\n  svgSerializer,\n  x3dSerializer,\n\n  amfDeSerializer,\n  dxfDeSerializer,\n  gcodeDeSerializer,\n  jsonDeSerializer,\n  objDeSerializer,\n  stlDeSerializer,\n  svgDeSerializer\n}\n/* export {makeBlob} from './utils/Blob'\n\nimport * as CAGToDxf from './serializers/CAGToDxf'\nimport * as CAGToJson from './serializers/CAGToJson'\nimport * as CAGToSvg from './serializers/CAGToSvg'\nimport * as CSGToAMF from './serializers/CSGToAMF'\nimport * as CSGToJson from './serializers/CSGToJson'\nimport * as CSGToStla from './serializers/CSGToStla'\nimport * as CSGToStlb from './serializers/CSGToStlb'\nimport * as CSGToX3D from './serializers/CSGToX3D'\n\nexport {CAGToDxf, CAGToJson, CAGToSvg, CSGToAMF, CSGToJson, CSGToStla, CSGToStlb, CSGToX3D}\n\nexport {parseAMF} from './deserializers/parseAMF'\nexport {parseGCode} from './deserializers/parseGCode'\nexport {parseJSON} from './deserializers/parseJSON'\nexport {parseOBJ} from './deserializers/parseOBJ'\nexport {parseSTL} from './deserializers/parseSTL'\nexport {parseSVG} from './deserializers/parseSVG' */\n\n},{\"@jscad/amf-deserializer\":4,\"@jscad/amf-serializer\":8,\"@jscad/dxf-deserializer\":84,\"@jscad/dxf-serializer\":88,\"@jscad/gcode-deserializer\":89,\"@jscad/io-utils\":92,\"@jscad/json-deserializer\":95,\"@jscad/json-serializer\":96,\"@jscad/obj-deserializer\":97,\"@jscad/stl-deserializer\":123,\"@jscad/stl-serializer\":127,\"@jscad/svg-deserializer\":130,\"@jscad/svg-serializer\":134,\"@jscad/x3d-serializer\":135}],95:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2016 Z3 Development https://github.com/z3dev\n\nAll code released under MIT license\n\nHistory:\n  2016/10/15: 0.5.2: initial version\n\nNotes:\n1) All functions extend other objects in order to maintain namespaces.\n*/\n\n// import { CSG } from '@jscad/csg'\nconst {CSG, CAG} = require('@jscad/csg')\n\n// //////////////////////////////////////////\n//\n// JSON (JavaScript Object Notation) is a lightweight data-interchange format\n// See http://json.org/\n//\n// //////////////////////////////////////////\n\nfunction toSourceCSGVertex (ver) {\n  return 'new CSG.Vertex(new CSG.Vector3D(' + ver._x + ',' + ver._y + ',' + ver._z + '))'\n}\n\n// convert the give CSG object to JSCAD source\nfunction toSourceCSG (csg) {\n  var code = '  var polygons = [];\\n'\n  csg.polygons.map(function (p) {\n    code += '  poly = new CSG.Polygon([\\n'\n    for (var i = 0; i < p.vertices.length; i++) {\n      code += '                         ' + toSourceCSGVertex(p.vertices[i].pos) + ',\\n'\n    }\n    code += '                         ])'\n    if (p.shared && p.shared.color && p.shared.color.length) {\n      code += '.setColor(' + JSON.stringify(p.shared.color) + ');\\n'\n    } else {\n      code += ';\\n'\n    }\n    code += '  polygons.push(poly);\\n'\n  })\n  code += '  return CSG.fromPolygons(polygons);\\n'\n  return code\n};\n\nfunction toSourceCAGVertex (ver) {\n  return 'new CAG.Vertex(new CSG.Vector2D(' + ver.pos._x + ',' + ver.pos._y + '))'\n};\nfunction toSourceSide (side) {\n  return 'new CAG.Side(' + toSourceCAGVertex(side.vertex0) + ',' + toSourceCAGVertex(side.vertex1) + ')'\n};\n\n// convert the give CAG object to JSCAD source\nfunction toSourceCAG (cag) {\n  var code = '  var sides = [];\\n'\n  cag.sides.map(function (s) {\n    code += '  sides.push(' + toSourceSide(s) + ');\\n'\n  })\n  code += '  return CAG.fromSides(sides);\\n'\n  return code\n}\n\n// convert an anonymous CSG/CAG object to JSCAD source\nfunction toSource (obj) {\n  if (obj.type && obj.type === 'csg') {\n    var csg = CSG.fromObject(obj)\n    return toSourceCSG(csg)\n  }\n  if (obj.type && obj.type === 'cag') {\n    var cag = CAG.fromObject(obj)\n    return toSourceCAG(cag)\n  }\n  return ''\n};\n\n//\n// deserialize the given JSON source and return a JSCAD script\n//\n// fn (optional) original filename of JSON source\n//\nfunction deserialize (src, fn, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  fn = fn || 'amf'\n  const defaults = {version: '0.0.0'}\n  options = Object.assign({}, defaults, options)\n  const {version} = options\n\n  // convert the JSON into an anonymous object\n  var obj = JSON.parse(src)\n  options && options.statusCallback && options.statusCallback({progress: 50})\n  // convert the internal objects to JSCAD code\n  var code = ''\n  code += '//\\n'\n  code += '// producer: OpenJSCAD.org ' + version + ' JSON Importer\\n'\n  code += '// date: ' + (new Date()) + '\\n'\n  code += '// source: ' + fn + '\\n'\n  code += '//\\n'\n  code += 'function main() {\\n'\n  code += toSource(obj)\n  code += '};\\n'\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return code\n};\n\nmodule.exports = {\n  deserialize\n}\n\n},{\"@jscad/csg\":22}],96:[function(require,module,exports){\nconst { ensureManifoldness } = require('@jscad/io-utils')\n\nconst mimeType = 'application/json'\n\nfunction fromCAG (CAG, options) {\n  let str = '{ \"type\": \"cag\",\"sides\": ['\n  let comma = ''\n  CAG.sides.map(\n    function (side, i) {\n      str += comma\n      str += JSON.stringify(side)\n      comma = ','\n      options && options.statusCallback && options.statusCallback({progress: 100 * i / CAG.sides.length})\n    }\n  )\n  str += '] }'\n  return [str]\n}\n\nfunction fromCSG (CSG, options) {\n  let str = '{ \"type\": \"csg\",\"polygons\": ['\n  let comma = ''\n  CSG.polygons.map(\n    function (polygon, i) {\n      str += comma\n      str += JSON.stringify(polygon)\n      comma = ','\n      options && options.statusCallback && options.statusCallback({progress: 100 * i / CSG.polygons.length})\n    }\n  )\n  str += '],'\n  str += '\"isCanonicalized\": ' + JSON.stringify(CSG.isCanonicalized) + ','\n  str += '\"isRetesselated\": ' + JSON.stringify(CSG.isRetesselated)\n  str += '}'\n  return [str]\n}\n\nfunction serialize (data, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  const result = 'sides' in data ? fromCAG(data, options) : fromCSG(ensureManifoldness(data), options)\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return result\n}\n\nmodule.exports = {\n  serialize,\n  mimeType\n}\n\n},{\"@jscad/io-utils\":92}],97:[function(require,module,exports){\nconst { vt2jscad } = require('./vt2jscad')\nconst {CSG} = require('@jscad/csg')\n\n/**\n * Parse the given obj data and return either a JSCAD script or a CSG/CAG object\n * @param  {string} input obj data\n * @param {string} filename (optional) original filename of AMF source\n * @param {object} options options (optional) anonymous object with:\n * @param {string} [options.version='0.0.0'] version number to add to the metadata\n * @param {boolean} [options.addMetadata=true] toggle injection of metadata (producer, date, source) at the start of the file\n * @param {string} [options.output='jscad'] {String} either jscad or csg to set desired output\n * @return {CSG/string} either a CAG/CSG object or a string (jscad script)\n */\nfunction deserialize (input, filename, options) { // http://en.wikipedia.org/wiki/Wavefront_.obj_file\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  const defaults = {version: '0.0.0', addMetaData: true, output: 'jscad'}\n  options = Object.assign({}, defaults, options)\n  const {output} = options\n\n  const {positions, faces} = getPositionsAndFaces(input, options)\n  const result = output === 'jscad' ? stringify({positions, faces, options}) : objectify({positions, faces, options})\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return result\n}\n\nconst getPositionsAndFaces = (data, options) => {\n  let lines = data.split(/\\n/)\n  let positions = []\n  let faces = []\n\n  for (let i = 0; i < lines.length; i++) {\n    let s = lines[i]\n    let a = s.split(/\\s+/)\n\n    if (a[0] === 'v') {\n      positions.push([a[1], a[2], a[3]])\n    } else if (a[0] === 'f') {\n      let fc = []\n      let skip = 0\n\n      for (let j = 1; j < a.length; j++) {\n        let c = a[j]\n        c = c.replace(/\\/.*$/, '') // -- if coord# is '840/840' -> 840\n        c-- // -- starts with 1, but we start with 0\n        if (c >= positions.length) {\n          skip++\n        }\n        if (skip === 0) {\n          fc.push(c)\n        }\n      }\n         // fc.reverse();\n      if (skip === 0) {\n        faces.push(fc)\n      }\n    } else {\n      // vn vt and all others disregarded\n    }\n    options && options.statusCallback && options.statusCallback({progress: 90 * i / lines.length})  //getPositionsAndFaces is 90% of total\n  }\n  return {positions, faces}\n}\n\nconst objectify = ({positions, faces}) => {\n  return CSG.polyhedron({points: positions, faces})\n}\n\nconst stringify = ({positions, faces, addMetaData, filename, version}) => {\n  let code = addMetaData ? `//\n  // producer: OpenJSCAD.org Compatibility${version} OBJ deserializer\n  // date: ${new Date()}\n  // source: ${filename}\n  //\n  ` : ''\n  // if(err) src += \"// WARNING: import errors: \"+err+\" (some triangles might be misaligned or missing)\\n\";\n  code += `// objects: 1\n// object #1: polygons: ${faces.length}\nfunction main() { return\n${vt2jscad(positions, faces)}\n}\n  `\n  return code\n}\n\nmodule.exports = {\n  deserialize\n}\n\n},{\"./vt2jscad\":98,\"@jscad/csg\":22}],98:[function(require,module,exports){\n// positions, triangles, normals and colors\nfunction vt2jscad (positions, triangles, normals, colors) {\n  let src = ''\n  src += 'polyhedron({ points: [\\n  '\n  for (let i = 0, j = 0; i < positions.length; i++) {\n    if (j++) src += ',\\n  '\n    src += '[' + positions[i] + ']' // .join(\", \");\n  }\n  src += '],\\n  polygons: [\\n  '\n  for (let i = 0, j = 0; i < triangles.length; i++) {\n    if (j++) src += ',\\n  '\n    src += '[' + triangles[i] + ']' // .join(', ');\n  }\n  if (colors && triangles.length === colors.length) {\n    src += '],\\n\\tcolors: [\\n  '\n    for (let i = 0, j = 0; i < colors.length; i++) {\n      if (j++) src += ',\\n  '\n      src += '[' + colors[i] + ']' // .join(', ');\n    }\n  }\n  src += '] })\\n'\n  return src\n}\n\nmodule.exports = {\n  vt2jscad\n}\n\n},{}],99:[function(require,module,exports){\nmodule.exports = function () {\n  this.argname\n  this.argexpr\n}\n\n},{}],100:[function(require,module,exports){\nmodule.exports = function () {\n  this.argnames = []\n  this.argexpr = []\n}\n\n},{}],101:[function(require,module,exports){\nvar Context = require('./Context')\nvar Globals = require('./Globals')\nvar _ = require('lodash')\n\nfunction CSGModule(factory, csgOperation){\n  this.csgOperation = csgOperation;\n  this.factory = factory;\n};\n\nCSGModule.prototype.evaluate = function(parentContext, inst){\n  var context = new Context(parentContext);\n\n  var childModules = []\n\n  for (var i = 0; i < inst.children.length; i++) {\n\n      var childInst = inst.children[i];\n      childInst.argvalues = [];\n      _.each(childInst.argexpr, function(expr,index,list) {\n          childInst.argvalues.push(expr.evaluate(context));\n      });\n\n      var childAdaptor = this.factory.getAdaptor(childInst);\n      var evaluatedChild = childAdaptor.evaluate(parentContext, childInst);\n      if (evaluatedChild !== undefined){\n          childModules.push(evaluatedChild);\n      }\n  };\n\n  if (childModules.length <= 1){\n      return childModules[0];\n  } else {\n      return childModules[0] + \".\"+this.csgOperation+\"([\" + childModules.slice(1).join(',\\n') + \"])\";\n  }\n};\n\nmodule.exports = CSGModule\n\n},{\"./Context\":103,\"./Globals\":107,\"lodash\":164}],102:[function(require,module,exports){\nvar _ = require('lodash')\nvar Context = require('./Context')\nvar Globals = require('./Globals')\n\nfunction Child(factory){\nthis.factory = factory;\n};\n\nChild.prototype.evaluate = function(parentContext, inst){\n\n    inst.argvalues = [];\n    _.each(inst.argexpr, function(expr,index,list) {\n        inst.argvalues.push(expr.evaluate(parentContext));\n    });\n\n    var context = Context.newContext(parentContext, [], [], inst);\n\n    var childIndex = 0;\n    if (inst.argvalues[0] !== undefined){\n        childIndex = inst.argvalues[0];\n    }\n\n    var evaluatedChildren = [];\n\n    for (var i = Globals.context_stack.length - 1; i >= 0; i--) {\n        var ctx = Globals.context_stack[i];\n\n        if (ctx.inst_p !== undefined){\n            if (childIndex < ctx.inst_p.children.length) {\n\n                var childInst = ctx.inst_p.children[childIndex];\n\n                _.each(childInst.argexpr, function(expr,index,list) {\n                    childInst.argvalues.push(expr.evaluate(ctx.inst_p.ctx));\n                });\n\n                var childAdaptor = this.factory.getAdaptor(childInst);\n                evaluatedChildren.push(childAdaptor.evaluate(ctx.inst_p.ctx, childInst));\n\n            }\n            return evaluatedChildren;\n        }\n        ctx = ctx.parentContext;\n    };\n\n    return undefined;\n};\n\nmodule.exports =  Child\n\n},{\"./Context\":103,\"./Globals\":107,\"lodash\":164}],103:[function(require,module,exports){\nvar _ = require('lodash')\nvar Globals = require('./Globals')\n\nfunction Context(parentContext) {\n  this.vars = (parentContext)? {} : {\n      \"$fn\": Globals.FN_DEFAULT,\n      \"$fs\": Globals.FS_DEFAULT,\n      \"$fa\": Globals.FA_DEFAULT\n  };\n  this.parentContext = parentContext;\n  this.inst_p;\n  this.functions_p = {};\n  this.modules_p = {};\n  Globals.context_stack.push(this);\n};\n\nContext.prototype.setVariable = function(name, value) {\n  if (value !== undefined){\n      this.vars[name] = value;\n  }\n};\n\nContext.prototype.args = function(argnames, argexpr, call_argnames, call_argvalues) {\n\n  for (var i = 0; i < argnames.length; i++) {\n      if (i < argexpr.length && argexpr[i] !== undefined){\n          this.setVariable(argnames[i], argexpr[i].evaluate(this.parentContext));\n      } else {\n          this.setVariable(argnames[i], undefined);\n      }\n  };\n  var posarg = 0;\n  for (var i = 0; i < call_argnames.length; i++) {\n      if (call_argnames[i] === undefined) {\n          if (posarg < argnames.length){\n              this.setVariable(argnames[posarg++], call_argvalues[i]);\n          }\n      } else {\n          this.setVariable(call_argnames[i], call_argvalues[i]);\n      }\n  }\n};\n\nContext.prototype.lookupVariable = function(name) {\n\n  if (_.has(this.vars, name)){\n      return this.vars[name];\n  }\n\n  if (this.parentContext !== undefined){\n      return this.parentContext.lookupVariable(name);\n  }\n\n  //console.log(\"WARNING: Ignoring unknown variable '\"+name+\"'.\");\n  return undefined;\n};\n\n\nContext.prototype.evaluateFunction = function(name, argnames, argvalues) {\n\n  if (_.has(this.functions_p, name)){\n      return this.functions_p[name].evaluate(this, argnames, argvalues);\n  }\n\n  if (_.has(functionNameLookup, name)){\n      return functionNameLookup[name].apply(this, argvalues);\n  }\n\n  if (this.parentContext !== undefined){\n      return this.parentContext.evaluateFunction(name, argnames, argvalues);\n  }\n\n  console.log(\"WARNING: Ignoring unknown function '\"+name+\"'.\");\n  return undefined;\n};\n\nContext.prototype.evaluateModule = function(inst, factory) {\n\n  var that = this;\n\n  var customModule = _.find(this.modules_p, function(x) { return x.name == inst.name; });\n  if (customModule !== undefined) {\n      return customModule.evaluate(this, inst);\n  }\n\n  if (inst.isSubmodule === undefined || !inst.isSubmodule){\n      var adaptor = factory.getAdaptor(inst);\n      if (adaptor !== undefined){\n          return adaptor.evaluate(this, inst);\n      }\n  }\n\n  if (this.parentContext) {\n      return this.parentContext.evaluateModule(inst, factory);\n  }\n\n  console.log(\"WARNING: Ignoring unknown module: \" + inst.name);\n  return undefined;\n};\n\nContext.newContext = function (parentContext, argnames, argexpr, inst) {\n  var context = new Context(parentContext);\n  context.args(argnames, argexpr, inst.argnames, inst.argvalues);\n  return context;\n};\n\nContext.contextVariableLookup = function(context, name, defaultValue){\n  var val = context.lookupVariable(name);\n  if (val === undefined){\n      val = defaultValue;\n  }\n  return val;\n}\n\nContext.printContext = function(c){\n  console.log(c.vars);\n  if (c.parentContext){\n      Context.printContext(c.parentContext);\n  }\n};\n\n/*\n  Returns the number of subdivision of a whole circle, given radius and\n  the three special variables $fn, $fs and $fa\n*/\nContext.get_fragments_from_r = function(r, context) {\n  var fn = Context.contextVariableLookup(context, \"$fn\", Globals.FN_DEFAULT);\n  var fs = Context.contextVariableLookup(context, \"$fs\", Globals.FS_DEFAULT);\n  var fa = Context.contextVariableLookup(context, \"$fa\", Globals.FA_DEFAULT);\n\n  var GRID_FINE   = 0.000001;\n  if (r < GRID_FINE) return 0;\n  if (fn > 0.0)\n      return parseInt(fn);\n  return parseInt(Math.ceil(Math.max(Math.min(360.0 / fa, r*2*Math.PI / fs), 5)));\n};\n\nfunction rad2deg(rad){\n  return rad * (180/Math.PI);\n};\n\nfunction deg2rad(deg){\n  return deg * Math.PI/180.0;\n};\n\nvar functionNameLookup = {\n  \"cos\":function(degree) {\n      if (_.isUndefined(degree)  || _.isNaN(degree)){return undefined;}\n      return Math.cos(deg2rad(degree));\n  },\n  \"sin\":function(degree) {\n      if (_.isUndefined(degree)  || _.isNaN(degree)){return undefined;}\n      return Math.sin(deg2rad(degree));\n  },\n  \"acos\":function(degree) {\n      if (_.isUndefined(degree)  || _.isNaN(degree)){return undefined;}\n      return rad2deg(Math.acos(degree));\n  },\n  \"asin\":function(degree) {\n      if (_.isUndefined(degree)  || _.isNaN(degree)){return undefined;}\n      return rad2deg(Math.asin(degree));\n  },\n  \"atan\":function(degree) {\n      if (_.isUndefined(degree)  || _.isNaN(degree)){return undefined;}\n      return rad2deg(Math.atan(degree));\n  },\n  \"atan2\":function(x,y) {\n      if (_.isUndefined(x) || _.isNaN(x) || _.isUndefined(y) || _.isNaN(y)){return undefined;}\n      return rad2deg(Math.atan2(x,y));\n  },\n  \"tan\":function(degree) {\n      if (_.isUndefined(degree)  || _.isNaN(degree)){return undefined;}\n      return Math.tan(deg2rad(degree));\n  },\n  \"rands\":function(min_value,max_value,value_count, seed_value){\n      var values = [];\n      if (seed_value !== undefined){\n          Math.seedrandom(seed_value);\n      }\n      for (var i=0;i<value_count;i++){\n          var random_value = min_value+(Math.random()*(max_value-min_value));\n          values[i] = random_value;\n      }\n      return values;\n  },\n  \"round\":function(x){\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n\n      // This is because Javascript rounds negative numbers up, whereas c++ rounds down\n      return (x<0)? -(Math.round(Math.abs(x))) : Math.round(x);\n  },\n  \"exp\":function(x) {\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n\n      return Math.exp(x);\n  },\n  \"abs\":function(x){\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      return Math.abs(x);\n  },\n  \"max\":function(){\n      return Math.max.apply(null, _.map(arguments, function(num){ return num ? num : -Infinity; }));\n  },\n  \"min\":function(){\n      return Math.min.apply(null, _.map(arguments, function(num){ return num ? num : Infinity; }));\n  },\n  \"pow\":function(x) {\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      return Math.pow(x);\n  },\n  \"ln\":function(x) {\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      return Math.log(x);\n  },\n  \"ceil\":function(x) {\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      return Math.ceil(x);\n  },\n  \"floor\":function(x) {\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      return Math.floor(x);\n  },\n  \"sqrt\":function(x) {\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      return Math.sqrt(x);\n  },\n  \"len\":function(x){\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      var y = _.isString(x) ? Globals.stripString(x) : x;\n      return y.length;\n  },\n  \"log\":function(){\n      if (arguments.length == 2){\n          if (_.isUndefined(arguments[0])  || _.isNaN(arguments[0])||_.isUndefined(arguments[1])  || _.isNaN(arguments[1])){return undefined;}\n          return Math.log(arguments[1])/Math.log(arguments[0]);\n      } else if (arguments.length == 1){\n          if (_.isUndefined(arguments[0])  || _.isNaN(arguments[0])){return undefined;}\n          return Math.log(arguments[0]) / Math.log(10.0);\n      } else {\n          return undefined;\n      }\n  },\n  \"str\":function(){\n      var vals = [];\n      _.each(arguments, function(x){\n          vals.push(Globals.convertForStrFunction(x));\n      });\n\n      return vals.join('');\n  },\n  \"sign\": function(x){\n      if (_.isUndefined(x)  || _.isNaN(x)){return undefined;}\n      return (x > 0)? 1.0 : ((x < 0)? -1.0 : 0);\n  },\n  \"lookup\": function(){\n      var low_p, low_v, high_p, high_v;\n      if (arguments.length < 2){\n          console.log(\"Lookup arguments are invalid. Incorrect parameter count. \" +  arguments);\n          return undefined;\n      }\n\n      var p = arguments[0];\n      var vector = arguments[1];\n      if (!_.isNumber(p)        ||      // First must be a number\n          !_.isArray(vector)      ||      // Second must be a vector of vectors\n          vector.length < 2       ||\n          (vector.length >=2 && !_.isArray(vector[0]))\n          ){\n          console.log(\"Lookup arguments are invalid. Incorrect parameters. \" +  arguments);\n          return undefined;\n      }\n\n      if (vector[0].length != 2){\n          console.log(\"Lookup arguments are invalid. First vector has incorrect number of values. \" +  p + \",  \" + vector);\n          return undefined;\n      }\n      low_p = vector[0][0];\n      low_v = vector[0][1];\n      high_p = low_p;\n      high_v = low_v;\n\n      _.each(vector.slice(1), function(v){\n          if (v.length == 2){\n              var this_p = v[0];\n              var this_v = v[1];\n\n              if (this_p <= p && (this_p > low_p || low_p > p)) {\n                  low_p = this_p;\n                  low_v = this_v;\n              }\n              if (this_p >= p && (this_p < high_p || high_p < p)) {\n                  high_p = this_p;\n                  high_v = this_v;\n              }\n          }\n      });\n\n      if (p <= low_p){\n          return low_v;\n      }\n\n      if (p >= high_p){\n          return high_v;\n      }\n\n      var f = (p-low_p) / (high_p-low_p);\n      return high_v * f + low_v * (1-f);\n  }\n\n};\n\nmodule.exports =  Context\n\n},{\"./Globals\":107,\"lodash\":164}],104:[function(require,module,exports){\nvar _ = require('lodash')\nvar Context = require('./Context')\nvar Globals = require('./Globals')\nvar Range = require('./Range')\n\nfunction ControlModule(factory){\n  this.factory = factory;\n};\n\nfunction IfStatement(a){\n  ControlModule.call(this, a);\n};\n\nIfStatement.prototype.evaluate = function(parentContext, inst){\n  inst.argvalues = [];\n\n  _.each(inst.argexpr, function(expr,index,list) {\n      inst.argvalues.push(expr.evaluate(parentContext));\n  });\n\n  var context = Context.newContext(parentContext, [], [], inst);\n\n  var childrenToEvaluate = (inst.argvalues.length > 0 && inst.argvalues[0])? inst.children : inst.else_children;\n\n  var childModules = [];\n\n  for (var i = 0; i < childrenToEvaluate.length; i++) {\n\n      var childInst = childrenToEvaluate[i];\n\n      childInst.argvalues = [];\n\n      _.each(childInst.argexpr, function(expr,index,list) {\n          childInst.argvalues.push(expr.evaluate(context));\n      });\n\n      var childAdaptor = this.factory.getAdaptor(childInst);\n\n      childModules.push(childAdaptor.evaluate(context, childInst));\n  };\n  if (_.isEmpty(childModules)){\n      return undefined;\n  } else {\n      if (childModules.length > 1){\n          return _.first(childModules)+\".union([\" + _.tail(childModules) + \"])\";\n      } else {\n          return childModules[0];\n      }\n  }\n};\n\nfunction ForLoopStatement(factory, args){\n  ControlModule.call(this, factory);\n  this.csgOp = args.csgOp;\n  this.evaluatedChildren = [];\n\n  this.forEval = function(parentEvaluatedChildren, inst, recurs_length, call_argnames, call_argvalues, arg_context) {\n\n      this.evaluatedChildren = parentEvaluatedChildren;\n\n      if (call_argnames.length > recurs_length) {\n          var it_name = call_argnames[recurs_length];\n          var it_values = call_argvalues[recurs_length];\n          var context = new Context(arg_context);\n\n          if (it_values instanceof Range) {\n              var range = it_values;\n              if (range.end < range.begin) {\n                  var t = range.begin;\n                  range.begin = range.end;\n                  range.end = t;\n              }\n              if (range.step > 0 && (range.begin-range.end)/range.step < 10000) {\n                  for (var i = range.begin; i <= range.end; i += range.step) {\n                      context.setVariable(it_name, i);\n                      this.forEval(this.evaluatedChildren, inst, recurs_length+1, call_argnames, call_argvalues, context);\n                  }\n              }\n          }\n          else if (_.isArray(it_values)) {\n              for (var i = 0; i < it_values.length; i++) {\n                  context.setVariable(it_name, it_values[i]);\n                  this.forEval(this.evaluatedChildren, inst, recurs_length+1, call_argnames, call_argvalues, context);\n              }\n          }\n      } else if (recurs_length > 0) {\n          var evaluatedInstanceChildren = inst.evaluateChildren(arg_context);\n          if (_.isArray(evaluatedInstanceChildren)){\n              this.evaluatedChildren = this.evaluatedChildren.concat(evaluatedInstanceChildren);\n          } else {\n              this.evaluatedChildren.push(evaluatedInstanceChildren);\n          }\n      }\n      if (_.isArray(this.evaluatedChildren)){\n          // remove empty arrays (e.g. for loops containing only echo statements)\n          this.evaluatedChildren = _.reject(this.evaluatedChildren, function(x){ return _.isEmpty(x); });\n      }\n\n      // Note: we union here so subsequent actions (e.g. translate) can be performed on the entire result of the for loop.\n      if (_.isArray(this.evaluatedChildren) && this.evaluatedChildren.length > 1){\n          var unionedEvaluatedChildren = _.first(this.evaluatedChildren)+\".\"+this.csgOp+\"([\" + _.tail(this.evaluatedChildren) + \"])\";\n          this.evaluatedChildren = [unionedEvaluatedChildren];\n      }\n\n      return this.evaluatedChildren;\n  };\n};\n\nForLoopStatement.prototype.evaluate = function(context, inst) {\n\n  if (inst.context === undefined){\n      inst.context = context;\n  }\n  return this.forEval([], inst, 0, inst.argnames, inst.argvalues, inst.context);\n};\n\nfunction Echo(a){\n  ControlModule.call(this, a);\n};\n\nEcho.prototype.evaluate = function(parentContext, inst){\n  var context = new Context(parentContext);\n  var argvalues = [];\n\n  _.each(inst.argexpr, function(expr,index,list) {\n      argvalues.push(Globals.convertForStrFunction(expr.evaluate(context)));\n  });\n\n  console.log(_.template(\"ECHO: <%=argvalues%>\")({argvalues:argvalues}));\n\n  return undefined;\n};\n\n\nmodule.exports = {\n\tEcho: Echo,\n\tForLoopStatement: ForLoopStatement,\n\tIfStatement: IfStatement\n}\n\n},{\"./Context\":103,\"./Globals\":107,\"./Range\":116,\"lodash\":164}],105:[function(require,module,exports){\nvar Range = require('./Range')\nvar Sylvester = require('@kaosat-dev/sylvester')\nvar _ = require('lodash')\n\n\nfunction Expression(value) {\n  this.children = [];\n  this.const_value = value;\n  this.var_name;\n  this.call_funcname;\n  this.call_argnames = [];\n  this.type = \"C\";\n};\n\nfunction isMatrix(x){\n  return _.isArray(x) && _.isArray(x[0]);\n}\n\nfunction isVector(x){\n  return _.isArray(x) && !_.isArray(x[0]);\n}\n\nfunction getValueObject(x){\n  if (isMatrix(x)){\n      return Sylvester.$M(x);\n  } else if (isVector(x)){\n      return Sylvester.$V(x);\n  } else {\n      return x;\n  }\n}\n\nSylvester.Matrix.prototype.toString = function(){\n  var x = _.map(this.elements, function(y){ return \"[\"+y.join(',')+\"]\"; });\n  return \"[\"+x.join(',')+\"]\";\n}\n\nSylvester.Vector.prototype.toString = function(){\n  return \"[\"+this.elements.join(',')+\"]\";\n}\n\nExpression.prototype.evaluate = function(context) {\n  switch (this.type){\n\n      case \"!\":\n          return ! this.children[0].evaluate(context);\n          break;\n      case \"&&\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return false;\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return true;\n          }\n\n          return c1 && c2;\n          break;\n      case \"||\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return true;\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return true;\n          }\n          return c1 || c2;\n          break;\n      case \"*\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return undefined\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n\n              var v1 = getValueObject(c1);\n              var v2 = getValueObject(c2);\n\n              if (isVector(c1) && isVector(c2)){\n                  return v1.dot(v2);\n              }\n\n              if (isVector(c1) && isMatrix(c2)){\n                  return [v1.dot(v2.col(1)),\n                          v1.dot(v2.col(2)),\n                          v1.dot(v2.col(3))];\n              }\n\n              if (_.isNumber(c1)){\n                  return v2.multiply(v1);\n              }\n\n              return (v1.multiply(v2));\n\n          }\n\n          return c1 * c2;\n\n          break;\n      case \"/\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return undefined\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n\n              var v1 = getValueObject(c1);\n              var v2 = getValueObject(c2);\n\n              if (_.isArray(c1) && _.isArray(c2)){\n                  return undefined;\n              }\n\n              if (isMatrix(c1) && _.isNumber(c2)){\n                  return v1.multiply(1/v2);\n              }\n\n              if (_.isNumber(c1) && isMatrix(c2)){\n                  var result = [];\n\n                  for (var i = 0; i < c2.length; i++){\n                      var a1 = [];\n                      for (var j = 0; j < c2[i].length; j++){\n                          a1[j] = c1 / c2[i][j];\n                      }\n                      result.push(a1);\n                  }\n                  return result;\n              }\n\n              if (isVector(c1) && _.isNumber(c2)) {\n                  return v1.multiply(1/v2);\n              }\n\n              if (_.isNumber(c1) && isVector(c2)) {\n                  return v2.multiply(1/v1);\n              }\n          }\n\n          return c1 / c2;\n\n          break;\n      case \"%\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return undefined\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return undefined;\n          }\n\n          return c1 % c2;\n          break;\n      case \"+\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return undefined\n          }\n\n          if (_.isArray(c1) && _.isArray(c2)){\n              //matrices\n              if (isMatrix(c1) && isMatrix(c2)){\n                  var minLength = Math.min(c1.length, c2.length);\n                  var result = [];\n\n                  for (var i = 0; i < minLength; i++){\n                      var a1 = [];\n                      for (var j = 0; j < c1[i].length; j++){\n                          a1[j] = c1[i][j] + c2[i][j];\n                      }\n                      result.push(a1);\n                  }\n                  return result;\n              } else if (isMatrix(c1) || isMatrix(c2)){\n                  return undefined;\n              }\n              return [c1[0] + c2[0], c1[1] + c2[1], c1[2] + c2[2]];\n          } else if (_.isArray(c1) || _.isArray(c2)){\n              return undefined;\n          } else {\n              return c1 + c2;\n          }\n          break;\n      case \"-\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return undefined\n          }\n\n          if (_.isArray(c1) && _.isArray(c2)){\n\n              //matrices\n              if (_.isArray(c1[0]) && _.isArray(c2[0])){\n                  var minLength = Math.min(c1.length, c2.length);\n                  var result = [];\n\n                  for (var i = 0; i < minLength; i++){\n                      var a1 = [];\n                      for (var j = 0; j < c1[i].length; j++){\n                          a1[j] = c1[i][j] - c2[i][j];\n                      }\n                      result.push(a1);\n                  }\n                  return result;\n              }\n\n              return [c1[0] - c2[0], c1[1] - c2[1], c1[2] - c2[2]];\n          } else if (_.isArray(c1) || _.isArray(c2)){\n              return undefined;\n          } else {\n              return c1 - c2;\n          }\n          break;\n      case \"<\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return false;\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return false;\n          }\n          return c1 < c2;\n          break;\n      case \"<=\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return true;\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return true;\n          }\n          return c1 <= c2;\n          break;\n      case \"==\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return false;\n          }\n\n          if ((isVector(c1) && isVector(c2))\n              || (isMatrix(c1) && isMatrix(c2))){\n              var v1 = getValueObject(c1);\n              var v2 = getValueObject(c2);\n              return v1.eql(v2);\n          }\n          if (_.isArray(c1) || _.isArray(c2)){\n              return false;\n          }\n          return c1 == c2;\n          break;\n      case \"!=\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return false;\n          }\n\n          if ((isVector(c1) && isVector(c2))\n              || (isMatrix(c1) && isMatrix(c2))){\n              var v1 = getValueObject(c1);\n              var v2 = getValueObject(c2);\n              return !v1.eql(v2);\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return true;\n          }\n          return c1 != c2;\n          break;\n      case \">=\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return true;\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return true;\n          }\n\n          return c1 >= c2;\n          break;\n      case \">\":\n          var c1 = this.children[0].evaluate(context);\n          var c2 = this.children[1].evaluate(context);\n\n          if (_.isUndefined(c1) || _.isUndefined(c2) || _.isNaN(c1) || _.isNaN(c2)){\n              return false;\n          }\n\n          if (_.isArray(c1) || _.isArray(c2)){\n              return false;\n          }\n\n          return c1 > c2;\n          break;\n      case \"?:\":\n          var v = this.children[0].evaluate(context);\n          return this.children[v ? 1 : 2].evaluate(context);\n          break;\n      case \"I\":\n\n          var c1 = this.children[0].evaluate(context);\n\n          if (_.isArray(c1)){\n\n              return _.map(c1, function(x){return -x;})\n          }\n\n          return -c1;\n          break;\n      case \"C\":\n          return this.const_value;\n          break;\n      case \"R\":\n          var v1 = this.children[0].evaluate(context);\n          var v2 = this.children[1].evaluate(context);\n          var v3 = this.children[2].evaluate(context);\n          if (_.isNumber(v1) && _.isNumber(v2) && _.isNumber(v3)) {\n              return new Range(v1, v2, v3);\n          }\n          return undefined;\n          break;\n      case \"V\":\n          var vec = [];\n          for (var i = 0; i < this.children.length; i++) {\n              vec.push(this.children[i].evaluate(context));\n          };\n          return vec;\n          break;\n      case \"L\":\n          return context.lookupVariable(this.var_name);\n          break;\n      case \"[]\":\n          return this.children[0].evaluate(context)[this.children[1].evaluate(context)];\n          break;\n      case \"F\":\n          var argvalues =[];\n          for (var i = 0; i < this.children.length; i++){\n                argvalues.push(this.children[i].evaluate(context));\n          }\n\n          return context.evaluateFunction(this.call_funcname, this.call_argnames, argvalues);\n          break;\n      default:\n          console.log(\"todo - evaluate expression\", this);\n  }\n};\nmodule.exports =  Expression\n\n},{\"./Range\":116,\"@kaosat-dev/sylvester\":136,\"lodash\":164}],106:[function(require,module,exports){\nvar Context = require('./Context')\n\nfunction FunctionDef () {\n  this.argnames = []\n  this.argexpr = []\n  this.expr\n}\n\nFunctionDef.prototype.evaluate = function (parentContext, call_argnames, call_argvalues) {\n  var context = new Context(parentContext)\n  context.args(this.argnames, this.argexpr, call_argnames, call_argvalues)\n\n  if (this.expr !== undefined) {\n    return this.expr.evaluate(context)\n  }\n\n  return undefined\n}\n\nmodule.exports = FunctionDef\n\n},{\"./Context\":103}],107:[function(require,module,exports){\nvar _ = require('lodash')\n\nvar singleLineModuleRegex = /(module\\s*\\w*\\([^\\)]*\\)[\\w\\n]*)([^{};]*);/gm;\nvar singleLineModuleReplacement = \"$1 {$2;};\";\nvar multiLineCommentRegex = /((?:\\/\\*(?:[^*]|(?:\\*+[^*\\/]))*\\*+\\/)|(?:\\/\\/.*))/gm;\n\nfunction stripString (s) {\n  if (/^\\\".*\\\"$/.test(s)){\n      return s.match(/^\\\"(.*)\\\"$/)[1];\n  } else {\n      return s;\n  }\n}\n\nfunction convertForStrFunction(val){\n  if (_.isString(val)){\n      return stripString(val);\n  }\n\n  if (_.isArray(val)){\n      var mapped = _.map(val, function (value, key, list) {\n          return convertForStrFunction(value);\n      });\n\n      return \"[\"+mapped.join(',')+\"]\";\n  }\n\n  return val;\n}\n\nfunction preParse(text){\n  return text\n    .replace(multiLineCommentRegex, '')\n    .replace(singleLineModuleRegex, singleLineModuleReplacement)\n}\n\nmodule.exports =  {\n  DEFAULT_RESOLUTION: 16,\n  DEFAULT_2D_RESOLUTION: 16,\n  FN_DEFAULT: 0,\n  FS_DEFAULT: 2.0,\n  FA_DEFAULT: 12.0,\n  module_stack: [],\n  context_stack: [],\n  stripString: stripString,\n  convertForStrFunction: convertForStrFunction,\n  preParse: preParse,\n  importedObjectRegex: /import\\([^\\\"]*\\\"([^\\)]*)\\\"[,]?.*\\);?/gm,\n  usedLibraryRegex: /use <([^>]*)>;?/gm,\n  includedLibraryRegex: /include <([^>]*)>;?/gm\n}\n\n},{\"lodash\":164}],108:[function(require,module,exports){\nvar ModuleInstantiation = require('./ModuleInstantiation')\n\nfunction IfElseModuleInstantiation () {\n  ModuleInstantiation.call(this)\n  this.name = 'if'\n  this.else_children = []\n}\n\nIfElseModuleInstantiation.prototype = new ModuleInstantiation()\nIfElseModuleInstantiation.prototype.constructor = IfElseModuleInstantiation\n\nmodule.exports = IfElseModuleInstantiation\n\n},{\"./ModuleInstantiation\":112}],109:[function(require,module,exports){\nvar Context = require('./Context')\nvar Globals = require('./Globals')\nvar StlDecoder = require('./StlDecoder')\n\nfunction Import (factory) {\n  this.factory = factory\n}\n\nImport.prototype.evaluate = function (parentContext, inst) {\n  var context = new Context(parentContext)\n\n  var argnames = ['file', 'filename', 'convexity']\n  var argexpr = []\n\n  context.args(argnames, argexpr, inst.argnames, inst.argvalues)\n\n  var filename = Context.contextVariableLookup(context, 'file', null) || Context.contextVariableLookup(context, 'filename', null)\n\n  var convexity = Context.contextVariableLookup(context, 'convexity', 5)\n\n  var importCache = Context.contextVariableLookup(context, 'importCache', {})\n\n  var fileContents = importCache[filename]\n\n  if (fileContents !== undefined) {\n    var stlDecoder = new StlDecoder(atob(fileContents))\n    stlDecoder.decode()\n    return stlDecoder.getCSGString()\n  }\n\n  return undefined\n}\n\nmodule.Exports = Import\n\n},{\"./Context\":103,\"./Globals\":107,\"./StlDecoder\":117}],110:[function(require,module,exports){\nvar _ = require('lodash')\nvar Context = require('./Context')\nvar Globals = require('./Globals')\n\n\nfunction Module(name) {\n  this.name = name;\n  this.children = [];\n  this.assignments_var = {};\n  this.functions = {};\n  this.modules = [];\n  this.argnames = [];\n  this.argexpr = [];\n};\n\nModule.prototype.evaluate = function(parentContext, inst) {\n  var lines = [];\n\n  var context = new Context(parentContext);\n\n  if (parentContext === undefined){\n      context.setVariable(\"$fn\", Globals.DEFAULT_RESOLUTION);\n      context.setVariable(\"$fs\", 2.0);\n      context.setVariable(\"$fa\", 12.0);\n  }\n\n  if (inst !== undefined) {\n      context.args(this.argnames, this.argexpr, inst.argnames, inst.argvalues);\n      context.setVariable(\"$children\", inst.children.length);\n  }\n\n  context.inst_p = inst;\n  context.functions_p = this.functions;\n  context.modules_p = this.modules;\n  _.each(this.assignments_var, function(value, key, list) {\n      context.setVariable(key, value.evaluate(context));\n  });\n\n  var controlChildren = _.filter(this.children, function(child){\n      return child && child.name == \"echo\";\n  });\n\n  _.each(controlChildren, function(child, index, list) {\n      child.evaluate(context);\n  });\n\n  var nonControlChildren = _.reject(this.children, function(child){\n      return !child || child.name == \"echo\";\n  });\n\n  var evaluatedLines = [];\n  _.each(nonControlChildren, function(child, index, list) {\n      var evaluatedChild = child.evaluate(context)\n      if (evaluatedChild == undefined || (_.isArray(evaluatedChild) && _.isEmpty(evaluatedChild))){\n          // ignore\n      } else {\n          evaluatedLines.push(evaluatedChild);\n      }\n  });\n\n  var cleanedLines = _.compact(evaluatedLines);\n  if (cleanedLines.length == 1){\n      lines.push(cleanedLines[0]);\n  } else if (cleanedLines.length > 1){\n      lines.push(_.head(cleanedLines)+\".union([\" +_.tail(cleanedLines)+\"])\");\n  }\n\n  return lines;\n};\n\nmodule.exports = Module\n\n},{\"./Context\":103,\"./Globals\":107,\"lodash\":164}],111:[function(require,module,exports){\nfunction ModuleAdaptor () {}\n\nModuleAdaptor.prototype.evaluate = function (parentContext, inst) {\n  inst.isSubmodule = true\n  return parentContext.evaluateModule(inst)\n}\n\nmodule.exports = ModuleAdaptor\n\n},{}],112:[function(require,module,exports){\nvar _ = require('lodash')\nvar OpenjscadSolidFactorySingleton = require('./OpenjscadSolidFactorySingleton')\n\nfunction ModuleInstantiation () {\n  this.name\n  this.argnames = []\n  this.argvalues = []\n  this.argexpr = []\n  this.children = []\n  this.isSubmodule = false\n  this.context\n}\n\nModuleInstantiation.prototype.evaluate = function (context) {\n  var evaluatedModule\n\n  // NOTE: not sure how we should handle this in javascript ... is it necessary?\n  // if (this.context === null) {\n  //    console.log(\"WARNING: Ignoring recursive module instantiation of \", this.name)\n  // } else {\n  var that = this\n\n  this.argvalues = []\n\n  _.each(this.argexpr, function (expr, index, list) {\n    that.argvalues.push(expr.evaluate(context))\n  })\n\n  that.context = context\n\n  evaluatedModule = context.evaluateModule(that, OpenjscadSolidFactorySingleton.getInstance())\n\n  that.context = null\n  that.argvalues = []\n\n  // }\n  return evaluatedModule\n}\n\nModuleInstantiation.prototype.evaluateChildren = function (context) {\n  var childModules = []\n\n  for (var i = 0; i < this.children.length; i++) {\n    var childInst = this.children[i]\n\n    var evaluatedChild = childInst.evaluate(context)\n    if (evaluatedChild !== undefined) {\n      childModules.push(evaluatedChild)\n    }\n  }\n\n  return childModules\n}\n\nmodule.exports = ModuleInstantiation\n\n},{\"./OpenjscadSolidFactorySingleton\":114,\"lodash\":164}],113:[function(require,module,exports){\nvar Context = require('./Context')\nvar Globals = require('./Globals')\nvar PrimitiveModules = require('./PrimitiveModules')\nvar TransformModules = require('./TransformModules')\nvar ControlModules = require('./ControlModules')\nvar CSGModule = require('./CSGModule')\n\nvar ChildModule = require('./ChildModule')\nvar ModuleAdaptor = require('./ModuleAdaptor')\nvar ImportModule = require('./ImportModule')\n\nfunction OpenjscadSolidFactory () {}\n\nOpenjscadSolidFactory.prototype.getAdaptor = function (args) {\n  switch (args.name) {\n    case 'cube':\n      return new PrimitiveModules.Cube()\n    case 'sphere':\n      return new PrimitiveModules.Sphere()\n    case 'cylinder':\n      return new PrimitiveModules.Cylinder()\n    case 'polyhedron':\n      return new PrimitiveModules.Polyhedron()\n    case 'circle':\n      return new PrimitiveModules.Circle()\n    case 'square':\n      return new PrimitiveModules.Square()\n    case 'polygon':\n      return new PrimitiveModules.Polygon()\n    case 'union':\n      return new CSGModule(this, 'union')\n    case 'difference':\n      return new CSGModule(this, 'subtract')\n    case 'intersect':\n    case 'intersection':\n      return new CSGModule(this, 'intersect')\n    case 'translate':\n      return new TransformModules.Translate(this)\n    case 'scale':\n      return new TransformModules.Scale(this)\n    case 'rotate':\n      return new TransformModules.Rotate(this)\n    case 'mirror':\n      return new TransformModules.Mirror(this)\n    case 'linear_extrude':\n      return new TransformModules.Extrude(this)\n    case 'color':\n      return new TransformModules.Color(this)\n    case 'multmatrix':\n      return new TransformModules.Multimatrix(this)\n    case 'render':\n    case 'assign': // Note: assign does the same as render in this case - re-evaluate the arguments and process the children.\n      return new TransformModules.Render(this)\n    case 'echo':\n      return new ControlModules.Echo(this)\n    case 'for':\n      return new ControlModules.ForLoopStatement(this, {csgOp: 'union'})\n    case 'intersection_for':\n      return new ControlModules.ForLoopStatement(this, {csgOp: 'intersect'})\n    case 'if':\n      return new ControlModules.IfStatement(this)\n    case 'import':\n      return new ImportModule(this)\n    case 'child':\n      return new ChildModule(this)\n    default:\n      return new ModuleAdaptor()\n  }\n}\n\nmodule.exports = OpenjscadSolidFactory\n\n},{\"./CSGModule\":101,\"./ChildModule\":102,\"./Context\":103,\"./ControlModules\":104,\"./Globals\":107,\"./ImportModule\":109,\"./ModuleAdaptor\":111,\"./PrimitiveModules\":115,\"./TransformModules\":118}],114:[function(require,module,exports){\nvar OpenjscadSolidFactory = require('./OpenjscadSolidFactory')\nvar factory = new OpenjscadSolidFactory()\n\nmodule.exports = {\n  getInstance: function () {\n    return factory\n  }\n}\n\n},{\"./OpenjscadSolidFactory\":113}],115:[function(require,module,exports){\nvar _ = require('lodash')\nvar Context = require('./Context')\nvar Globals = require('./Globals')\n\nfunction PrimitiveModule(){};\n\nfunction Sphere(a){\n\tPrimitiveModule.call(this, a);\n};\n\nSphere.prototype.evaluate = function(parentContext, inst){\nvar context = new Context(parentContext);\n\nvar argnames = [\"r\", \"$fn\"];\nvar argexpr = [];\n\ncontext.args(argnames, argexpr, inst.argnames, inst.argvalues);\n\nvar r = Context.contextVariableLookup(context, \"r\", 1);\n\nvar resolution = Context.get_fragments_from_r(r, context);\n\nvar openjscadParameters = {center:[0,0,0], resolution:resolution, radius:r};\n\nreturn _.template('CSG.sphere({center: [<%=String(center)%>], radius: <%= radius %>, resolution: <%= resolution%>})')(openjscadParameters);\n}\n\nfunction Cylinder(a){\nPrimitiveModule.call(this, a);\n};\n\nCylinder.prototype.evaluate = function(parentContext, inst) {\n\nvar context = new Context(parentContext);\n\nvar argnames = [\"h\", \"r1\", \"r2\", \"center\", \"$fn\", \"$fa\", \"$fs\"];\nvar argexpr = [];\n\ncontext.args(argnames, argexpr, inst.argnames, inst.argvalues);\n\nvar openjscadArgs = {start: [0,0,0], end: [0,0,1], radiusStart: 1, radiusEnd: 1, resolution: Globals.DEFAULT_RESOLUTION};\nvar isCentered = Context.contextVariableLookup(context, \"center\", false);\nvar h = Context.contextVariableLookup(context, \"h\", 1);\nvar r = Context.contextVariableLookup(context, \"r\", 1);\nvar r1 = Context.contextVariableLookup(context, \"r1\", undefined);\nvar r2 = Context.contextVariableLookup(context, \"r2\", undefined);\n\nvar startZ = isCentered? -(h/2) : 0;\nvar endZ = isCentered? h/2 : h;\n\nopenjscadArgs.start = [0, 0, startZ];\nopenjscadArgs.end = [0, 0, endZ];\n\n/* we have to check the context vars directly here in case a parent module in the context stack has the same parameters, e.g. r1 which would be used as default.\n Example testcad case:\n      module ring(r1, r2, h) {\n          cylinder(r = 3, h = h);\n      }\n      ring(8, 6, 10);\n*/\n\nif (_.has(context.vars, 'r')) {\n  openjscadArgs.radiusStart = r;\n  openjscadArgs.radiusEnd = r;\n}\nif (_.has(context.vars, 'r1')) {\n  openjscadArgs.radiusStart = r1;\n}\nif (_.has(context.vars, 'r2')) {\n  openjscadArgs.radiusEnd = r2;\n}\nopenjscadArgs.resolution = Context.get_fragments_from_r(Math.max(openjscadArgs.radiusStart, openjscadArgs.radiusEnd), context);\n\nif (openjscadArgs.radiusStart == 0 && openjscadArgs.radiusEnd == 0){\n  return undefined;\n}\n\nreturn _.template('CSG.cylinder({start: [<%=start%>], end: [<%=end%>],radiusStart: <%=radiusStart%>, radiusEnd: <%=radiusEnd%>, resolution: <%=resolution%>})')(openjscadArgs);\n};\n\n\nfunction Cube(a){\nPrimitiveModule.call(this, a);\n};\n\nCube.prototype.evaluate = function(parentContext, inst) {\nvar context = Context.newContext(parentContext, [\"size\", \"center\"], [], inst);\n\nvar openjscadArgs = {resolution:Globals.DEFAULT_RESOLUTION};\nvar isCentered = Context.contextVariableLookup(context, \"center\", false);\nvar size = Context.contextVariableLookup(context, \"size\", 1);\n\nif (size instanceof Array){\n  openjscadArgs.radius = [size[0]/2, size[1]/2, size[2]/2];\n} else {\n  openjscadArgs.radius = [size/2,size/2,size/2];\n}\n\nif (isCentered){\n  openjscadArgs.centerVector = [0,0,0];\n} else {\n  openjscadArgs.centerVector = [openjscadArgs.radius[0],openjscadArgs.radius[1],openjscadArgs.radius[2]];\n}\n\nreturn _.template('CSG.cube({center: [<%=String(centerVector)%>],radius: [<%= radius %>], resolution: <%= resolution%>})')(openjscadArgs)\n};\n\n\nfunction Circle(a){\nPrimitiveModule.call(this, a);\n};\n\nCircle.prototype.evaluate = function(parentContext, inst){\nvar context = Context.newContext(parentContext, [\"r\", \"$fn\"], [], inst);\n\nvar r = Context.contextVariableLookup(context, \"r\", 1);\nvar resolution = Context.get_fragments_from_r(r, context);\n\nreturn _.template('CAG.circle({center: [0,0], radius: <%=r%>, resolution: <%=resolution%>})')({r: r,resolution: resolution})\n\n};\n\n\nfunction Square(a){\nPrimitiveModule.call(this, a);\n};\n\nSquare.prototype.evaluate = function(parentContext, inst){\nvar context = Context.newContext(parentContext, [\"size\", \"center\"], [], inst);\n\nvar size = Context.contextVariableLookup(context, \"size\", [0.5,0.5]);\nvar center = Context.contextVariableLookup(context, \"center\", false);\nvar radius = _.isArray(size)? radius = [size[0]/2,size[1]/2] : [size/2,size/2];\nvar centerPoint = [0,0];\nif (!center){\n  centerPoint = [size[0]/2, size[1]/2]\n}\n\nreturn _.template('CAG.rectangle({center: [<%=centerPoint%>], radius: [<%=radius%>]})')({centerPoint:centerPoint, radius:radius});\n};\n\nfunction Polygon(a){\nPrimitiveModule.call(this, a);\n};\n\nPolygon.prototype.evaluate = function(parentContext, inst){\nvar context = Context.newContext(parentContext, [\"points\", \"paths\", \"convexity\"], [], inst);\n\nvar points = Context.contextVariableLookup(context, \"points\", []);\nvar paths = Context.contextVariableLookup(context, \"paths\", []);\nvar pointsMap = [];\n\nfunction formatPoints (points){\n  return _.map(points, function(x){return _.template(\"[<%=x%>]\")({x:x})});\n}\n\nif (_.isEmpty(paths)){\n  return _.template('CAG.fromPoints([<%=points%>])')({points:formatPoints(points)});\n}\n\nif (paths.length > 1){\n  var lines = \"\";\n\n  _.each(_.first(paths), function(x) {\n      pointsMap.push(points[x]);\n  });\n  lines += _.template('(new CSG.Path2D([<%=points%>],true)).innerToCAG().subtract([')({points:formatPoints(pointsMap)});\n\n  var holes = [];\n\n  _.each(_.tail(paths), function(shape) {\n      pointsMap = [];\n      _.each(shape, function(x) {\n          pointsMap.push(points[x]);\n      });\n      holes.push(_.template('(new CSG.Path2D([<%=points%>],true)).innerToCAG()')({points:formatPoints(pointsMap)}));\n  });\n\n  lines += holes.join(',') + \"])\";\n\n  return lines;\n\n} else {\n  _.each(paths[0], function(x) {\n      pointsMap.push(points[x]);\n  });\n  return _.template('(new CSG.Path2D([<%=points%>],true)).innerToCAG()')({points:formatPoints(pointsMap)});\n}\n};\n\nfunction Polyhedron(a){\n\tPrimitiveModule.call(this, a);\n};\n\nPolyhedron.prototype.evaluate = function(parentContext, inst){\nvar context = Context.newContext(parentContext, [\"points\", \"triangles\", \"convexity\"], [], inst);\n\nvar points = Context.contextVariableLookup(context, \"points\", []);\nvar triangles = Context.contextVariableLookup(context, \"triangles\", []);\n\nvar polygons=[];\n\n_.each(triangles, function(triangle) {\n  polygons.push(\n      _.template(\"new CSG.Polygon([new CSG.Vertex(new CSG.Vector3D([<%=vec1%>])),new CSG.Vertex(new CSG.Vector3D([<%=vec2%>])),new CSG.Vertex(new CSG.Vector3D([<%=vec3%>]))])\")\n          ({vec1:points[triangle[2]],\n          vec2:points[triangle[1]],\n          vec3:points[triangle[0]]}));\n});\n\nreturn _.template(\"CSG.fromPolygons([<%=polygons%>])\")({polygons:polygons});\n};\n\n\n\nmodule.exports =  {\n\tSphere: Sphere,\n\tCube: Cube,\n\tCylinder: Cylinder,\n\tCircle: Circle,\n\tSquare: Square,\n\tPolygon: Polygon,\n\tPolyhedron: Polyhedron\n}\n\n},{\"./Context\":103,\"./Globals\":107,\"lodash\":164}],116:[function(require,module,exports){\nfunction Range (begin, step, end) {\n  this.begin = begin\n  this.step = step\n  this.end = end\n}\n\nmodule.exports = Range\n\n},{}],117:[function(require,module,exports){\n/*\n  #\tModule:\t\t\tSTL.js\n  #\n  #\tDescription:\tdecode STL 3D file\n  #\t\t\t\t\tmodified Devon Govett's bmp.js\n  #\n  #\tReference:\n  #\t\tSTL specs.\thttp://en.wikipedia.org/wiki/STL_%28file_format%29#Binary_STL\n  # \tBMP.js\t\thttp://devongovett.github.com/bmp.js/\n  #\n  # Author(s):\t\tDevon Govett provide a bmp decoding example.\n  # \t\t\t\tC.T. Yeung modify to decode STL.\n  #\n  # History:\n  # 20Dec11\t\t\t1st crack at it\t\t\t\t\t\t\t\tcty\n  # 23Dec11\t\t\tloading vertexies OK\n  # \t\t\t\tneed to test normal when rendering shades\n  #                 rotation is off when passed 180 degrees\t\tcty\n  #\n  # MIT LICENSE\n  # Copyright (c) 2011 CT Yeung\n  # Copyright (c) 2011 Devon Govett\n  #\n  # Permission is hereby granted, free of charge, to any person obtaining a copy of this\n  # software and associated documentation files (the \"Software\"), to deal in the Software\n  # without restriction, including without limitation the rights to use, copy, modify, merge,\n  # publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons\n  # to whom the Software is furnished to do so, subject to the following conditions:\n  #\n  # The above copyright notice and this permission notice shall be included in all copies or\n  # substantial portions of the Software.\n  #\n  # THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n  # BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n  # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n  */\n\n\tvar HDR_LEN = 80;\n\n\tfunction STL(data) {\n\n\t\tvar buf = new ArrayBuffer(data.length);\n\t\tthis.data = new Uint8Array(buf);\n\t\tfor (var i=0, dataLen=data.length; i<dataLen; i++) {\n\t\t\tthis.data[i] = data.charCodeAt(i);\n\t\t}\n\n\t  \tthis.TYPE_ASCII = \"ascii\";\n\t\tthis.TYPE_BINARY = \"binary\";\n\t\tthis.dataType = \"\";\n\n\t\tthis.ASCII_TITLE = \"solid\";\n\t\tthis.TYPE_VERTEX = \"vertex\";\n\t\tthis.TYPE_NORMAL = \"normal\";\n\t\tthis.TYPE_END = \"end\"\n\t\tthis.NOT_ASCII = -1;\n\t\tthis.listVertex = null;\n\t\tthis.listNormal = null;\n\t\tthis.pos = 0;\n\n\t\tif(this.data.length<(HDR_LEN+4))\n\t\t\tthrow 'STL file too small: ' + this.data.length;\n\t};\n\n\tSTL.prototype.findEndPos = function(stt) {\n\t  var i = stt;\n\t  while(i<(this.data.length-1)) {\n\t\t  // seek linefeed\n\t\t  if(this.data[i]==10)\n\t\t\t  return i;\n\t\t  i++;\n\t  }\n\t  return this.data.length-1;\n\t};\n\n\tSTL.prototype.bin2String = function(sttPos, endPos) {\n\t  var buf=\"\";\n\t  for(var i=sttPos; i<endPos; i++) {\n\t\t  var char = this.data[i].toString();\n\t\t  buf += String.fromCharCode(char);\n\t  }\n\t  return buf.replace('\\r', '');\n\t};\n\n\tSTL.prototype.readUInt16 = function() {\n\t\tvar b1, b2;\n\t\tb1 = this.data[this.pos++];\n\t\tb2 = this.data[this.pos++] << 8;\n\t\treturn b1 | b2;\n\t};\n\n\tSTL.prototype.readUInt32 = function() {\n\t\tvar b1, b2, b3, b4;\n\t\tb1 = this.data[this.pos++];\n\t\tb2 = this.data[this.pos++] << 8;\n\t\tb3 = this.data[this.pos++] << 16;\n\t\tb4 = this.data[this.pos++] << 24;\n\t\tvar num = b1 | b2 | b3 | b4;\n\t\treturn num;\n\t};\n\n\tSTL.prototype.readReal32 = function() {\n\t  if(this.data.length<=this.pos+4)\t\t// over run !!! error condition\n\t\treturn 0;\n\n\t  var byteArray = [0,0,0,0];\n\t  byteArray[3] = this.data[this.pos++];\n\t  byteArray[2] = this.data[this.pos++];\n\t  byteArray[1] = this.data[this.pos++];\n\t  byteArray[0] = this.data[this.pos++];\n\n\t  var sign = this.parseSign(byteArray);\n\t  var exponent = this.parseExponent(byteArray);\n\t  var mantissa = this.parseSignificand(byteArray);\n\t  var num = sign * exponent * mantissa;\n\t  return num;\n\t};\n\n\tSTL.prototype.parseSign = function(byteArray) {\n\t\tif(byteArray[0]&0x80)\n\t\t\treturn -1;\n\t\treturn 1;\n\t};\n\n\tSTL.prototype.parseExponent = function(byteArray) {\n\t\tvar ex = (byteArray[0] & 0x7F);\n\t\tex = ex << 1;\n\n\t\tif(0!=(byteArray[1] & 0x80))\n\t\t\tex += 0x01;\n\n\t\tex = Math.pow(2, ex-127);\n\t\treturn ex;\n\t};\n\n\tSTL.prototype.parseSignificand = function(byteArray) {\n\t\tvar num=0;\n\t\tvar bit;\n\t\tvar mask = 0x40;\n\t\tfor(var i=1; i<8; i++) {\n\t\t\tif(0!=(byteArray[1]&mask))\n\t\t\t\tnum += 1 / Math.pow(2, i);\n\t\t\tmask = mask >> 1;\n\t\t}\n\t\tmask = 0x80;\n\t\tfor(var j=0; j<8; j++) {\n\t\t\tif(0!=(byteArray[2]&mask))\n\t\t\t\tnum += 1 / Math.pow(2, j+8);\n\t\t\tmask = mask >> 1;\n\t\t}\n\t\tmask = 0x80;\n\t\tfor(var k=0; k<8; k++) {\n\t\t\tif(0!=(byteArray[2]&mask))\n\t\t\t\tnum += 1 / Math.pow(2, k+16);\n\t\t\tmask = mask >> 1;\n\t\t}\n\t\treturn (num+1);\n\t};\n\n\tSTL.prototype.readNormal = function(index) {\n\t\tvar sttPos = this.listNormal[index];\n\t  var endPos = this.findEndPos(sttPos);\t\t// return EOF pos if not found\n\t  var vString = this.bin2String(sttPos, endPos);\n\t  var pos = vString.indexOf(this.TYPE_NORMAL);\n\t  vString = vString.substring(pos+this.TYPE_NORMAL.length+1, vString.length)\n\t  var list = vString.split(\" \");\n\n\t  var normal = new Array();\n\t  for(var i=0; i<list.length; i++) {\n\t\tif(list[i].length)\n\t\t\tnormal.push(Number(list[i]));\n\t  }\n\n\t  if(list.length<3)\n\t\t  return null;\t\t\t\t\t\t\t// invalid normal\n\n\t\treturn normal;\n\t};\n\n\tSTL.prototype.readVertex = function(index) {\n\t\tvar sttPos = this.listVertex[index];\n\t  var endPos = this.findEndPos(sttPos);\t\t// return EOF pos if not found\n\t  var vString = this.bin2String(sttPos, endPos);\n\t  var pos = vString.indexOf(this.TYPE_VERTEX);\n\t  vString = vString.substring(pos+this.TYPE_VERTEX.length+1, vString.length);\n\t  var list = vString.split(\" \");\n\n\t  var vertex = new Array();\n\t  for(var i=0; i<list.length; i++) {\n\t\tif(list[i].length)\n\t\t\tvertex.push(Number(list[i]));\n\t  }\n\t  if(vertex.length!=3)\n\t\t  return null;\t\t\t\t\t\t\t// invalid vertex\n\n\t\treturn vertex;\n\t};\n\n\tSTL.prototype.decode = function() {\n\t\tif(this.dataType.length) {\n\t\t\treturn this.dataType;\n\t\t}\n\n\t\tvar str = this.bin2String(0, 10).toLocaleLowerCase();\n\t\tvar endPos = 0;\n\t\tvar sttPos = 0;\n\n\t\tif(str.indexOf(this.ASCII_TITLE)>=0) {\n\t\t\tthis.dataType = this.TYPE_ASCII;\n\t\t\tthis.listVertex = new Array();\n\t\t\tthis.listNormal = new Array();\n\n\t\t\twhile(endPos < (this.data.length-1)) {\n\t\t\t\tendPos = this.findEndPos(sttPos);\t\t// return EOF pos if not found\n\t\t\t\tstr = this.bin2String(sttPos, endPos);\n\n\t\t\t\tif(str.indexOf(this.TYPE_VERTEX)>=0) {\n\t\t\t\t\tthis.listVertex.push(sttPos);\n\t\t\t\t} else if(str.indexOf(this.TYPE_NORMAL)>=0) {\n\t\t\t\t\tthis.listNormal.push(sttPos);\n\t\t\t\t}\n\n\t\t\t\tsttPos = endPos+1;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.dataType = this.TYPE_BINARY;\n\t\t}\n\n\t\treturn this.dataType;\n\t};\n\n\tSTL.prototype.getCSG = function(){\n\n\t\tvar csgPolygons = [];\n\t\tvar numTriangles;\n\n\t\tif (this.dataType==this.TYPE_BINARY){\n\t\t\tthis.pos = HDR_LEN;\n\t\t\tnumTriangles = this.readUInt32();\n\t\t} else {\n\t\t\tthis.pos = 0;\n\t\t\tnumTriangles = this.listVertex.length/3;\n\t\t}\n\n\t\tif (this.dataType==this.TYPE_BINARY) {\n\t\t\tfor (i=0; i<numTriangles; i++) {\n\n\t\t\t\tvar csgVertices = [];\n\n\t\t\t\tvar normal = [0,0,0];\n\t\t\t\tfor(var j=0; j<3; j++) {\n\t\t\t\t\tnormal[j] = this.readReal32();\n\t\t\t\t}\n\n\t\t\t\tvar csgNormal = new CSG.Vector3D(normal);\n\t\t\t\tvar csgPlane = new CSG.Plane(csgNormal, 1);\n\n\t\t\t\tfor(var j=0; j<3; j++) {\n\t\t\t\t\tvar x = this.readReal32();\n\t\t\t\t\tvar y = this.readReal32();\n\t\t\t\t\tvar z = this.readReal32();\n\t\t\t\t\tcsgVertices.push(new CSG.Vertex(new CSG.Vector3D(x,y,z)));\n\t\t\t\t}\n\n\t\t\t\tthis.pos += 2;\n\n\t\t\t\tcsgPolygons.push(new CSG.Polygon(csgVertices, null, csgPlane));\n\t\t\t}\n\t\t} else {\n\n\t\t\tfor (i=0; i<numTriangles; i++) {\n\t\t\t\tvar csgVertices = [];\n\t\t\t\tfor(var j=0; j<3; j++) {\n\t\t\t\t\tvar vtx = this.readVertex(i*3+j)\n\t\t\t\t\tcsgVertices.push(new CSG.Vertex(new CSG.Vector3D(vtx)));\n\t\t\t\t}\n\t\t\t\tcsgPolygons.push(new CSG.Polygon(csgVertices, null));\n\t\t\t}\n\n\n\n\t\t}\n\n\t\treturn CSG.fromPolygons(csgPolygons);\n\t};\n\n\tSTL.prototype.getCSGString = function(){\n\n\t\tvar csgPolygons = [];\n\t\tvar numTriangles;\n\n\t\tif (this.dataType==this.TYPE_BINARY){\n\t\t\tthis.pos = HDR_LEN;\n\t\t\tnumTriangles = this.readUInt32();\n\t\t} else {\n\t\t\tthis.pos = 0;\n\t\t\tnumTriangles = this.listVertex.length/3;\n\t\t}\n\n\t\tif (this.dataType==this.TYPE_BINARY) {\n\t\t\tfor (i=0; i<numTriangles; i++) {\n\n\t\t\t\tvar csgVertices = [];\n\n\t\t\t\tvar normal = [0,0,0];\n\t\t\t\tfor(var j=0; j<3; j++) {\n\t\t\t\t\tnormal[j] = this.readReal32();\n\t\t\t\t}\n\n\t\t\t\tvar csgPlane = _.template(\"new CSG.Plane(new CSG.Vector3D([<%=normal%>]), 1)\")({normal: normal});\n\n\t\t\t\tfor(var j=0; j<3; j++) {\n\t\t\t\t\tvar x = this.readReal32();\n\t\t\t\t\tvar y = this.readReal32();\n\t\t\t\t\tvar z = this.readReal32();\n\t\t\t\t\tcsgVertices.push(_.template(\"new CSG.Vertex(new CSG.Vector3D([<%=vertex%>]))\")({vertex:[x,y,z]}));\n\t\t\t\t}\n\t\t\t\tthis.pos += 2;\n\n\t\t\t\tcsgPolygons.push(_.template(\"new CSG.Polygon([<%=vertices%>], null)\")({vertices:csgVertices}));\n\t\t\t}\n\t\t} else {\n\n\t\t\tfor (i=0; i<numTriangles; i++) {\n\t\t\t\tvar csgVertices = [];\n\t\t\t\tfor(var j=0; j<3; j++) {\n\t\t\t\t\tvar vertex = this.readVertex(i*3+j)\n\t\t\t\t\tcsgVertices.push(_.template(\"new CSG.Vertex(new CSG.Vector3D([<%=vertex%>]))\")({vertex:vertex}));\n\t\t\t\t}\n\t\t\t\tcsgPolygons.push(_.template(\"new CSG.Polygon([<%=vertices%>], null)\")({vertices:csgVertices}));\n\t\t\t}\n\n\t\t}\n\n\t\treturn _.template(\"CSG.fromPolygons([<%=polygons%>])\")({polygons:csgPolygons});\n\t};\n\n\tSTL.prototype.drawWireFrame = function(context,\t\t// [in] canvas context\n\t\t\t\t\t\t\t\t\t\t   w, \t\t\t// [in] canvas width\n\t\t\t\t\t\t\t\t\t\t   h, \t\t\t// [in] canvas height\n\t\t\t\t\t\t\t\t\t\t   mag,\t\t\t// [in] magnification\n\t\t\t\t\t\t\t\t\t\t   rX,\n\t\t\t\t\t\t\t\t\t\t   rY,\n\t\t\t\t\t\t\t\t\t\t   rZ) {\n\t\tvar numTriangles;\n\t\tvar i;\n\n\t\tif (this.dataType==this.TYPE_BINARY){\n\t\t\tthis.pos = HDR_LEN;\n\t\t\tnumTriangles = this.readUInt32();\n\t\t} else {\n\t\t\tnumTriangles = this.listVertex.length/3;\n\t\t}\n\n\t\tif (this.dataType==this.TYPE_BINARY) {\n\t\t\tfor (i=0; i<numTriangles; i++) {\n\t\t\t\t// retrieve normal\n\t\t\t\tvar normal = [0,0,0];\n\t\t\t\tfor(var j=0; j<3; j++) {\n\t\t\t\t\tnormal[j] = this.readReal32();\n\t\t\t\t}\n\n\t\t\t\tthis.drawTriangles(context, w, h, mag, rX, rY, rZ);\n\n\t\t\t\t//var attr = this.readUInt16();\t\t\t\t// retrieve attribute\n\t\t\t\tthis.pos += 2;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i=0; i<numTriangles; i++) {\n\t\t\t\tthis.triangleIndex = i;\n\t\t\t\tthis.drawTriangles(context, w, h, mag, rX, rY, rZ);\n\t\t\t}\n\t\t}\n\t};\n\n\tSTL.prototype.drawTriangles = function(context,\t\t// [in] canvas context\n\t\t\t\t\t\t\t\t\t\t\tw, \t\t// [in] canvas width\n\t\t\t\t\t\t\t\t\t\t\th, \t\t// [in] canvas height\n\t\t\t\t\t\t\t\t\t\t\tmag,\t\t// [in] magnification\n\t\t\t\t\t\t\t\t\t\t\trX,\t\t// [in] amount of rotation X\n\t\t\t\t\t\t\t\t\t\t\trY,\t\t// [in] amount of rotation Y\n\t\t\t\t\t\t\t\t\t\t\trZ){\t\t// [in] amount of rotation Z\n\n\t\tvar vtx0 = [0,0,0];\n\t\tvar vtx1 = [0,0,0];\n\t\tvar offX = w/2;\n\t\tvar offY = h/2;\n\t\tcontext.beginPath();\n\n\t\t// convert rotation from degrees to radian\n\t\tvar radX = Math.PI / 180.0 * rX;\n\t\tvar radY = Math.PI / 180.0 * rY;\n\t\tvar radZ = Math.PI / 180.0 * rZ;\n\n\t\tfor(var j=0; j<3; j++) {\n\n\t\t\tif (this.dataType==this.TYPE_ASCII){\n\t\t\t\tvtx1 = this.readVertex(this.triangleIndex*3+j)\n\t\t\t} else {\n\t\t\t\tvtx1[0] = this.readReal32();\n\t\t\t\tvtx1[1] = this.readReal32();\n\t\t\t\tvtx1[2] = this.readReal32();\n\t\t\t}\n\n\t\t\t//vtx1[0] = vtx1[0];\n\t\t\tvar y = vtx1[1];\n\t\t\tvar z = vtx1[2];\n\t\t\tvtx1[1] = Math.cos(radX)*y-Math.sin(radX)*z;\n\t\t\tvtx1[2] = Math.sin(radX)*y+Math.cos(radX)*z\n\n\t\t\tvar x = vtx1[0];\n\t\t\tz = vtx1[2];\n\t\t\tvtx1[0] = Math.cos(radY)*x+Math.sin(radY)*z;\n\t\t\t//vtx1[1] = vtx1[1];\n\t\t\tvtx1[2] = -Math.sin(radY)*x+Math.cos(radY)*z;\n\n\t\t\t// draw 2 lengths of a triangle\n\t\t\tif (j==0) {\n\t\t\t\tcontext.moveTo(vtx1[0]*mag+ offX, vtx1[1]*mag+ offY);\t\t      // move to 1st triangle corner\n\t\t\t\tvtx0[0] = vtx1[0];\n\t\t\t\tvtx0[1] = vtx1[1];\n\t\t\t\tvtx0[2] = vtx1[2];\n\t\t\t} else {\n\t\t\t\tcontext.lineTo(vtx1[0]*mag+ offX, vtx1[1]*mag+ offY);\n\t\t\t}\n\n\t\t}\n\t\t// complete triangle\n\t\tcontext.lineTo(vtx0[0]*mag+ offX, vtx0[1]*mag+ offY);\n\t\t// render on canvase\n\t\tcontext.stroke();\n\t\tcontext.closePath();\n\t};\n\n\tmodule.exports =  STL\n\n},{}],118:[function(require,module,exports){\nvar _ = require('lodash')\nvar Context = require('./Context')\nvar Globals = require('./Globals')\n\nfunction TransformModule (factory) {\n  var factory = factory\n\n  this.transformChildren = function (children, context, cb) {\n    var childModules = []\n\n    for (var i = 0; i < children.length; i++) {\n      var childInst = children[i]\n      childInst.argvalues = []\n\n      _.each(childInst.argexpr, function (expr, index, list) {\n        childInst.argvalues.push(expr.evaluate(context))\n      })\n      var childAdaptor = factory.getAdaptor(childInst)\n      var transformedChild = childAdaptor.evaluate(context, childInst)\n      if (transformedChild) {\n        transformedChild += cb()\n        childModules.push(transformedChild)\n      }\n    }\n\n    if (childModules.length == 1) {\n      return childModules[0]\n    } else if (childModules.length > 1) {\n      return _.first(childModules) + '.union([' + _.tail(childModules) + '])'\n    }\n  }\n}\n\nfunction ColorTransform (a) {\n  TransformModule.call(this, a)\n}\n\nColorTransform.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, ['c', 'alpha'], [], inst)\n\n  var c = Context.contextVariableLookup(context, 'c', undefined)\n  var color = 'white'\n  if (c !== undefined) {\n    color = _.isString(c) ? colorNameLookup[Globals.stripString(c.toLowerCase())] : c\n  }\n\n  var alpha = Context.contextVariableLookup(context, 'alpha', undefined)\n  if (alpha !== undefined) {\n    color[3] = alpha\n  }\n\n  return this.transformChildren(inst.children, context, function () {\n    return _.template('.setColor(<%=color%>)')({color: color})\n  })\n}\n\nfunction MirrorTransform (a) {\n  TransformModule.call(this, a)\n}\n\nMirrorTransform.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, ['v'], [], inst)\n\n  var v = Context.contextVariableLookup(context, 'v', [0, 0, 0])\n\n  if (!(v instanceof Array)) {\n    var val = v\n    v = [val, val, val]\n  }\n\n  return this.transformChildren(inst.children, context, function () {\n    return _.template('.mirrored(CSG.Plane.fromNormalAndPoint([<%=v%>], [0,0,0]))')({v: v})\n  })\n}\n\nfunction RotateTransform (a) {\n  TransformModule.call(this, a)\n}\n\nRotateTransform.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, ['a', 'v'], [], inst)\n\n  var a = Context.contextVariableLookup(context, 'a', undefined)\n\n  if (_.isArray(a)) {\n    return this.transformChildren(inst.children, context, function () {\n      return _.template('.rotateX(<%=degreeX%>).rotateY(<%=degreeY%>).rotateZ(<%=degreeZ%>)')\n      ({degreeX: a[0],degreeY: a[1],degreeZ: a[2]})\n    })\n  } else {\n    var v = Context.contextVariableLookup(context, 'v', undefined)\n    return this.transformChildren(inst.children, context, function () {\n      if (v === undefined || v.toString() == '0,0,0') {\n        v = [0, 0, 1]\n      }\n      return _.template('.transform(CSG.Matrix4x4.rotation([0,0,0], [<%=vector%>], <%=degree%>))')({degree: a, vector: v})\n    })\n  }\n}\n\nfunction ScaleTransform (a) {\n  TransformModule.call(this, a)\n}\n\nScaleTransform.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, ['v'], [], inst)\n\n  var v = Context.contextVariableLookup(context, 'v', [0, 0, 0])\n\n  if (!(v instanceof Array)) {\n    var val = v\n    v = [val, val, val]\n  }\n\n  return this.transformChildren(inst.children, context, function () {\n    return _.template('.scale([<%=v%>])')({v: v})\n  })\n}\n\nfunction TranslateTransform (a) {\n  TransformModule.call(this, a)\n}\n\nTranslateTransform.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, ['v'], [], inst)\n\n  var v = Context.contextVariableLookup(context, 'v', [0, 0, 0])\n\n  return this.transformChildren(inst.children, context, function () {\n    return _.template('.translate([<%=v%>])')({v: v})\n  })\n}\n\nfunction RenderModule (a) {\n  TransformModule.call(this, a)\n}\n\nRenderModule.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, [], [], inst)\n\n  var childIndex = 0\n  if (inst.argvalues[0] !== undefined) {\n    childIndex = inst.argvalues[0]\n  }\n\n  return this.transformChildren(inst.children, context, function () {\n    return ''\n  })\n}\n\nfunction MultimatrixTransform (a) {\n  TransformModule.call(this, a)\n\n  this.transposeMatrix = function (m) {\n    var t = []\n    var ti = 0\n\n    for (var j in _.range(4)) {\n      for (var i in _.range(4)) {\n        t[ti++] = m[i][j]\n      }\n    }\n    return t\n  }\n}\n\nMultimatrixTransform.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, ['m'], [], inst)\n\n  var m = Context.contextVariableLookup(context, 'm', undefined)\n\n  var matrix\n  if (m !== undefined) {\n    matrix = this.transposeMatrix(m)\n  }\n\n  return this.transformChildren(inst.children, context, function () {\n    return _.template('.transform(new CSG.Matrix4x4( [<%= matrix %>] ))')({matrix: matrix})\n  })\n}\n\nfunction ExtrudeTransform (a) {\n  TransformModule.call(this, a)\n}\n\nExtrudeTransform.prototype.evaluate = function (parentContext, inst) {\n  inst.argvalues = []\n\n  _.each(inst.argexpr, function (expr, index, list) {\n    inst.argvalues.push(expr.evaluate(parentContext))\n  })\n\n  var context = Context.newContext(parentContext, ['file', 'layer', 'height', 'origin', 'scale', 'center', 'twist', 'slices', '$fn', '$fs', '$fa'], [], inst)\n\n  var height = Context.contextVariableLookup(context, 'height', 100)\n  var center = Context.contextVariableLookup(context, 'center', false)\n  var twist = Number(Context.contextVariableLookup(context, 'twist', 0)) / -1 // note inverse for openjscad\n  var slices = Context.contextVariableLookup(context, 'slices', undefined)\n  var fn = Context.contextVariableLookup(context, '$fn', Globals.FN_DEFAULT)\n  var fs = Context.contextVariableLookup(context, '$fs', Globals.FS_DEFAULT)\n  var fa = Context.contextVariableLookup(context, '$fa', Globals.FA_DEFAULT)\n\n  if (slices === undefined) {\n    slices = parseInt(Math.max(2, Math.abs(Context.get_fragments_from_r(height, context) * twist / 360)))\n  }\n\n  return this.transformChildren(inst.children, context, function () {\n    var template = _.template('.extrude({offset: [0, 0, <%=height%>], twistangle: <%=twist%>,twiststeps: <%=slices%>})')\n      ({height: height, twist: twist, slices: slices})\n    if (center) {\n      var offset = -height / 2\n      template += _.template('.translate([0,0,<%=offset%>])')({offset: offset})\n    }\n    return template\n  })\n}\n\nvar colorNameLookup = {'indianred': [0.804, 0.361, 0.361], 'lightcoral': [0.941, 0.502, 0.502], 'salmon': [0.980, 0.502, 0.447], 'darksalmon': [0.914, 0.588, 0.478], 'lightsalmon': [1, 0.627, 0.478], 'red': [1, 0, 0], 'crimson': [0.863, 0.078, 0.235], 'firebrick': [0.698, 0.133, 0.133], 'darkred': [0.545, 0, 0], 'pink': [1, 0.753, 0.796], 'lightpink': [1, 0.714, 0.757], 'hotpink': [1, 0.412, 0.706], 'deeppink': [1, 0.078, 0.576], 'mediumvioletred': [0.780, 0.082, 0.522], 'palevioletred': [0.859, 0.439, 0.576], 'lightsalmon': [1, 0.627, 0.478], 'coral': [1, 0.498, 0.314], 'tomato': [1, 0.388, 0.278], 'orangered': [1, 0.271, 0], 'darkorange': [1, 0.549, 0], 'orange': [1, 0.647, 0], 'gold': [1, 0.843, 0], 'yellow': [1, 1, 0], 'lightyellow': [1, 1, 0.878], 'lemonchiffon': [1, 0.980, 0.804], 'lightgoldenrodyellow': [0.980, 0.980, 0.824], 'papayawhip': [1, 0.937, 0.835], 'moccasin': [1, 0.894, 0.710], 'peachpuff': [1, 0.855, 0.725], 'palegoldenrod': [0.933, 0.910, 0.667], 'khaki': [0.941, 0.902, 0.549], 'darkkhaki': [0.741, 0.718, 0.420], 'lavender': [0.902, 0.902, 0.980], 'thistle': [0.847, 0.749, 0.847], 'plum': [0.867, 0.627, 0.867], 'violet': [0.933, 0.510, 0.933], 'orchid': [0.855, 0.439, 0.839], 'fuchsia': [1, 0, 1], 'magenta': [1, 0, 1], 'mediumorchid': [0.729, 0.333, 0.827], 'mediumpurple': [0.576, 0.439, 0.859], 'blueviolet': [0.541, 0.169, 0.886], 'darkviolet': [0.580, 0, 0.827], 'darkorchid': [0.600, 0.196, 0.800], 'darkmagenta': [0.545, 0, 0.545], 'purple': [0.502, 0, 0.502], 'indigo': [0.294, 0, 0.510], 'darkslateblue': [0.282, 0.239, 0.545], 'slateblue': [0.416, 0.353, 0.804], 'mediumslateblue': [0.482, 0.408, 0.933], 'greenyellow': [0.678, 1, 0.184], 'chartreuse': [0.498, 1, 0], 'lawngreen': [0.486, 0.988, 0], 'lime': [0, 1, 0], 'limegreen': [0.196, 0.804, 0.196], 'palegreen': [0.596, 0.984, 0.596], 'lightgreen': [0.565, 0.933, 0.565], 'mediumspringgreen': [0, 0.980, 0.604], 'springgreen': [0, 1, 0.498], 'mediumseagreen': [0.235, 0.702, 0.443], 'seagreen': [0.180, 0.545, 0.341], 'forestgreen': [0.133, 0.545, 0.133], 'green': [0, 0.502, 0], 'darkgreen': [0, 0.392, 0], 'yellowgreen': [0.604, 0.804, 0.196], 'olivedrab': [0.420, 0.557, 0.137], 'olive': [0.502, 0.502, 0], 'darkolivegreen': [0.333, 0.420, 0.184], 'mediumaquamarine': [0.400, 0.804, 0.667], 'darkseagreen': [0.561, 0.737, 0.561], 'lightseagreen': [0.125, 0.698, 0.667], 'darkcyan': [0, 0.545, 0.545], 'teal': [0, 0.502, 0.502], 'aqua': [0, 1, 1], 'cyan': [0, 1, 1], 'lightcyan': [0.878, 1, 1], 'paleturquoise': [0.686, 0.933, 0.933], 'aquamarine': [0.498, 1, 0.831], 'turquoise': [0.251, 0.878, 0.816], 'mediumturquoise': [0.282, 0.820, 0.800], 'darkturquoise': [0, 0.808, 0.820], 'cadetblue': [0.373, 0.620, 0.627], 'steelblue': [0.275, 0.510, 0.706], 'lightsteelblue': [0.690, 0.769, 0.871], 'powderblue': [0.690, 0.878, 0.902], 'lightblue': [0.678, 0.847, 0.902], 'skyblue': [0.529, 0.808, 0.922], 'lightskyblue': [0.529, 0.808, 0.980], 'deepskyblue': [0, 0.749, 1], 'dodgerblue': [0.118, 0.565, 1], 'cornflowerblue': [0.392, 0.584, 0.929], 'royalblue': [0.255, 0.412, 0.882], 'blue': [0, 0, 1], 'mediumblue': [0, 0, 0.804], 'darkblue': [0, 0, 0.545], 'navy': [0, 0, 0.502], 'midnightblue': [0.098, 0.098, 0.439], 'cornsilk': [1, 0.973, 0.863], 'blanchedalmond': [1, 0.922, 0.804], 'bisque': [1, 0.894, 0.769], 'navajowhite': [1, 0.871, 0.678], 'wheat': [0.961, 0.871, 0.702], 'burlywood': [0.871, 0.722, 0.529], 'tan': [0.824, 0.706, 0.549], 'rosybrown': [0.737, 0.561, 0.561], 'sandybrown': [0.957, 0.643, 0.376], 'goldenrod': [0.855, 0.647, 0.125], 'darkgoldenrod': [0.722, 0.525, 0.043], 'peru': [0.804, 0.522, 0.247], 'chocolate': [0.824, 0.412, 0.118], 'saddlebrown': [0.545, 0.271, 0.075], 'sienna': [0.627, 0.322, 0.176], 'brown': [0.647, 0.165, 0.165], 'maroon': [0.502, 0, 0], 'white': [1, 1, 1], 'snow': [1, 0.980, 0.980], 'honeydew': [0.941, 1, 0.941], 'mintcream': [0.961, 1, 0.980], 'azure': [0.941, 1, 1], 'aliceblue': [0.941, 0.973, 1], 'ghostwhite': [0.973, 0.973, 1], 'whitesmoke': [0.961, 0.961, 0.961], 'seashell': [1, 0.961, 0.933], 'beige': [0.961, 0.961, 0.863], 'oldlace': [0.992, 0.961, 0.902], 'floralwhite': [1, 0.980, 0.941], 'ivory': [1, 1, 0.941], 'antiquewhite': [0.980, 0.922, 0.843], 'linen': [0.980, 0.941, 0.902], 'lavenderblush': [1, 0.941, 0.961], 'mistyrose': [1, 0.894, 0.882], 'gainsboro': [0.863, 0.863, 0.863], 'lightgrey': [0.827, 0.827, 0.827], 'silver': [0.753, 0.753, 0.753], 'darkgray': [0.663, 0.663, 0.663], 'gray': [0.502, 0.502, 0.502], 'dimgray': [0.412, 0.412, 0.412], 'lightslategray': [0.467, 0.533, 0.600], 'slategray': [0.439, 0.502, 0.565], 'darkslategray': [0.184, 0.310, 0.310], 'black': [0, 0, 0]}\n\nmodule.exports = {\n  Translate: TranslateTransform,\n  Scale: ScaleTransform,\n  Rotate: RotateTransform,\n  Mirror: MirrorTransform,\n  Color: ColorTransform,\n  Render: RenderModule,\n  Multimatrix: MultimatrixTransform,\n  Extrude: ExtrudeTransform\n}\n\n},{\"./Context\":103,\"./Globals\":107,\"lodash\":164}],119:[function(require,module,exports){\nvar _ = require('lodash')\nvar Module = require('./Module')\nvar Context = require('./Context')\nvar Globals = require('./Globals')\nvar FunctionDef = require('./FunctionDef')\nvar support = require('./openscad-parser-support')\n\nvar currmodule = new Module(\"root\");\n\nfunction resetModule() {\n    currmodule = new Module(\"root\");\n    Globals.context_stack = [];\n    Globals.module_stack = [];\n}\n\nfunction processModule(yy){\n    var lines = [];\n    lines.push(\"function main(){\");\n    lines.push(\"\\n\");\n\n    var context = undefined;\n    if (yy.context !== undefined){\n        context = yy.context;\n    } else {\n        context = new Context();\n    }\n\n    if (yy.importCache !== undefined){\n        context.setVariable(\"importCache\", yy.importCache);\n    }\n\n    var res = currmodule.evaluate(context);\n\n    var evaluatedLines = _.flatten(res);\n    if (evaluatedLines.length == 1){\n        lines.push(\"return \"+evaluatedLines[0] + ';');\n    } else if (evaluatedLines.length > 1){\n        lines.push(\"return \"+_.first(evaluatedLines)+\".union([\");\n        lines.push(_.tail(evaluatedLines));\n        lines.push(\"]);\");\n    }\n    lines.push(\"};\");\n\n    var x = {lines:lines, context:Globals.context_stack[Globals.context_stack.length-1]};\n    resetModule();\n\n    return x;\n}\n\nfunction stashModule(newName, newArgNames, newArgExpr){\n\n    var p_currmodule = currmodule;\n    Globals.module_stack.push(currmodule);\n\n    currmodule = new Module(newName);\n\n    p_currmodule.modules.push(currmodule);\n\n    currmodule.argnames = newArgNames;\n    currmodule.argexpr = newArgExpr;\n}\n\nfunction popModule(){\n    if (Globals.module_stack.length > 0){\n        currmodule = Globals.module_stack.pop();\n    }\n}\n\nfunction addModuleChild(child){\n    currmodule.children.push(child);\n}\n\nfunction addModuleAssignmentVar(name, value){\n    currmodule.assignments_var[name] = value;\n}\n\nfunction addModuleFunction(name, expr, argnames, argexpr){\n    var func = new FunctionDef();\n    func.argnames = argnames;\n    func.argexpr = argexpr;\n    func.expr = expr;\n    currmodule.functions[name] = func;\n}\n\n\nmodule.exports = {\n   processModule: processModule,\n   stashModule: stashModule,\n   popModule: popModule,\n   addModuleChild: addModuleChild,\n   addModuleAssignmentVar: addModuleAssignmentVar,\n   addModuleFunction: addModuleFunction\n}\n\n},{\"./Context\":103,\"./FunctionDef\":106,\"./Globals\":107,\"./Module\":110,\"./openscad-parser-support\":120,\"lodash\":164}],120:[function(require,module,exports){\n\n// seedrandom.js version 2.0.\n// Author: David Bau 4/2/2011\n//\n// Defines a method Math.seedrandom() that, when called, substitutes\n// an explicitly seeded RC4-based algorithm for Math.random().  Also\n// supports automatic seeding from local or network sources of entropy.\n//\n// Usage:\n//\n//   <script src=http://davidbau.com/encode/seedrandom-min.js></script>\n//\n//   Math.seedrandom('yipee'); Sets Math.random to a function that is\n//                             initialized using the given explicit seed.\n//\n//   Math.seedrandom();        Sets Math.random to a function that is\n//                             seeded using the current time, dom state,\n//                             and other accumulated local entropy.\n//                             The generated seed string is returned.\n//\n//   Math.seedrandom('yowza', true);\n//                             Seeds using the given explicit seed mixed\n//                             together with accumulated entropy.\n//\n//   <script src=\"http://bit.ly/srandom-512\"></script>\n//                             Seeds using physical random bits downloaded\n//                             from random.org.\n//\n//   <script src=\"https://jsonlib.appspot.com/urandom?callback=Math.seedrandom\">\n//   </script>                 Seeds using urandom bits from call.jsonlib.com,\n//                             which is faster than random.org.\n//\n// Examples:\n//\n//   Math.seedrandom(\"hello\");            // Use \"hello\" as the seed.\n//   document.write(Math.random());       // Always 0.5463663768140734\n//   document.write(Math.random());       // Always 0.43973793770592234\n//   var rng1 = Math.random;              // Remember the current prng.\n//\n//   var autoseed = Math.seedrandom();    // New prng with an automatic seed.\n//   document.write(Math.random());       // Pretty much unpredictable.\n//\n//   Math.random = rng1;                  // Continue \"hello\" prng sequence.\n//   document.write(Math.random());       // Always 0.554769432473455\n//\n//   Math.seedrandom(autoseed);           // Restart at the previous seed.\n//   document.write(Math.random());       // Repeat the 'unpredictable' value.\n//\n// Notes:\n//\n// Each time seedrandom('arg') is called, entropy from the passed seed\n// is accumulated in a pool to help generate future seeds for the\n// zero-argument form of Math.seedrandom, so entropy can be injected over\n// time by calling seedrandom with explicit data repeatedly.\n//\n// On speed - This javascript implementation of Math.random() is about\n// 3-10x slower than the built-in Math.random() because it is not native\n// code, but this is typically fast enough anyway.  Seeding is more expensive,\n// especially if you use auto-seeding.  Some details (timings on Chrome 4):\n//\n// Our Math.random()            - avg less than 0.002 milliseconds per call\n// seedrandom('explicit')       - avg less than 0.5 milliseconds per call\n// seedrandom('explicit', true) - avg less than 2 milliseconds per call\n// seedrandom()                 - avg about 38 milliseconds per call\n//\n// LICENSE (BSD):\n//\n// Copyright 2010 David Bau, all rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n// \n//   1. Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n// \n//   3. Neither the name of this module nor the names of its contributors may\n//      be used to endorse or promote products derived from this software\n//      without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n/**\n * All code is in an anonymous closure to keep the global namespace clean.\n *\n * @param {number=} overflow \n * @param {number=} startdenom\n */\n(function (pool, math, width, chunks, significance, overflow, startdenom) {\n\n\n//\n// seedrandom()\n// This is the seedrandom function described above.\n//\nmath['seedrandom'] = function seedrandom(seed, use_entropy) {\n  var key = [];\n  var arc4;\n\n  // Flatten the seed string or build one from local entropy if needed.\n  seed = mixkey(flatten(\n    use_entropy ? [seed, pool] :\n    arguments.length ? seed :\n    [new Date().getTime(), pool, window], 3), key);\n\n  // Use the seed to initialize an ARC4 generator.\n  arc4 = new ARC4(key);\n\n  // Mix the randomness into accumulated entropy.\n  mixkey(arc4.S, pool);\n\n  // Override Math.random\n\n  // This function returns a random double in [0, 1) that contains\n  // randomness in every bit of the mantissa of the IEEE 754 value.\n\n  math['random'] = function random() {  // Closure to return a random double:\n    var n = arc4.g(chunks);             // Start with a numerator n < 2 ^ 48\n    var d = startdenom;                 //   and denominator d = 2 ^ 48.\n    var x = 0;                          //   and no 'extra last byte'.\n    while (n < significance) {          // Fill up all significant digits by\n      n = (n + x) * width;              //   shifting numerator and\n      d *= width;                       //   denominator and generating a\n      x = arc4.g(1);                    //   new least-significant-byte.\n    }\n    while (n >= overflow) {             // To avoid rounding up, before adding\n      n /= 2;                           //   last byte, shift everything\n      d /= 2;                           //   right using integer math until\n      x >>>= 1;                         //   we have exactly the desired bits.\n    }\n    return (n + x) / d;                 // Form the number within [0, 1).\n  };\n\n  // Return the seed that was used\n  return seed;\n};\n\n//\n// ARC4\n//\n// An ARC4 implementation.  The constructor takes a key in the form of\n// an array of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates\n// the next (count) outputs from ARC4.  Its return value is a number x\n// that is in the range 0 <= x < (width ^ count).\n//\n/** @constructor */\nfunction ARC4(key) {\n  var t, u, me = this, keylen = key.length;\n  var i = 0, j = me.i = me.j = me.m = 0;\n  me.S = [];\n  me.c = [];\n\n  // The empty key [] is treated as [0].\n  if (!keylen) { key = [keylen++]; }\n\n  // Set up S using the standard key scheduling algorithm.\n  while (i < width) { me.S[i] = i++; }\n  for (i = 0; i < width; i++) {\n    t = me.S[i];\n    j = lowbits(j + t + key[i % keylen]);\n    u = me.S[j];\n    me.S[i] = u;\n    me.S[j] = t;\n  }\n\n  // The \"g\" method returns the next (count) outputs as one number.\n  me.g = function getnext(count) {\n    var s = me.S;\n    var i = lowbits(me.i + 1); var t = s[i];\n    var j = lowbits(me.j + t); var u = s[j];\n    s[i] = u;\n    s[j] = t;\n    var r = s[lowbits(t + u)];\n    while (--count) {\n      i = lowbits(i + 1); t = s[i];\n      j = lowbits(j + t); u = s[j];\n      s[i] = u;\n      s[j] = t;\n      r = r * width + s[lowbits(t + u)];\n    }\n    me.i = i;\n    me.j = j;\n    return r;\n  };\n  // For robust unpredictability discard an initial batch of values.\n  // See http://www.rsa.com/rsalabs/node.asp?id=2009\n  me.g(width);\n}\n\n//\n// flatten()\n// Converts an object tree to nested arrays of strings.\n//\n/** @param {Object=} result \n  * @param {string=} prop\n  * @param {string=} typ */\nfunction flatten(obj, depth, result, prop, typ) {\n  result = [];\n  typ = typeof(obj);\n  if (depth && typ == 'object') {\n    for (prop in obj) {\n      if (prop.indexOf('S') < 5) {    // Avoid FF3 bug (local/sessionStorage)\n        try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\n      }\n    }\n  }\n  return (result.length ? result : obj + (typ != 'string' ? '\\0' : ''));\n}\n\n//\n// mixkey()\n// Mixes a string seed into a key that is an array of integers, and\n// returns a shortened string seed that is equivalent to the result key.\n//\n/** @param {number=} smear \n  * @param {number=} j */\nfunction mixkey(seed, key, smear, j) {\n  seed += '';                         // Ensure the seed is a string\n  smear = 0;\n  for (j = 0; j < seed.length; j++) {\n    key[lowbits(j)] =\n      lowbits((smear ^= key[lowbits(j)] * 19) + seed.charCodeAt(j));\n  }\n  seed = '';\n  for (j in key) { seed += String.fromCharCode(key[j]); }\n  return seed;\n}\n\n//\n// lowbits()\n// A quick \"n mod width\" for width a power of 2.\n//\nfunction lowbits(n) { return n & (width - 1); }\n\n//\n// The following constants are related to IEEE 754 limits.\n//\nstartdenom = math.pow(width, chunks);\nsignificance = math.pow(2, significance);\noverflow = significance * 2;\n\n//\n// When seedrandom.js is loaded, we immediately mix a few bits\n// from the built-in RNG into the entropy pool.  Because we do\n// not want to intefere with determinstic PRNG state later,\n// seedrandom will not call math.random on its own again after\n// initialization.\n//\nmixkey(math.random(), pool);\n\n// End anonymous scope, and pass initial values.\n})(\n  [],   // pool: entropy pool starts empty\n  Math, // math: package containing random, pow, and seedrandom\n  256,  // width: each RC4 output is 0 <= x < 256\n  6,    // chunks: at least six RC4 outputs for each double\n  52    // significance: there are 52 significant digits in a double\n);\n\n},{}],121:[function(require,module,exports){\n(function (process){\nconst ext = require('./openscad-parser-ext')\nconst ArgContainer = require('./ArgContainer')\nconst ArgsContainer = require('./ArgsContainer')\nconst Expression = require('./Expression')\nconst ModuleInstantiation = require('./ModuleInstantiation')\nconst IfElseModuleInstantiation = require('./IfElseModuleInstantiation')\n/* parser generated by jison 0.4.17 */\n/*\n  Returns a Parser object of the following structure:\n\n  Parser: {\n    yy: {}\n  }\n\n  Parser.prototype: {\n    yy: {},\n    trace: function(),\n    symbols_: {associative list: name ==> number},\n    terminals_: {associative list: number ==> name},\n    productions_: [...],\n    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n    table: [...],\n    defaultActions: {...},\n    parseError: function(str, hash),\n    parse: function(input),\n\n    lexer: {\n        EOF: 1,\n        parseError: function(str, hash),\n        setInput: function(input),\n        input: function(),\n        unput: function(str),\n        more: function(),\n        less: function(n),\n        pastInput: function(),\n        upcomingInput: function(),\n        showPosition: function(),\n        test_match: function(regex_match_array, rule_index),\n        next: function(),\n        lex: function(),\n        begin: function(condition),\n        popState: function(),\n        _currentRules: function(),\n        topState: function(),\n        pushState: function(condition),\n\n        options: {\n            ranges: boolean           (optional: true ==> token location info will include a .range[] member)\n            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n        },\n\n        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n        rules: [...],\n        conditions: {associative list: name ==> set},\n    }\n  }\n\n\n  token location info (@$, _$, etc.): {\n    first_line: n,\n    last_line: n,\n    first_column: n,\n    last_column: n,\n    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)\n  }\n\n\n  the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n    text:        (matched text)\n    token:       (the produced terminal token, if any)\n    line:        (yylineno)\n  }\n  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n    loc:         (yylloc)\n    expected:    (string describing the set of expected tokens)\n    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n  }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,9,10,15,16,21,22,26,31,32,33,34],$V1=[10,15,16,21,22,26,31,32,33,34],$V2=[2,7],$V3=[1,5],$V4=[1,20],$V5=[1,15],$V6=[1,16],$V7=[1,17],$V8=[1,18],$V9=[1,9,10,15,16,17,21,22,26,31,32,33,34],$Va=[9,10,15,16,17,21,22,26,31,32,33,34],$Vb=[1,24],$Vc=[1,30],$Vd=[1,29],$Ve=[1,9,10,15,16,17,21,22,26,28,31,32,33,34],$Vf=[1,44],$Vg=[1,51],$Vh=[1,50],$Vi=[1,41],$Vj=[1,42],$Vk=[1,43],$Vl=[1,45],$Vm=[1,46],$Vn=[1,47],$Vo=[1,48],$Vp=[1,49],$Vq=[14,57],$Vr=[2,70],$Vs=[1,55],$Vt=[10,17,26,31,32,33,34],$Vu=[10,15,16,26,31,32,33,34],$Vv=[2,65],$Vw=[1,62],$Vx=[1,67],$Vy=[1,65],$Vz=[1,64],$VA=[1,79],$VB=[1,66],$VC=[1,68],$VD=[1,69],$VE=[1,70],$VF=[1,71],$VG=[1,72],$VH=[1,73],$VI=[1,74],$VJ=[1,75],$VK=[1,76],$VL=[1,77],$VM=[1,78],$VN=[14,15,33,34,38,41,42,43,45,46,47,48,49,50,51,52,53,54,55,56,57],$VO=[2,33],$VP=[1,80],$VQ=[2,62],$VR=[1,84],$VS=[1,90],$VT=[1,97],$VU=[43,57],$VV=[10,11,14,31,35,36,37,39,40,41,43,46,47],$VW=[14,15,42,43,46,47,48,49,50,51,52,53,54,55,56,57],$VX=[14,15,33,34,42,43,45,46,47,48,49,50,51,52,53,54,55,56,57],$VY=[14,15,42,43,48,49,52,53,54,55,56,57],$VZ=[14,15,42,43,48,49,50,51,52,53,54,55,56,57],$V_=[2,61];\nvar parser = {trace: function trace() { },\nyy: {},\nsymbols_: {\"error\":2,\"program\":3,\"input\":4,\"statement\":5,\"inner_input\":6,\"statement_begin\":7,\"statement_end\":8,\"TOK_MODULE\":9,\"TOK_ID\":10,\"(\":11,\"arguments_decl\":12,\"optional_commas\":13,\")\":14,\";\":15,\"{\":16,\"}\":17,\"module_instantiation\":18,\"=\":19,\"expr\":20,\"TOK_FUNCTION\":21,\"BR\":22,\"children_instantiation\":23,\"module_instantiation_list\":24,\"if_statement\":25,\"TOK_IF\":26,\"ifelse_statement\":27,\"TOK_ELSE\":28,\"single_module_instantiation\":29,\"arguments_call\":30,\"!\":31,\"#\":32,\"%\":33,\"*\":34,\"TOK_TRUE\":35,\"TOK_FALSE\":36,\"TOK_UNDEF\":37,\".\":38,\"TOK_STRING\":39,\"TOK_NUMBER\":40,\"[\":41,\":\":42,\"]\":43,\"vector_expr\":44,\"/\":45,\"+\":46,\"-\":47,\"<\":48,\"LE\":49,\"EQ\":50,\"NE\":51,\"GE\":52,\">\":53,\"AND\":54,\"OR\":55,\"?\":56,\",\":57,\"argument_decl\":58,\"argument_call\":59,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",9:\"TOK_MODULE\",10:\"TOK_ID\",11:\"(\",14:\")\",15:\";\",16:\"{\",17:\"}\",19:\"=\",21:\"TOK_FUNCTION\",22:\"BR\",26:\"TOK_IF\",28:\"TOK_ELSE\",31:\"!\",32:\"#\",33:\"%\",34:\"*\",35:\"TOK_TRUE\",36:\"TOK_FALSE\",37:\"TOK_UNDEF\",38:\".\",39:\"TOK_STRING\",40:\"TOK_NUMBER\",41:\"[\",42:\":\",43:\"]\",45:\"/\",46:\"+\",47:\"-\",48:\"<\",49:\"LE\",50:\"EQ\",51:\"NE\",52:\"GE\",53:\">\",54:\"AND\",55:\"OR\",56:\"?\",57:\",\"},\nproductions_: [0,[3,1],[4,0],[4,2],[6,0],[6,2],[5,2],[7,0],[7,6],[8,1],[8,3],[8,1],[8,4],[8,9],[8,1],[23,1],[23,3],[25,5],[27,1],[27,3],[18,2],[18,2],[18,1],[24,0],[24,2],[29,4],[29,2],[29,2],[29,2],[29,2],[20,1],[20,1],[20,1],[20,1],[20,3],[20,1],[20,1],[20,5],[20,7],[20,3],[20,4],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,3],[20,2],[20,2],[20,2],[20,3],[20,5],[20,4],[20,4],[13,2],[13,0],[44,1],[44,4],[12,0],[12,1],[12,4],[58,1],[58,3],[30,0],[30,1],[30,4],[59,1],[59,3]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n\n            return ext.processModule(yy);\n        \nbreak;\ncase 8:\n\n            ext.stashModule($$[$0-4], $$[$0-2].argnames, $$[$0-2].argexpr);\n            delete $$[$0-2];\n        \nbreak;\ncase 9:\n\n        \nbreak;\ncase 10:\n\n            ext.popModule();\n        \nbreak;\ncase 11:\n\n            ext.addModuleChild($$[$0]);\n        \nbreak;\ncase 12:\n\n            ext.addModuleAssignmentVar($$[$0-3], $$[$0-1]);\n        \nbreak;\ncase 13:\n\n            ext.addModuleFunction($$[$0-7], $$[$0-1], $$[$0-5].argnames, $$[$0-5].argexpr);\n            delete $$[$0-5];\n        \nbreak;\ncase 15:\n\n            this.$ = new ModuleInstantiation();\n            if ($$[$0]) {\n                this.$.children.push($$[$0]);\n            }\n        \nbreak;\ncase 16: case 20:\n\n            this.$ = $$[$0-1];\n        \nbreak;\ncase 17:\n\n            this.$ = new IfElseModuleInstantiation();\n            this.$.argnames.push(\"\");\n            this.$.argexpr.push($$[$0-2]);\n\n            if (this.$) {\n                this.$.children = $$[$0].children;\n            } else {\n                for (var i = 0; i < $$[$0].children.size(); i++)\n                    delete $$[$0].children[i];\n            }\n            delete $$[$0];\n        \nbreak;\ncase 18: case 22: case 54:\n\n            this.$ = $$[$0];\n        \nbreak;\ncase 19:\n\n            this.$ = $$[$0-2];\n            if (this.$) {\n                this.$.else_children = $$[$0].children;\n            } else {\n                for (var i = 0; i < $$[$0].children.size(); i++)\n                    delete $$[$0].children[i];\n            }\n            delete $$[$0];\n        \nbreak;\ncase 21:\n\n            this.$ = $$[$0-1];\n            if (this.$) {\n                this.$.children = $$[$0].children;\n            } else {\n                for (var i = 0; i < $$[$0].children.length; i++)\n                delete $$[$0].children[i];\n            }\n            delete $$[$0];\n        \nbreak;\ncase 23:\n\n            this.$ = new ModuleInstantiation();\n        \nbreak;\ncase 24:\n\n            this.$ = $$[$0-1];\n            if (this.$) {\n                if ($$[$0]) {\n                    this.$.children.push($$[$0]);\n                }\n            } else {\n                delete $$[$0];\n            }\n        \nbreak;\ncase 25:\n\n            this.$ = new ModuleInstantiation();\n            this.$.name = $$[$0-3];\n            this.$.argnames = $$[$0-1].argnames;\n            this.$.argexpr = $$[$0-1].argexpr;\n            delete $$[$0-1];\n        \nbreak;\ncase 26:\n\n            this.$ = $$[$0];\n            if (this.$) {\n                this.$.tag_root = true;\n            }\n        \nbreak;\ncase 27:\n\n            this.$ = $$[$0];\n            if (this.$) {\n                this.$.tag_highlight = true;\n            }\n        \nbreak;\ncase 28:\n\n            /* - NOTE: Currently unimplemented, therefore not displaying parts marked with %\n                this.$ = $$[$0];\n                if (this.$) {\n                    this.$.tag_background = true;\n                }\n            */\n            delete $$[$0];\n            this.$ = undefined;\n        \nbreak;\ncase 29:\n\n            delete $$[$0];\n            this.$ = undefined;\n        \nbreak;\ncase 30:\n\n            this.$ = new Expression(true);\n        \nbreak;\ncase 31:\n\n            this.$ = new Expression(false);\n        \nbreak;\ncase 32:\n\n            this.$ = new Expression(undefined);\n        \nbreak;\ncase 33:\n\n            this.$ = new Expression();\n            this.$.type = \"L\";\n            this.$.var_name = $$[$0];\n        \nbreak;\ncase 34:\n\n            this.$ = new Expression();\n            this.$.type = \"N\";\n            this.$.children.push($$[$0-2]);\n            this.$.var_name = $$[$0];\n        \nbreak;\ncase 35:\n\n            this.$ = new Expression(String($$[$0]));\n        \nbreak;\ncase 36:\n\n            this.$ = new Expression(Number($$[$0]));\n        \nbreak;\ncase 37:\n\n            var e_one = new Expression(1.0);\n            this.$ = new Expression();\n            this.$.type = \"R\";\n            this.$.children.push($$[$0-3]);\n            this.$.children.push(e_one);\n            this.$.children.push($$[$0-1]);\n        \nbreak;\ncase 38:\n\n            this.$ = new Expression();\n            this.$.type = \"R\";\n            this.$.children.push($$[$0-5]);\n            this.$.children.push($$[$0-3]);\n            this.$.children.push($$[$0-1]);\n        \nbreak;\ncase 39:\n\n            this.$ = new Expression([]);\n        \nbreak;\ncase 40:\n\n            this.$ = $$[$0-2];\n        \nbreak;\ncase 41:\n\n            this.$ = new Expression();\n            this.$.type = '*';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 42:\n\n            this.$ = new Expression();\n            this.$.type = '/';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 43:\n\n            this.$ = new Expression();\n            this.$.type = '%';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 44:\n\n            this.$ = new Expression();\n            this.$.type = '+';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 45:\n\n            this.$ = new Expression();\n            this.$.type = '-';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 46:\n\n            this.$ = new Expression();\n            this.$.type = '<';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 47:\n\n            this.$ = new Expression();\n            this.$.type = '<=';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 48:\n\n            this.$ = new Expression();\n            this.$.type = '==';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 49:\n\n            this.$ = new Expression();\n            this.$.type = '!=';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 50:\n\n            this.$ = new Expression();\n            this.$.type = '>=';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 51:\n\n            this.$ = new Expression();\n            this.$.type = '>';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 52:\n\n            this.$ = new Expression();\n            this.$.type = '&&';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 53:\n\n            this.$ = new Expression();\n            this.$.type = '||';\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 55:\n\n            this.$ = new Expression();\n            this.$.type = 'I';\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 56:\n\n            this.$ = new Expression();\n            this.$.type = '!';\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 57:\n this.$ = $$[$0-1]; \nbreak;\ncase 58:\n\n            this.$ = new Expression();\n            this.$.type = '?:';\n            this.$.children.push($$[$0-4]);\n            this.$.children.push($$[$0-2]);\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 59:\n\n            this.$ = new Expression();\n            this.$.type = '[]';\n            this.$.children.push($$[$0-3]);\n            this.$.children.push($$[$0-1]);\n        \nbreak;\ncase 60:\n\n            this.$ = new Expression();\n            this.$.type = 'F';\n            this.$.call_funcname = $$[$0-3];\n            this.$.call_argnames = $$[$0-1].argnames;\n            this.$.children = $$[$0-1].argexpr;\n            delete $$[$0-1];\n        \nbreak;\ncase 63:\n\n            this.$ = new Expression();\n            this.$.type = 'V';\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 64:\n\n            this.$ = $$[$0-3];\n            this.$.children.push($$[$0]);\n        \nbreak;\ncase 65: case 70:\n\n            this.$ = new ArgsContainer();\n        \nbreak;\ncase 66: case 71:\n\n            this.$ = new ArgsContainer();\n            this.$.argnames.push($$[$0].argname);\n            this.$.argexpr.push($$[$0].argexpr);\n            delete $$[$0];\n        \nbreak;\ncase 67: case 72:\n\n            this.$ = $$[$0-3];\n            this.$.argnames.push($$[$0].argname);\n            this.$.argexpr.push($$[$0].argexpr);\n            delete $$[$0];\n        \nbreak;\ncase 68:\n\n            this.$ = new ArgContainer();\n            this.$.argname = $$[$0];\n            this.$.argexpr = undefined;\n        \nbreak;\ncase 69: case 74:\n\n            this.$ = new ArgContainer();\n            this.$.argname = $$[$0-2];\n            this.$.argexpr = $$[$0];\n        \nbreak;\ncase 73:\n\n            this.$ = new ArgContainer();\n            this.$.argexpr = $$[$0];\n        \nbreak;\n}\n},\ntable: [o($V0,[2,2],{3:1,4:2}),{1:[3]},o($V1,$V2,{5:3,7:4,1:[2,1],9:$V3}),o($V0,[2,3]),{8:6,10:[1,10],15:[1,7],16:[1,8],18:9,21:[1,11],22:[1,12],25:19,26:$V4,27:14,29:13,31:$V5,32:$V6,33:$V7,34:$V8},{10:[1,21]},o($V9,[2,6]),o($V9,[2,9]),o($Va,[2,4],{6:22}),o($V9,[2,11]),{11:$Vb,19:[1,23]},{10:[1,25]},o($V9,[2,14]),{10:$Vc,15:[1,26],16:$Vd,18:28,23:27,25:19,26:$V4,27:14,29:13,31:$V5,32:$V6,33:$V7,34:$V8},o($Ve,[2,22]),{10:$Vc,29:31,31:$V5,32:$V6,33:$V7,34:$V8},{10:$Vc,29:32,31:$V5,32:$V6,33:$V7,34:$V8},{10:$Vc,29:33,31:$V5,32:$V6,33:$V7,34:$V8},{10:$Vc,29:34,31:$V5,32:$V6,33:$V7,34:$V8},o($V9,[2,18],{28:[1,35]}),{11:[1,36]},{11:[1,37]},o($V1,$V2,{7:4,5:39,9:$V3,17:[1,38]}),{10:$Vf,11:$Vg,20:40,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},o($Vq,$Vr,{30:52,59:53,20:54,10:$Vs,11:$Vg,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp}),{11:[1,56]},o($Ve,[2,20]),o($Ve,[2,21]),o($Ve,[2,15]),o($Vt,[2,23],{24:57}),{11:$Vb},o($Vu,[2,26]),o($Vu,[2,27]),o($Vu,[2,28]),o($Vu,[2,29]),{10:$Vc,16:$Vd,18:28,23:58,25:19,26:$V4,27:14,29:13,31:$V5,32:$V6,33:$V7,34:$V8},{10:$Vf,11:$Vg,20:59,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},o($Vq,$Vv,{12:60,58:61,10:$Vw}),o($V9,[2,10]),o($Va,[2,5]),{15:[1,63],33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},o($VN,[2,30]),o($VN,[2,31]),o($VN,[2,32]),o($VN,$VO,{11:$VP}),o($VN,[2,35]),o($VN,[2,36]),{10:$Vf,11:$Vg,13:82,20:81,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,43:$VQ,44:83,46:$Vo,47:$Vp,57:$VR},{10:$Vf,11:$Vg,20:85,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:86,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:87,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:88,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{14:[1,89],57:$VS},o($Vq,[2,71]),o($Vq,[2,73],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM}),o([14,33,34,38,41,45,46,47,48,49,50,51,52,53,54,55,56,57],$VO,{11:$VP,19:[1,91]}),o($Vq,$Vv,{58:61,12:92,10:$Vw}),{10:$Vc,17:[1,93],18:94,25:19,26:$V4,27:14,29:13,31:$V5,32:$V6,33:$V7,34:$V8},o($Ve,[2,19]),{14:[1,95],33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},{13:96,14:$VQ,57:$VT},o($Vq,[2,66]),o($Vq,[2,68],{19:[1,98]}),o($V9,[2,12]),{10:[1,99]},{10:$Vf,11:$Vg,20:100,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:101,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:102,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:103,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:104,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:105,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:106,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:107,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:108,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:109,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:110,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:111,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:112,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:113,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{10:$Vf,11:$Vg,20:114,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},o($Vq,$Vr,{59:53,20:54,30:115,10:$Vs,11:$Vg,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp}),o($VU,[2,63],{33:$Vx,34:$Vy,38:$Vz,41:$VA,42:[1,116],45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM}),{43:[1,117]},{13:118,43:$VQ,57:[1,119]},o($VV,$VQ,{13:120,57:$VR}),o($VW,[2,54],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB}),o($VW,[2,55],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB}),o($VW,[2,56],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB}),{14:[1,121],33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},o($Vu,[2,25]),o([10,11,31,35,36,37,39,40,41,46,47],$VQ,{13:122,57:$VR}),{10:$Vf,11:$Vg,20:123,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{13:124,14:$VQ,57:$VT},o($Ve,[2,16]),o($Vt,[2,24]),{10:$Vc,16:$Vd,18:28,23:125,25:19,26:$V4,27:14,29:13,31:$V5,32:$V6,33:$V7,34:$V8},{14:[1,126]},o([10,14],$VQ,{13:127,57:$VR}),{10:$Vf,11:$Vg,20:128,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},o($VN,[2,34]),o($VX,[2,41],{38:$Vz,41:$VA}),o($VX,[2,42],{38:$Vz,41:$VA}),o($VX,[2,43],{38:$Vz,41:$VA}),o($VW,[2,44],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB}),o($VW,[2,45],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB}),o($VY,[2,46],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,50:$VG,51:$VH}),o($VY,[2,47],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,50:$VG,51:$VH}),o($VZ,[2,48],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD}),o($VZ,[2,49],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD}),o($VY,[2,50],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,50:$VG,51:$VH}),o($VY,[2,51],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,50:$VG,51:$VH}),o([14,15,42,43,54,55,56,57],[2,52],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ}),o([14,15,42,43,55,56,57],[2,53],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK}),{33:$Vx,34:$Vy,38:$Vz,41:$VA,42:[1,129],45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},{33:$Vx,34:$Vy,38:$Vz,41:$VA,43:[1,130],45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},{14:[1,131],57:$VS},{10:$Vf,11:$Vg,20:132,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},o($VN,[2,39]),{43:[1,133]},o([10,11,31,35,36,37,39,40,41,43,46,47],$VQ,{13:134,57:$VR}),o($VV,$V_),o($VN,[2,57]),{10:$Vs,11:$Vg,20:54,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp,59:135},o($Vq,[2,74],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM}),{14:[1,136]},o($Ve,[2,17]),o($V1,[2,8]),{10:$Vw,14:$V_,58:137},o($Vq,[2,69],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM}),{10:$Vf,11:$Vg,20:138,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},o($VN,[2,59]),o($VN,[2,60]),{33:$Vx,34:$Vy,38:$Vz,41:$VA,42:[1,140],43:[1,139],45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},o($VN,[2,40]),{10:$Vf,11:$Vg,20:141,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,43:$V_,46:$Vo,47:$Vp},o($Vq,[2,72]),{19:[1,142]},o($Vq,[2,67]),o([14,15,42,43,57],[2,58],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM}),o($VN,[2,37]),{10:$Vf,11:$Vg,20:143,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},o($VU,[2,64],{33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM}),{10:$Vf,11:$Vg,20:144,31:$Vh,35:$Vi,36:$Vj,37:$Vk,39:$Vl,40:$Vm,41:$Vn,46:$Vo,47:$Vp},{33:$Vx,34:$Vy,38:$Vz,41:$VA,43:[1,145],45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},{15:[1,146],33:$Vx,34:$Vy,38:$Vz,41:$VA,45:$VB,46:$VC,47:$VD,48:$VE,49:$VF,50:$VG,51:$VH,52:$VI,53:$VJ,54:$VK,55:$VL,56:$VM},o($VN,[2,38]),o($V9,[2,13])],\ndefaultActions: {},\nparseError: function parseError(str, hash) {\n    if (hash.recoverable) {\n        this.trace(str);\n    } else {\n        function _parseError (msg, hash) {\n            this.message = msg;\n            this.hash = hash;\n        }\n        _parseError.prototype = Error;\n\n        throw new _parseError(str, hash);\n    }\n},\nparse: function parse(input) {\n    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n    var args = lstack.slice.call(arguments, 1);\n    var lexer = Object.create(this.lexer);\n    var sharedState = { yy: {} };\n    for (var k in this.yy) {\n        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n            sharedState.yy[k] = this.yy[k];\n        }\n    }\n    lexer.setInput(input, sharedState.yy);\n    sharedState.yy.lexer = lexer;\n    sharedState.yy.parser = this;\n    if (typeof lexer.yylloc == 'undefined') {\n        lexer.yylloc = {};\n    }\n    var yyloc = lexer.yylloc;\n    lstack.push(yyloc);\n    var ranges = lexer.options && lexer.options.ranges;\n    if (typeof sharedState.yy.parseError === 'function') {\n        this.parseError = sharedState.yy.parseError;\n    } else {\n        this.parseError = Object.getPrototypeOf(this).parseError;\n    }\n    function popStack(n) {\n        stack.length = stack.length - 2 * n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n    }\n    _token_stack:\n        var lex = function () {\n            var token;\n            token = lexer.lex() || EOF;\n            if (typeof token !== 'number') {\n                token = self.symbols_[token] || token;\n            }\n            return token;\n        };\n    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n    while (true) {\n        state = stack[stack.length - 1];\n        if (this.defaultActions[state]) {\n            action = this.defaultActions[state];\n        } else {\n            if (symbol === null || typeof symbol == 'undefined') {\n                symbol = lex();\n            }\n            action = table[state] && table[state][symbol];\n        }\n                    if (typeof action === 'undefined' || !action.length || !action[0]) {\n                var errStr = '';\n                expected = [];\n                for (p in table[state]) {\n                    if (this.terminals_[p] && p > TERROR) {\n                        expected.push('\\'' + this.terminals_[p] + '\\'');\n                    }\n                }\n                if (lexer.showPosition) {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n                } else {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n                }\n                this.parseError(errStr, {\n                    text: lexer.match,\n                    token: this.terminals_[symbol] || symbol,\n                    line: lexer.yylineno,\n                    loc: yyloc,\n                    expected: expected\n                });\n            }\n        if (action[0] instanceof Array && action.length > 1) {\n            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n        }\n        switch (action[0]) {\n        case 1:\n            stack.push(symbol);\n            vstack.push(lexer.yytext);\n            lstack.push(lexer.yylloc);\n            stack.push(action[1]);\n            symbol = null;\n            if (!preErrorSymbol) {\n                yyleng = lexer.yyleng;\n                yytext = lexer.yytext;\n                yylineno = lexer.yylineno;\n                yyloc = lexer.yylloc;\n                if (recovering > 0) {\n                    recovering--;\n                }\n            } else {\n                symbol = preErrorSymbol;\n                preErrorSymbol = null;\n            }\n            break;\n        case 2:\n            len = this.productions_[action[1]][1];\n            yyval.$ = vstack[vstack.length - len];\n            yyval._$ = {\n                first_line: lstack[lstack.length - (len || 1)].first_line,\n                last_line: lstack[lstack.length - 1].last_line,\n                first_column: lstack[lstack.length - (len || 1)].first_column,\n                last_column: lstack[lstack.length - 1].last_column\n            };\n            if (ranges) {\n                yyval._$.range = [\n                    lstack[lstack.length - (len || 1)].range[0],\n                    lstack[lstack.length - 1].range[1]\n                ];\n            }\n            r = this.performAction.apply(yyval, [\n                yytext,\n                yyleng,\n                yylineno,\n                sharedState.yy,\n                action[1],\n                vstack,\n                lstack\n            ].concat(args));\n            if (typeof r !== 'undefined') {\n                return r;\n            }\n            if (len) {\n                stack = stack.slice(0, -1 * len * 2);\n                vstack = vstack.slice(0, -1 * len);\n                lstack = lstack.slice(0, -1 * len);\n            }\n            stack.push(this.productions_[action[1]][0]);\n            vstack.push(yyval.$);\n            lstack.push(yyval._$);\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n            stack.push(newState);\n            break;\n        case 3:\n            return true;\n        }\n    }\n    return true;\n}};\n\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n        if (this.yy.parser) {\n            this.yy.parser.parseError(str, hash);\n        } else {\n            throw new Error(str);\n        }\n    },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n        this.yy = yy || this.yy || {};\n        this._input = input;\n        this._more = this._backtrack = this.done = false;\n        this.yylineno = this.yyleng = 0;\n        this.yytext = this.matched = this.match = '';\n        this.conditionStack = ['INITIAL'];\n        this.yylloc = {\n            first_line: 1,\n            first_column: 0,\n            last_line: 1,\n            last_column: 0\n        };\n        if (this.options.ranges) {\n            this.yylloc.range = [0,0];\n        }\n        this.offset = 0;\n        return this;\n    },\n\n// consumes and returns one char from the input\ninput:function () {\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno++;\n            this.yylloc.last_line++;\n        } else {\n            this.yylloc.last_column++;\n        }\n        if (this.options.ranges) {\n            this.yylloc.range[1]++;\n        }\n\n        this._input = this._input.slice(1);\n        return ch;\n    },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len);\n        //this.yyleng -= len;\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - 1);\n        this.matched = this.matched.substr(0, this.matched.length - 1);\n\n        if (lines.length - 1) {\n            this.yylineno -= lines.length - 1;\n        }\n        var r = this.yylloc.range;\n\n        this.yylloc = {\n            first_line: this.yylloc.first_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.first_column,\n            last_column: lines ?\n                (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n                 + oldLines[oldLines.length - lines.length].length - lines[0].length :\n              this.yylloc.first_column - len\n        };\n\n        if (this.options.ranges) {\n            this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n        }\n        this.yyleng = this.yytext.length;\n        return this;\n    },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n        this._more = true;\n        return this;\n    },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n        if (this.options.backtrack_lexer) {\n            this._backtrack = true;\n        } else {\n            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n                text: \"\",\n                token: null,\n                line: this.yylineno\n            });\n\n        }\n        return this;\n    },\n\n// retain first n characters of the match\nless:function (n) {\n        this.unput(this.match.slice(n));\n    },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n        var past = this.matched.substr(0, this.matched.length - this.match.length);\n        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n    },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n        var next = this.match;\n        if (next.length < 20) {\n            next += this._input.substr(0, 20-next.length);\n        }\n        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n    },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n        var pre = this.pastInput();\n        var c = new Array(pre.length + 1).join(\"-\");\n        return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n    },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function (match, indexed_rule) {\n        var token,\n            lines,\n            backup;\n\n        if (this.options.backtrack_lexer) {\n            // save context\n            backup = {\n                yylineno: this.yylineno,\n                yylloc: {\n                    first_line: this.yylloc.first_line,\n                    last_line: this.last_line,\n                    first_column: this.yylloc.first_column,\n                    last_column: this.yylloc.last_column\n                },\n                yytext: this.yytext,\n                match: this.match,\n                matches: this.matches,\n                matched: this.matched,\n                yyleng: this.yyleng,\n                offset: this.offset,\n                _more: this._more,\n                _input: this._input,\n                yy: this.yy,\n                conditionStack: this.conditionStack.slice(0),\n                done: this.done\n            };\n            if (this.options.ranges) {\n                backup.yylloc.range = this.yylloc.range.slice(0);\n            }\n        }\n\n        lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno += lines.length;\n        }\n        this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ?\n                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n                         this.yylloc.last_column + match[0].length\n        };\n        this.yytext += match[0];\n        this.match += match[0];\n        this.matches = match;\n        this.yyleng = this.yytext.length;\n        if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset += this.yyleng];\n        }\n        this._more = false;\n        this._backtrack = false;\n        this._input = this._input.slice(match[0].length);\n        this.matched += match[0];\n        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n        if (this.done && this._input) {\n            this.done = false;\n        }\n        if (token) {\n            return token;\n        } else if (this._backtrack) {\n            // recover context\n            for (var k in backup) {\n                this[k] = backup[k];\n            }\n            return false; // rule action called reject() implying the next rule should be tested instead.\n        }\n        return false;\n    },\n\n// return next match in input\nnext:function () {\n        if (this.done) {\n            return this.EOF;\n        }\n        if (!this._input) {\n            this.done = true;\n        }\n\n        var token,\n            match,\n            tempMatch,\n            index;\n        if (!this._more) {\n            this.yytext = '';\n            this.match = '';\n        }\n        var rules = this._currentRules();\n        for (var i = 0; i < rules.length; i++) {\n            tempMatch = this._input.match(this.rules[rules[i]]);\n            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n                match = tempMatch;\n                index = i;\n                if (this.options.backtrack_lexer) {\n                    token = this.test_match(tempMatch, rules[i]);\n                    if (token !== false) {\n                        return token;\n                    } else if (this._backtrack) {\n                        match = false;\n                        continue; // rule action called reject() implying a rule MISmatch.\n                    } else {\n                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n                        return false;\n                    }\n                } else if (!this.options.flex) {\n                    break;\n                }\n            }\n        }\n        if (match) {\n            token = this.test_match(match, rules[index]);\n            if (token !== false) {\n                return token;\n            }\n            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n            return false;\n        }\n        if (this._input === \"\") {\n            return this.EOF;\n        } else {\n            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n                text: \"\",\n                token: null,\n                line: this.yylineno\n            });\n        }\n    },\n\n// return next match that has a token\nlex:function lex() {\n        var r = this.next();\n        if (r) {\n            return r;\n        } else {\n            return this.lex();\n        }\n    },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin(condition) {\n        this.conditionStack.push(condition);\n    },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState() {\n        var n = this.conditionStack.length - 1;\n        if (n > 0) {\n            return this.conditionStack.pop();\n        } else {\n            return this.conditionStack[0];\n        }\n    },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules() {\n        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n        } else {\n            return this.conditions[\"INITIAL\"].rules;\n        }\n    },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState(n) {\n        n = this.conditionStack.length - 1 - Math.abs(n || 0);\n        if (n >= 0) {\n            return this.conditionStack[n];\n        } else {\n            return \"INITIAL\";\n        }\n    },\n\n// alias for begin(condition)\npushState:function pushState(condition) {\n        this.begin(condition);\n    },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n        return this.conditionStack.length;\n    },\noptions: {\"flex\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('cond_include'); \nbreak;\ncase 1: yy.filepath = yy_.yytext; \nbreak;\ncase 2: yy.filename = yy_.yytext; \nbreak;\ncase 3:  this.popState(); \nbreak;\ncase 4: this.begin('cond_use');\nbreak;\ncase 5: yy.filename = yy_.yytext; \nbreak;\ncase 6: this.popState(); \nbreak;\ncase 7:return 9\nbreak;\ncase 8:return 21\nbreak;\ncase 9:return 26\nbreak;\ncase 10:return 28\nbreak;\ncase 11:return 35\nbreak;\ncase 12:return 36\nbreak;\ncase 13:return 37\nbreak;\ncase 14: stringcontents += '    ';  \nbreak;\ncase 15: stringcontents += '\\n';  \nbreak;\ncase 16: stringcontents += '\\\"';  \nbreak;\ncase 17: stringcontents += '\\r';  \nbreak;\ncase 18: stringcontents += '\\\\';  \nbreak;\ncase 19: stringcontents += '\\0';  \nbreak;\ncase 20: stringcontents += '\\a';  \nbreak;\ncase 21: stringcontents += '\\b';  \nbreak;\ncase 22: stringcontents += '\\t';  \nbreak;\ncase 23: stringcontents += '\\n';  \nbreak;\ncase 24: stringcontents += '\\v';  \nbreak;\ncase 25: stringcontents += '\\f';  \nbreak;\ncase 26: stringcontents += '\\e';  \nbreak;\ncase 27: /*\"*/\n                                stringcontents += yy_.yytext;\n                            \nbreak;\ncase 28:\n                                this.popState();\n                                yy_.yytext = stringcontents;\n                                return 39;\n                            \nbreak;\ncase 29: /*\"*/\n                                this.begin('cond_string');\n                                stringcontents = \"\";\n                            \nbreak;\ncase 30:/* Ignore */\nbreak;\ncase 31:/* Ignore */\nbreak;\ncase 32:/* Ignore */\nbreak;\ncase 33:/* Ignore Note: multi-line comments are removed via a preparse regex. */\nbreak;\ncase 34:return 40\nbreak;\ncase 35:return 40\nbreak;\ncase 36:return 40\nbreak;\ncase 37:return 10\nbreak;\ncase 38:return 49\nbreak;\ncase 39:return 52\nbreak;\ncase 40:return 50\nbreak;\ncase 41:return 51\nbreak;\ncase 42:return 54\nbreak;\ncase 43:return 55\nbreak;\ncase 44:return yy_.yytext;\nbreak;\ncase 45:console.log(yy_.yytext);\nbreak;\n}\n},\nrules: [/^(?:include[ \\t\\r\\n>]*<)/,/^(?:[^\\t\\r\\n>]*\\/)/,/^(?:[^\\t\\r\\n>\\/]+)/,/^(?:>)/,/^(?:use[ \\t\\r\\n>]*<)/,/^(?:[^\\t\\r\\n>]+)/,/^(?:>)/,/^(?:module)/,/^(?:function)/,/^(?:if)/,/^(?:else)/,/^(?:true)/,/^(?:false)/,/^(?:undef)/,/^(?:\\\\t)/,/^(?:\\\\n)/,/^(?:\\\\\")/,/^(?:\\\\r)/,/^(?:\\\\\\\\)/,/^(?:\\\\0)/,/^(?:\\\\a)/,/^(?:\\\\b)/,/^(?:\\\\t)/,/^(?:\\\\n)/,/^(?:\\\\v)/,/^(?:\\\\f)/,/^(?:\\\\e)/,/^(?:[^\\\\\\n\\\"]+)/,/^(?:\")/,/^(?:[\\\"])/,/^(?:[\\n])/,/^(?:[\\r\\t ])/,/^(?:\\/\\/[^\\n]*\\n?)/,/^(?:\\/\\*.+\\*\\/)/,/^(?:([0-9])*\\.([0-9])+([Ee][+-]?([0-9])+)?)/,/^(?:([0-9])+\\.([0-9])*([Ee][+-]?([0-9])+)?)/,/^(?:([0-9])+([Ee][+-]?([0-9])+)?)/,/^(?:\\$?[a-zA-Z0-9_]+)/,/^(?:<=)/,/^(?:>=)/,/^(?:==)/,/^(?:!=)/,/^(?:&&)/,/^(?:\\|\\|)/,/^(?:.)/,/^(?:.)/],\nconditions: {\"cond_include\":{\"rules\":[0,1,2,3,4,7,8,9,10,11,12,13,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],\"inclusive\":true},\"cond_use\":{\"rules\":[0,4,5,6,7,8,9,10,11,12,13,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],\"inclusive\":true},\"cond_comment\":{\"rules\":[0,4,7,8,9,10,11,12,13,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],\"inclusive\":true},\"cond_string\":{\"rules\":[0,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],\"inclusive\":true},\"cond_import\":{\"rules\":[0,4,7,8,9,10,11,12,13,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],\"inclusive\":true},\"INITIAL\":{\"rules\":[0,4,7,8,9,10,11,12,13,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n  this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function commonjsMain(args) {\n    if (!args[1]) {\n        console.log('Usage: '+args[0]+' FILE');\n        process.exit(1);\n    }\n    var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n    return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n  exports.main(process.argv.slice(1));\n}\n}\n}).call(this,require('_process'))\n},{\"./ArgContainer\":99,\"./ArgsContainer\":100,\"./Expression\":105,\"./IfElseModuleInstantiation\":108,\"./ModuleInstantiation\":112,\"./openscad-parser-ext\":119,\"_process\":240,\"fs\":152,\"path\":238}],122:[function(require,module,exports){\nvar parser = require('./parserCJS')\nvar Globals = require('./Globals')\n\nmodule.exports = {\n  parse: function (text) {\n    if (parser.yy === undefined) {\n      parser.yy = {}\n    }\n\n    var openSCADText = Globals.preParse(text)\n    var openJSCADResult = parser.parse(openSCADText)\n    return openJSCADResult.lines.join('\\n')\n  }\n}\n\n},{\"./Globals\":107,\"./parserCJS\":121}],123:[function(require,module,exports){\nconst { CSG } = require('@jscad/csg')\nconst { vt2jscad } = require('./vt2jscad')\nconst { BinaryReader } = require('@jscad/io-utils')\n\n// STL function from http://jsfiddle.net/Riham/yzvGD/35/\n// CC BY-SA by Riham\n// changes by Rene K. Mueller <spiritdude@gmail.com>\n// changes by Mark 'kaosat-dev' Moissette\n// 2017/10/14: refactoring, added support for CSG output etc\n// 2013/03/28: lot of rework and debugging included, and error handling\n// 2013/03/18: renamed functions, creating .jscad source direct via polyhedron()\nconst echo = console.info\n\n/**\n* Parse the given stl data and return either a JSCAD script or a CSG/CAG object\n* @param {string} input stl data\n* @param {string} filename (optional) original filename of AMF source\n* @param {object} options options (optional) anonymous object with:\n* @param {string} [options.version='0.0.0'] version number to add to the metadata\n* @param {boolean} [options.addMetadata=true] toggle injection of metadata (producer, date, source) at the start of the file\n* @param {string} [options.output='jscad'] {String} either jscad or csg to set desired output\n* @return {CSG/string} either a CAG/CSG object or a string (jscad script)\n*/\nfunction deserialize (stl, filename, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  const defaults = {version: '0.0.0', addMetaData: true, output: 'jscad'}\n  options = Object.assign({}, defaults, options)\n  const {version, output, addMetaData} = options\n\n  const isBinary = isDataBinaryRobust(stl)\n\n  stl = isBinary && isBuffer(stl) ? bufferToBinaryString(stl) : stl\n\n  options && options.statusCallback && options.statusCallback({progress: 33})\n\n  const elementFormatterJscad = ({vertices, triangles, normals, colors, index}) => `// object #${index}: triangles: ${triangles.length}\\n${vt2jscad(vertices, triangles, null)}`\n  const elementFormatterCSG = ({vertices, triangles, normals, colors}) => polyhedron({ points: vertices, polygons: triangles })\n\n  options && options.statusCallback && options.statusCallback({progress: 66})\n  \n  const deserializer = isBinary ? deserializeBinarySTL : deserializeAsciiSTL\n  const elementFormatter = output === 'jscad' ? elementFormatterJscad : elementFormatterCSG\n  const outputFormatter = output === 'jscad' ? formatAsJscad : formatAsCsg\n\n  const result = outputFormatter(deserializer(stl, filename, version, elementFormatter), addMetaData, version, filename)\n  \n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return result\n\n  /*\n  if (err) src += '// WARNING: import errors: ' + err + ' (some triangles might be misaligned or missing)\\n'\n  src += '// objects: 1\\n// object #1: triangles: ' + totalTriangles + '\\n\\n'\n  src += 'function main() { return '\n  src += vt2jscad(vertices, triangles, normals, colors)\n  src += '; }' */\n}\n\nfunction bufferToBinaryString (buffer) {\n  let binary = ''\n  const bytes = new Uint8Array(buffer)\n  let length = bytes.byteLength\n  for (let i = 0; i < length; i++) {\n    binary += String.fromCharCode(bytes[i])\n  }\n  return binary\n}\n\n// taken from https://github.com/feross/is-buffer if we need it more than once, add as dep\nfunction isBuffer (obj) {\n  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// transforms input to string if it was not already the case\nfunction ensureString (buf) {\n  if (typeof buf !== 'string') {\n    let arrayBuffer = new Uint8Array(buf)\n    let str = ''\n    for (let i = 0; i < buf.byteLength; i++) {\n      str += String.fromCharCode(arrayBuffer[i]) // implicitly assumes little-endian\n    }\n    return str\n  } else {\n    return buf\n  }\n}\n\n// reliable binary detection\nfunction isDataBinaryRobust (data) {\n  // console.log('data is binary ?')\n  const patternVertex = /vertex[\\s]+([-+]?[0-9]+\\.?[0-9]*([eE][-+]?[0-9]+)?)+[\\s]+([-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?)+[\\s]+([-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?)+/g\n  const text = ensureString(data)\n  const isBinary = patternVertex.exec(text) === null\n  return isBinary\n}\n\nfunction formatAsJscad (data, addMetaData, version, filename) {\n  let code = addMetaData ? `//\n  // producer: OpenJSCAD.org Compatibility${version} STL Binary Importer\n  // date: ${new Date()}\n  // source: ${filename}\n  //\n  ` : ''\n\n  return code + `function main() { return union(\n// objects: ${data.length}\n${data.join('\\n')}); }\n`\n}\n\nfunction formatAsCsg (data) {\n  return new CSG().union(data)\n}\n\nfunction deserializeBinarySTL (stl, filename, version, elementFormatter, debug = false) {\n  // -- This makes more sense if you read http://en.wikipedia.org/wiki/STL_(file_format)#Binary_STL\n  let vertices = []\n  let triangles = []\n  let normals = []\n  let colors = []\n  let converted = 0\n  let vertexIndex = 0\n  let err = 0\n  let mcolor = null\n  let umask = parseInt('01000000000000000', 2)\n  let rmask = parseInt('00000000000011111', 2)\n  let gmask = parseInt('00000001111100000', 2)\n  let bmask = parseInt('00111110000000000', 2)\n  let br = new BinaryReader(stl)\n\n  let m = 0\n  let c = 0\n  let r = 0\n  let g = 0\n  let b = 0\n  let a = 0\n  for (let i = 0; i < 80; i++) {\n    switch (m) {\n      case 6:\n        r = br.readUInt8()\n        m += 1\n        continue\n      case 7:\n        g = br.readUInt8()\n        m += 1\n        continue\n      case 8:\n        b = br.readUInt8()\n        m += 1\n        continue\n      case 9:\n        a = br.readUInt8()\n        m += 1\n        continue\n      default:\n        c = br.readChar()\n        switch (c) {\n          case 'C':\n          case 'O':\n          case 'L':\n          case 'R':\n          case '=':\n            m += 1\n            break\n          default:\n            break\n        }\n        break\n    }\n  }\n  if (m === 10) { // create the default color\n    mcolor = [r / 255, g / 255, b / 255, a / 255]\n  }\n\n  let totalTriangles = br.readUInt32() // Read # triangles\n\n  for (let tr = 0; tr < totalTriangles; tr++) {\n    if (debug) {\n      if (tr % 100 === 0) console.info(`stl importer: converted ${converted} out of ${totalTriangles} triangles`)\n    }\n    /*\n      REAL32[3] . Normal vector\n      REAL32[3] . Vertex 1\n      REAL32[3] . Vertex 2\n      REAL32[3] . Vertex 3\n      UINT16 . Attribute byte count */\n    // -- Parse normal\n    let no = []; no.push(br.readFloat()); no.push(br.readFloat()); no.push(br.readFloat())\n\n    // -- Parse every 3 subsequent floats as a vertex\n    let v1 = []; v1.push(br.readFloat()); v1.push(br.readFloat()); v1.push(br.readFloat())\n    let v2 = []; v2.push(br.readFloat()); v2.push(br.readFloat()); v2.push(br.readFloat())\n    let v3 = []; v3.push(br.readFloat()); v3.push(br.readFloat()); v3.push(br.readFloat())\n\n    let skip = 0\n\n    for (let i = 0; i < 3; i++) {\n      if (isNaN(v1[i])) skip++\n      if (isNaN(v2[i])) skip++\n      if (isNaN(v3[i])) skip++\n      if (isNaN(no[i])) skip++\n    }\n    if (skip > 0) {\n      echo('bad triangle vertice coords/normal: ', skip)\n    }\n\n    err += skip\n    // -- every 3 vertices create a triangle.\n    let triangle = []; triangle.push(vertexIndex++); triangle.push(vertexIndex++); triangle.push(vertexIndex++)\n\n    let abc = br.readUInt16()\n    let color = null\n    if (m === 10) {\n      let u = (abc & umask) // 0 if color is unique for this triangle\n      let r = (abc & rmask) / 31\n      let g = ((abc & gmask) >>> 5) / 31\n      let b = ((abc & bmask) >>> 10) / 31\n      let a = 255\n      if (u === 0) {\n        color = [r, g, b, a]\n      } else {\n        color = mcolor\n      }\n      colors.push(color)\n    }\n\n    // -- Add 3 vertices for every triangle\n    // -- TODO: OPTIMIZE: Check if the vertex is already in the array, if it is just reuse the index\n    if (skip === 0) { // checking cw vs ccw, given all normal/vertice are valid\n      // E1 = B - A\n      // E2 = C - A\n      // test = dot( Normal, cross( E1, E2 ) )\n      // test > 0: cw, test < 0 : ccw\n      let w1 = new CSG.Vector3D(v1)\n      let w2 = new CSG.Vector3D(v2)\n      let w3 = new CSG.Vector3D(v3)\n      let e1 = w2.minus(w1)\n      let e2 = w3.minus(w1)\n      let t = new CSG.Vector3D(no).dot(e1.cross(e2))\n      if (t > 0) { // 1,2,3 -> 3,2,1\n        let tmp = v3\n        v3 = v1\n        v1 = tmp\n      }\n    }\n    vertices.push(v1)\n    vertices.push(v2)\n    vertices.push(v3)\n    triangles.push(triangle)\n    normals.push(no)\n    converted++\n  }\n\n  if (err) {\n    console.warn(`WARNING: import errors: ${err} (some triangles might be misaligned or missing)`)\n    // FIXME: this used to be added to the output script, which makes more sense\n  }\n\n  return [elementFormatter({vertices, triangles, normals, colors})]\n}\n\nfunction deserializeAsciiSTL (stl, filename, version, elementFormatter) {\n  let converted = 0\n  let o\n\n  // -- Find all models\n  const objects = stl.split('endsolid')\n  // src += '// objects: ' + (objects.length - 1) + '\\n'\n  let elements = []\n  for (o = 1; o < objects.length; o++) {\n    // -- Translation: a non-greedy regex for facet {...} endloop pattern\n    let patt = /\\bfacet[\\s\\S]*?endloop/mgi\n    let vertices = []\n    let triangles = []\n    let normals = []\n    let vertexIndex = 0\n    let err = 0\n\n    let match = stl.match(patt)\n    if (match == null) continue\n    for (let i = 0; i < match.length; i++) {\n      // if(converted%100==0) status('stl to jscad: converted '+converted+' out of '+match.length+ ' facets');\n      // -- 1 normal with 3 numbers, 3 different vertex objects each with 3 numbers:\n      // let vpatt = /\\bfacet\\s+normal\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)\\s*outer\\s+loop\\s+vertex\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)\\s*vertex\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)\\s*vertex\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)\\s+(-?\\d+\\.?\\d*)/mgi;\n      // (-?\\d+\\.?\\d*) -1.21223\n      // (-?\\d+\\.?\\d*[Ee]?[-+]?\\d*)\n      let vpatt = /\\bfacet\\s+normal\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+outer\\s+loop\\s+vertex\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+vertex\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+vertex\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*/mgi\n      let v = vpatt.exec(match[i])\n      if (v == null) continue\n      if (v.length !== 13) {\n        echo('Failed to parse ' + match[i])\n        break\n      }\n      let skip = 0\n      for (let k = 0; k < v.length; k++) {\n        if (v[k] === 'NaN') {\n          echo('bad normal or triangle vertice #' + converted + ' ' + k + \": '\" + v[k] + \"', skipped\")\n          skip++\n        }\n      }\n      err += skip\n      if (skip) {\n        continue\n      }\n      if (0 && skip) {\n        let j = 1 + 3\n        let v1 = []; v1.push(parseFloat(v[j++])); v1.push(parseFloat(v[j++])); v1.push(parseFloat(v[j++]))\n        let v2 = []; v2.push(parseFloat(v[j++])); v2.push(parseFloat(v[j++])); v2.push(parseFloat(v[j++]))\n        let v3 = []; v3.push(parseFloat(v[j++])); v3.push(parseFloat(v[j++])); v3.push(parseFloat(v[j++]))\n        echo('recalculate norm', v1, v2, v3)\n        let w1 = new CSG.Vector3D(v1)\n        let w2 = new CSG.Vector3D(v2)\n        let w3 = new CSG.Vector3D(v3)\n        let _u = w1.minus(w3)\n        let _v = w1.minus(w2)\n        let norm = _u.cross(_v).unit()\n        j = 1\n        v[j++] = norm._x\n        v[j++] = norm._y\n        v[j++] = norm._z\n        skip = false\n      }\n      let j = 1\n      let no = []; no.push(parseFloat(v[j++])); no.push(parseFloat(v[j++])); no.push(parseFloat(v[j++]))\n      let v1 = []; v1.push(parseFloat(v[j++])); v1.push(parseFloat(v[j++])); v1.push(parseFloat(v[j++]))\n      let v2 = []; v2.push(parseFloat(v[j++])); v2.push(parseFloat(v[j++])); v2.push(parseFloat(v[j++]))\n      let v3 = []; v3.push(parseFloat(v[j++])); v3.push(parseFloat(v[j++])); v3.push(parseFloat(v[j++]))\n      let triangle = []; triangle.push(vertexIndex++); triangle.push(vertexIndex++); triangle.push(vertexIndex++)\n\n      // -- Add 3 vertices for every triangle\n      // TODO: OPTIMIZE: Check if the vertex is already in the array, if it is just reuse the index\n      if (skip === 0) {  // checking cw vs ccw\n        // E1 = B - A\n        // E2 = C - A\n        // test = dot( Normal, cross( E1, E2 ) )\n        // test > 0: cw, test < 0: ccw\n        let w1 = new CSG.Vector3D(v1)\n        let w2 = new CSG.Vector3D(v2)\n        let w3 = new CSG.Vector3D(v3)\n        let e1 = w2.minus(w1)\n        let e2 = w3.minus(w1)\n        let t = new CSG.Vector3D(no).dot(e1.cross(e2))\n        if (t > 0) { // 1,2,3 -> 3,2,1\n          let tmp = v3\n          v3 = v1\n          v1 = tmp\n        }\n      }\n      vertices.push(v1)\n      vertices.push(v2)\n      vertices.push(v3)\n      normals.push(no)\n      triangles.push(triangle)\n      converted++\n    }\n    if (err) {\n      console.warn(`WARNING: import errors: ${err} (some triangles might be misaligned or missing)`)\n      // FIXME: this used to be added to the output script, which makes more sense\n    }\n\n    elements.push(\n      elementFormatter({vertices, triangles, index: o})\n    )\n  }\n\n  return elements\n}\n\n// FIXME : just a stand in for now from scad-api, not sure if we should rely on scad-api from here ?\nfunction polyhedron (p) {\n  let pgs = []\n  let ref = p.triangles || p.polygons\n  let colors = p.colors || null\n\n  for (let i = 0; i < ref.length; i++) {\n    let pp = []\n    for (let j = 0; j < ref[i].length; j++) {\n      pp[j] = p.points[ref[i][j]]\n    }\n\n    let v = []\n    for (let j = ref[i].length - 1; j >= 0; j--) { // --- we reverse order for examples of OpenSCAD work\n      v.push(new CSG.Vertex(new CSG.Vector3D(pp[j][0], pp[j][1], pp[j][2])))\n    }\n    let s = CSG.Polygon.defaultShared\n    if (colors && colors[i]) {\n      s = CSG.Polygon.Shared.fromColor(colors[i])\n    }\n    pgs.push(new CSG.Polygon(v, s))\n  }\n  let r = CSG.fromPolygons(pgs)\n  return r\n}\n\nmodule.exports = {\n  deserialize\n}\n\n},{\"./vt2jscad\":124,\"@jscad/csg\":22,\"@jscad/io-utils\":92}],124:[function(require,module,exports){\narguments[4][98][0].apply(exports,arguments)\n},{\"dup\":98}],125:[function(require,module,exports){\n\nfunction serialize (CSG, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  var result = 'solid csg.js\\n'\n  CSG.polygons.map(function (p, i) {\n    result += CSGPolygontoStlString(p)\n    options && options.statusCallback && options.statusCallback({progress: 100 * i / CSG.polygons.length})\n  })\n  result += 'endsolid csg.js\\n'\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return [result]\n}\n\nfunction CSGVector3DtoStlString (v) {\n  return v._x + ' ' + v._y + ' ' + v._z\n}\n\nfunction CSGVertextoStlString (vertex) {\n  return 'vertex ' + CSGVector3DtoStlString(vertex.pos) + '\\n'\n}\n\nfunction CSGPolygontoStlString (polygon) {\n  var result = ''\n  if (polygon.vertices.length >= 3) {\n    // STL requires triangular polygons. If our polygon has more vertices, create\n    // multiple triangles:\n    var firstVertexStl = CSGVertextoStlString(polygon.vertices[0])\n    for (var i = 0; i < polygon.vertices.length - 2; i++) {\n      result += 'facet normal ' + CSGVector3DtoStlString(polygon.plane.normal) + '\\nouter loop\\n'\n      result += firstVertexStl\n      result += CSGVertextoStlString(polygon.vertices[i + 1])\n      result += CSGVertextoStlString(polygon.vertices[i + 2])\n      result += 'endloop\\nendfacet\\n'\n    }\n  }\n  return result\n}\n\nmodule.exports = {\n  serialize\n}\n\n},{}],126:[function(require,module,exports){\n\n// see http://en.wikipedia.org/wiki/STL_%28file_format%29#Binary_STL\nfunction serialize (CSG, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})  \n  // first check if the host is little-endian:\n  var buffer = new ArrayBuffer(4)\n  var int32buffer = new Int32Array(buffer, 0, 1)\n  var int8buffer = new Int8Array(buffer, 0, 4)\n  int32buffer[0] = 0x11223344\n  if (int8buffer[0] !== 0x44) {\n    throw new Error('Binary STL output is currently only supported on little-endian (Intel) processors')\n  }\n\n  var numtriangles = 0\n  CSG.polygons.map(function (p) {\n    var numvertices = p.vertices.length\n    var thisnumtriangles = (numvertices >= 3) ? numvertices - 2 : 0\n    numtriangles += thisnumtriangles\n  })\n  var headerarray = new Uint8Array(80)\n  for (var i = 0; i < 80; i++) {\n    headerarray[i] = 65\n  }\n  var ar1 = new Uint32Array(1)\n  ar1[0] = numtriangles\n  // write the triangles to allTrianglesBuffer:\n  var allTrianglesBuffer = new ArrayBuffer(50 * numtriangles)\n  var allTrianglesBufferAsInt8 = new Int8Array(allTrianglesBuffer)\n  // a tricky problem is that a Float32Array must be aligned at 4-byte boundaries (at least in certain browsers)\n  // while each triangle takes 50 bytes. Therefore we write each triangle to a temporary buffer, and copy that\n  // into allTrianglesBuffer:\n  var triangleBuffer = new ArrayBuffer(50)\n  var triangleBufferAsInt8 = new Int8Array(triangleBuffer)\n  // each triangle consists of 12 floats:\n  var triangleFloat32array = new Float32Array(triangleBuffer, 0, 12)\n  // and one uint16:\n  var triangleUint16array = new Uint16Array(triangleBuffer, 48, 1)\n  var byteoffset = 0\n  CSG.polygons.map(function (p, i) {\n    var numvertices = p.vertices.length\n    for (var i = 0; i < numvertices - 2; i++) {\n      var normal = p.plane.normal\n      triangleFloat32array[0] = normal._x\n      triangleFloat32array[1] = normal._y\n      triangleFloat32array[2] = normal._z\n      var arindex = 3\n      for (var v = 0; v < 3; v++) {\n        var vv = v + ((v > 0) ? i : 0)\n        var vertexpos = p.vertices[vv].pos\n        triangleFloat32array[arindex++] = vertexpos._x\n        triangleFloat32array[arindex++] = vertexpos._y\n        triangleFloat32array[arindex++] = vertexpos._z\n      }\n      triangleUint16array[0] = 0\n      // copy the triangle into allTrianglesBuffer:\n      allTrianglesBufferAsInt8.set(triangleBufferAsInt8, byteoffset)\n      byteoffset += 50\n    }\n    options && options.statusCallback && options.statusCallback({progress: 100 * i / CSG.polygons.length})\n  })\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return [headerarray.buffer, ar1.buffer, allTrianglesBuffer]// 'blobable array'\n  /* return new Blob([headerarray.buffer, ar1.buffer, allTrianglesBuffer], {\n    type: mimeType\n  }) */\n}\n\nmodule.exports = {\n  serialize\n}\n\n},{}],127:[function(require,module,exports){\nconst binarySerializer = require('./CSGToStlb').serialize\nconst asciiSerializer = require('./CSGToStla').serialize\nconst { ensureManifoldness } = require('@jscad/io-utils')\n\nconst mimeType = 'application/sla'\n\nfunction serialize (data, options) {\n  const defaults = {\n    binary: true\n  }\n  options = Object.assign({}, defaults, options)\n\n  data = ensureManifoldness(data)\n  return options.binary ? binarySerializer(data, options) : asciiSerializer(data, options)\n}\n\nmodule.exports = {\n  mimeType,\n  serialize\n}\n\n},{\"./CSGToStla\":125,\"./CSGToStlb\":126,\"@jscad/io-utils\":92}],128:[function(require,module,exports){\n// units for converting CSS2 points/length, i.e. CSS2 value / pxPmm\nconst pxPmm = 1 / 0.2822222 // used for scaling SVG coordinates(PX) to CAG coordinates(MM)\nconst inchMM = 1 / (1 / 0.039370) // used for scaling SVG coordinates(IN) to CAG coordinates(MM)\nconst ptMM = 1 / (1 / 0.039370 / 72) // used for scaling SVG coordinates(IN) to CAG coordinates(MM)\nconst pcMM = 1 / (1 / 0.039370 / 72 * 12) // used for scaling SVG coordinates(PC) to CAG coordinates(MM)\nconst cssPxUnit = 0.2822222 // standard pixel size at arms length on 90dpi screens\n\n// standard SVG named colors (sRGB values)\nconst svgColors = {\n  'aliceblue': [240, 248, 255],\n  'antiquewhite': [250, 235, 215],\n  'aqua': [0, 255, 255],\n  'aquamarine': [127, 255, 212],\n  'azure': [240, 255, 255],\n  'beige': [245, 245, 220],\n  'bisque': [255, 228, 196],\n  'black': [0, 0, 0],\n  'blanchedalmond': [255, 235, 205],\n  'blue': [0, 0, 255],\n  'blueviolet': [138, 43, 226],\n  'brown': [165, 42, 42],\n  'burlywood': [222, 184, 135],\n  'cadetblue': [95, 158, 160],\n  'chartreuse': [127, 255, 0],\n  'chocolate': [210, 105, 30],\n  'coral': [255, 127, 80],\n  'cornflowerblue': [100, 149, 237],\n  'cornsilk': [255, 248, 220],\n  'crimson': [220, 20, 60],\n  'cyan': [0, 255, 255],\n  'darkblue': [0, 0, 139],\n  'darkcyan': [0, 139, 139],\n  'darkgoldenrod': [184, 134, 11],\n  'darkgray': [169, 169, 169],\n  'darkgreen': [0, 100, 0],\n  'darkgrey': [169, 169, 169],\n  'darkkhaki': [189, 183, 107],\n  'darkmagenta': [139, 0, 139],\n  'darkolivegreen': [85, 107, 47],\n  'darkorange': [255, 140, 0],\n  'darkorchid': [153, 50, 204],\n  'darkred': [139, 0, 0],\n  'darksalmon': [233, 150, 122],\n  'darkseagreen': [143, 188, 143],\n  'darkslateblue': [72, 61, 139],\n  'darkslategray': [47, 79, 79],\n  'darkslategrey': [47, 79, 79],\n  'darkturquoise': [0, 206, 209],\n  'darkviolet': [148, 0, 211],\n  'deeppink': [255, 20, 147],\n  'deepskyblue': [0, 191, 255],\n  'dimgray': [105, 105, 105],\n  'dimgrey': [105, 105, 105],\n  'dodgerblue': [30, 144, 255],\n  'firebrick': [178, 34, 34],\n  'floralwhite': [255, 250, 240],\n  'forestgreen': [34, 139, 34],\n  'fuchsia': [255, 0, 255],\n  'gainsboro': [220, 220, 220],\n  'ghostwhite': [248, 248, 255],\n  'gold': [255, 215, 0],\n  'goldenrod': [218, 165, 32],\n  'gray': [128, 128, 128],\n  'grey': [128, 128, 128],\n  'green': [0, 128, 0],\n  'greenyellow': [173, 255, 47],\n  'honeydew': [240, 255, 240],\n  'hotpink': [255, 105, 180],\n  'indianred': [205, 92, 92],\n  'indigo': [75, 0, 130],\n  'ivory': [255, 255, 240],\n  'khaki': [240, 230, 140],\n  'lavender': [230, 230, 250],\n  'lavenderblush': [255, 240, 245],\n  'lawngreen': [124, 252, 0],\n  'lemonchiffon': [255, 250, 205],\n  'lightblue': [173, 216, 230],\n  'lightcoral': [240, 128, 128],\n  'lightcyan': [224, 255, 255],\n  'lightgoldenrodyellow': [250, 250, 210],\n  'lightgray': [211, 211, 211],\n  'lightgreen': [144, 238, 144],\n  'lightgrey': [211, 211, 211],\n  'lightpink': [255, 182, 193],\n  'lightsalmon': [255, 160, 122],\n  'lightseagreen': [32, 178, 170],\n  'lightskyblue': [135, 206, 250],\n  'lightslategray': [119, 136, 153],\n  'lightslategrey': [119, 136, 153],\n  'lightsteelblue': [176, 196, 222],\n  'lightyellow': [255, 255, 224],\n  'lime': [0, 255, 0],\n  'limegreen': [50, 205, 50],\n  'linen': [250, 240, 230],\n  'magenta': [255, 0, 255],\n  'maroon': [128, 0, 0],\n  'mediumaquamarine': [102, 205, 170],\n  'mediumblue': [0, 0, 205],\n  'mediumorchid': [186, 85, 211],\n  'mediumpurple': [147, 112, 219],\n  'mediumseagreen': [60, 179, 113],\n  'mediumslateblue': [123, 104, 238],\n  'mediumspringgreen': [0, 250, 154],\n  'mediumturquoise': [72, 209, 204],\n  'mediumvioletred': [199, 21, 133],\n  'midnightblue': [25, 25, 112],\n  'mintcream': [245, 255, 250],\n  'mistyrose': [255, 228, 225],\n  'moccasin': [255, 228, 181],\n  'navajowhite': [255, 222, 173],\n  'navy': [0, 0, 128],\n  'oldlace': [253, 245, 230],\n  'olive': [128, 128, 0],\n  'olivedrab': [107, 142, 35],\n  'orange': [255, 165, 0],\n  'orangered': [255, 69, 0],\n  'orchid': [218, 112, 214],\n  'palegoldenrod': [238, 232, 170],\n  'palegreen': [152, 251, 152],\n  'paleturquoise': [175, 238, 238],\n  'palevioletred': [219, 112, 147],\n  'papayawhip': [255, 239, 213],\n  'peachpuff': [255, 218, 185],\n  'peru': [205, 133, 63],\n  'pink': [255, 192, 203],\n  'plum': [221, 160, 221],\n  'powderblue': [176, 224, 230],\n  'purple': [128, 0, 128],\n  'red': [255, 0, 0],\n  'rosybrown': [188, 143, 143],\n  'royalblue': [65, 105, 225],\n  'saddlebrown': [139, 69, 19],\n  'salmon': [250, 128, 114],\n  'sandybrown': [244, 164, 96],\n  'seagreen': [46, 139, 87],\n  'seashell': [255, 245, 238],\n  'sienna': [160, 82, 45],\n  'silver': [192, 192, 192],\n  'skyblue': [135, 206, 235],\n  'slateblue': [106, 90, 205],\n  'slategray': [112, 128, 144],\n  'slategrey': [112, 128, 144],\n  'snow': [255, 250, 250],\n  'springgreen': [0, 255, 127],\n  'steelblue': [70, 130, 180],\n  'tan': [210, 180, 140],\n  'teal': [0, 128, 128],\n  'thistle': [216, 191, 216],\n  'tomato': [255, 99, 71],\n  'turquoise': [64, 224, 208],\n  'violet': [238, 130, 238],\n  'wheat': [245, 222, 179],\n  'white': [255, 255, 255],\n  'whitesmoke': [245, 245, 245],\n  'yellow': [255, 255, 0],\n  'yellowgreen': [154, 205, 50]\n}\n\nmodule.exports = {\n  pxPmm,\n  inchMM,\n  ptMM,\n  pcMM,\n  cssPxUnit,\n  svgColors\n}\n\n},{}],129:[function(require,module,exports){\nconst {inchMM, ptMM, pcMM, svgColors} = require('./constants')\n\n// Calculate the CAG length/size from the given SVG value (float)\nconst svg2cagX = function (v, svgUnitsPmm) {\n  return (v / svgUnitsPmm[0])\n}\n\nconst svg2cagY = function (v, svgUnitsPmm) {\n  return 0 - (v / svgUnitsPmm[1])\n}\n\n// Calculate the CAG length/size from the given CSS value (string)\nconst cagLengthX = function (css, svgUnitsPmm, svgUnitsX) {\n  if (css.indexOf('%') < 0) {\n    return css2cag(css, svgUnitsPmm[0])\n  }\n  // calculate the units as a percentage of the width\n  var v = parseFloat(css) // number part\n  if (isNaN(v)) { return 0.0 }\n  if (v === 0) return v\n  v = (v / 100) * svgUnitsX\n  // convert the units to mm\n  v = v / svgUnitsPmm[0]\n  // return v;\n  return Math.round(v / -100000) * -100000\n}\n\nconst cagLengthY = function (css, svgUnitsPmm, svgUnitsY) {\n  if (css.indexOf('%') < 0) {\n    return css2cag(css, svgUnitsPmm[1])\n  }\n  // calculate the units as a percentage of the width\n  var v = parseFloat(css) // number part\n  if (isNaN(v)) { return 0.0 }\n  if (v === 0) return v\n  v = (v / 100) * svgUnitsY\n  // convert the units to mm\n  v = v / svgUnitsPmm[1]\n  // return v;\n  return Math.round(v / -100000) * -100000\n}\n\nconst cagLengthP = function (css, svgUnitsPmm, svgUnitsV) {\n  if (css.indexOf('%') < 0) {\n    return css2cag(css, svgUnitsPmm[1])\n  }\n  // calculate the units as a percentage of the viewport\n  var v = parseFloat(css) // number part\n  if (isNaN(v)) { return 0.0 }\n  if (v === 0) return v\n  v = (v / 100) * svgUnitsV\n  // convert the units to mm\n  v = v / svgUnitsPmm[0] // FIXME should this use X units?\n  return v\n}\n\nconst css2cag = function (css, unit) {\n// console.log('css2cag('+css+','+unit+')');\n  var v = parseFloat(css) // number part\n  if (isNaN(v)) { return 0.0 }\n  if (v === 0) return v\n  if (css.search(/EM/i) > 0) { // FIXME self assignment , useless ?\n    // v = v // font size\n  } else\n  if (css.search(/EX/i) > 0) { // FIXME self assignment , useless ?\n    // v = v // x-height of font\n  } else\n  if (css.search(/MM/i) > 0) { // FIXME self assignment , useless ?\n    // v = v // absolute millimeters\n  } else\n  if (css.search(/CM/i) > 0) {\n    v = (v * 10) // absolute centimeters > millimeters\n  } else\n  if (css.search(/IN/i) > 0) {\n    v = (v / inchMM) // absolute inches > millimeters\n  } else\n  if (css.search(/PT/i) > 0) {\n    v = (v / ptMM) // absolute points > millimeters\n  } else\n  if (css.search(/PC/i) > 0) {\n    v = (v / pcMM) // absolute picas > millimeters\n  } else {\n    v = (v / unit) // absolute pixels(units) > millimeters\n  }\n  // console.log('v ('+v+')');\n  return v\n}\n\n// convert the SVG color specification to CAG RGB\nconst cagColor = function (value) {\n  // var rgb = [0,0,0]; // default is black\n  var rgb = null\n  value = value.toLowerCase()\n  if (value in svgColors) {\n    rgb = svgColors[value]\n    rgb = [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255] // converted to 0.0-1.0 values\n  } else {\n    if (value[0] === '#') {\n      if (value.length === 4) {\n      // short HEX specification\n        value = '#' + value[1] + value[1] + value[2] + value[2] + value[3] + value[3]\n      }\n      if (value.length === 7) {\n      // HEX specification\n        rgb = [ parseInt('0x' + value.slice(1, 3)) / 255,\n          parseInt('0x' + value.slice(3, 5)) / 255,\n          parseInt('0x' + value.slice(5, 7)) / 255 ]\n      }\n    } else {\n      var pat = /rgb\\(.+,.+,.+\\)/\n      var s = pat.exec(value)\n      if (s !== null) {\n      // RGB specification\n        s = s[0]\n        s = s.slice(s.indexOf('(') + 1, s.indexOf(')'))\n        rgb = s.split(',')\n        if (s.indexOf('%') > 0) {\n        // rgb(#%,#%,#%)\n          rgb = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])]\n          rgb = [rgb[0] / 100, rgb[1] / 100, rgb[2] / 100] // converted to 0.0-1.0 values\n        } else {\n        // rgb(#,#,#)\n          rgb = [parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])]\n          rgb = [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255] // converted to 0.0-1.0 values\n        }\n      }\n    }\n  }\n  return rgb\n}\n\nconst cssStyle = function (element, name) {\n  if ('STYLE' in element) {\n    var list = element.STYLE\n    var pat = name + '\\\\s*:\\\\s*\\\\S+;'\n    var exp = new RegExp(pat, 'i')\n    var v = exp.exec(list)\n    if (v !== null) {\n      v = v[0]\n      var i = v.length\n      while (v[i] !== ' ' && i > 0) i--\n      v = v.slice(i + 1, v.length - 1)\n      return v\n    }\n  }\n  return null\n}\n\nconst reflect = function (x, y, px, py) {\n  var ox = x - px\n  var oy = y - py\n  if (x === px && y === px) return [x, y]\n  if (x === px) return [x, py + (-oy)]\n  if (y === py) return [px + (-ox), y]\n  return [px + (-ox), py + (-oy)]\n}\n\n// Return the value for the given attribute from the group hiearchy\nconst groupValue = function (svgGroups, name) {\n  var i = svgGroups.length\n  while (i > 0) {\n    const g = svgGroups[i - 1]\n    if (name in g) {\n      return g[name]\n    }\n    i--\n  }\n  return null\n}\n\nmodule.exports = {\n  svg2cagX,\n  svg2cagY,\n  cagLengthX,\n  cagLengthY,\n  cagLengthP,\n  css2cag,\n  cagColor,\n  cssStyle,\n  reflect,\n  groupValue\n}\n\n},{\"./constants\":128}],130:[function(require,module,exports){\n/*\n## License\n\nCopyright (c) 2016 Z3 Development https://github.com/z3dev\n              2017 Mark 'kaosat-dev' Moissette\n\n* The upgrades (direct CSG output from this deserializer) and refactoring\nhave been very kindly sponsored by [Copenhagen Fabrication / Stykka](https://www.stykka.com/)***\n\nAll code released under MIT license\n*/\n\nconst sax = require('sax')\nconst {CAG} = require('@jscad/csg')\n\nconst {cagLengthX, cagLengthY} = require('./helpers')\nconst {svgSvg, svgRect, svgCircle, svgGroup, svgLine, svgPath, svgEllipse, svgPolygon, svgPolyline, svgUse} = require('./svgElementHelpers')\nconst shapesMapCsg = require('./shapesMapCsg')\nconst shapesMapJscad = require('./shapesMapJscad')\n\n/**\n* Parse the given svg data and return either a JSCAD script or a CSG/CAG object\n* @param {string} input svg data\n* @param {string} filename (optional) original filename of AMF source\n* @param {object} options options (optional) anonymous object with:\n* @param {string} [options.version='0.0.0'] version number to add to the metadata\n* @param {boolean} [options.addMetadata=true] toggle injection of metadata (producer, date, source) at the start of the file\n* @param {string} [options.output='jscad'] {String} either jscad or csg to set desired output\n* @param {float} [options.pxPmm] custom pixels per mm unit\n* @return {CSG/string} either a CAG/CSG object or a string (jscad script)\n*/\nconst deserialize = function (input, filename, options) {\n  const defaults = {\n    output: 'jscad'\n  }\n  options = Object.assign({}, defaults, options)\n  return options.output === 'jscad' ? translate(input, filename, options) : deserializeToCSG(input, filename, options)\n}\n\n/**\n * Parse the given SVG source and return a JSCAD script\n * @param  {string} src svg data as text\n * @param  {string} filename (optional) original filename of SVG source\n * @param  {object} options options (optional) anonymous object with:\n *  pxPmm {number: pixels per milimeter for calcuations\n *  version: {string} version number to add to the metadata\n *  addMetadata: {boolean} flag to enable/disable injection of metadata (producer, date, source)\n *\n * @return a CAG (2D CSG) object\n */\nfunction deserializeToCSG (src, filename, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  filename = filename || 'svg'\n  const defaults = {pxPmm: require('./constants').pxPmm, version: '0.0.0', addMetaData: true}\n  options = Object.assign({}, defaults, options)\n  const {pxPmm} = options\n\n  // parse the SVG source\n  createSvgParser(src, pxPmm)\n  if (!svgObj) {\n    throw new Error('SVG parsing failed, no valid svg data retrieved')\n  }\n\n  options && options.statusCallback && options.statusCallback({progress: 50})\n  \n  const result = objectify(svgObj)\n\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return result\n}\n\n/**\n * Parse the given SVG source and return a JSCAD script\n * @param  {string} src svg data as text\n * @param  {string} filename (optional) original filename of SVG source\n * @param  {object} options options (optional) anonymous object with:\n *  pxPmm {number: pixels per milimeter for calcuations\n *  version: {string} version number to add to the metadata\n *  addMetadata: {boolean} flag to enable/disable injection of metadata (producer, date, source)\n *    at the start of the file\n * @return a CAG (2D CSG) object\n */\nfunction translate (src, filename, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  filename = filename || 'svg'\n  const defaults = {pxPmm: require('./constants').pxPmm, version: '0.0.0', addMetaData: true}\n  options = Object.assign({}, defaults, options)\n  const {version, pxPmm, addMetaData} = options\n\n  // parse the SVG source\n  createSvgParser(src, pxPmm)\n  // convert the internal objects to JSCAD code\n  let code = addMetaData ? `//\n  // producer: OpenJSCAD.org ${version} SVG Importer\n  // date: ${new Date()}\n  // source: ${filename}\n  //\n  ` : ''\n\n  if (!svgObj) {\n    throw new Error('SVG parsing failed, no valid svg data retrieved')\n  }\n\n  options && options.statusCallback && options.statusCallback({progress: 50})\n  \n  const scadCode = codify(svgObj)\n  code += scadCode\n\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return code\n}\n\n// FIXE: should these be kept here ? any risk of side effects ?\nlet svgUnitsX\nlet svgUnitsY\nlet svgUnitsV\n// processing controls\nlet svgObjects = [] // named objects\nlet svgGroups = [] // groups of objects\nlet svgInDefs = false // svg DEFS element in process\nlet svgObj = null // svg in object form\nlet svgUnitsPmm = [1, 1]\n\nconst objectify = function (group) {\n  const level = svgGroups.length\n  // add this group to the heiarchy\n  svgGroups.push(group)\n  // create an indent for the generated code\n  let i = level\n  while (i > 0) {\n    i--\n  }\n\n  let lnCAG = new CAG()\n\n  const params = {\n    svgUnitsPmm,\n    svgUnitsX,\n    svgUnitsY,\n    svgUnitsV,\n    level,\n    svgGroups\n  }\n  // generate code for all objects\n  for (i = 0; i < group.objects.length; i++) {\n    const obj = group.objects[i]\n    let onCAG = shapesMapCsg(obj, objectify, params)\n\n    if ('fill' in obj) {\n    // FIXME when CAG supports color\n    //  code += indent+on+' = '+on+'.setColor(['+obj.fill[0]+','+obj.fill[1]+','+obj.fill[2]+']);\\n';\n    }\n    if ('transforms' in obj) {\n      // NOTE: SVG specifications require that transforms are applied in the order given.\n      // But these are applied in the order as required by CSG/CAG\n      let tr = null\n      let ts = null\n      let tt = null\n\n      for (let j = 0; j < obj.transforms.length; j++) {\n        const t = obj.transforms[j]\n        if ('rotate' in t) { tr = t }\n        if ('scale' in t) { ts = t }\n        if ('translate' in t) { tt = t }\n      }\n      if (ts !== null) {\n        const x = ts.scale[0]\n        const y = ts.scale[1]\n        onCAG = onCAG.scale([x, y])\n      }\n      if (tr !== null) {\n        const z = 0 - tr.rotate\n        onCAG = onCAG.rotateZ(z)\n      }\n      if (tt !== null) {\n        const x = cagLengthX(tt.translate[0], svgUnitsPmm, svgUnitsX)\n        const y = (0 - cagLengthY(tt.translate[1], svgUnitsPmm, svgUnitsY))\n        onCAG = onCAG.translate([x, y])\n      }\n    }\n    lnCAG = lnCAG.union(onCAG)\n  }\n\n  // remove this group from the hiearchy\n  svgGroups.pop()\n\n  return lnCAG\n}\n\nconst codify = function (group) {\n  const level = svgGroups.length\n  // add this group to the heiarchy\n  svgGroups.push(group)\n  // create an indent for the generated code\n  var indent = '  '\n  var i = level\n  while (i > 0) {\n    indent += '  '\n    i--\n  }\n  // pre-code\n  var code = ''\n  if (level === 0) {\n    code += 'function main(params) {\\n'\n  }\n  var ln = 'cag' + level\n  code += indent + 'var ' + ln + ' = new CAG();\\n'\n\n  // generate code for all objects\n  for (i = 0; i < group.objects.length; i++) {\n    const obj = group.objects[i]\n    const on = ln + i\n\n    const params = {\n      level,\n      indent,\n      ln,\n      on,\n      svgUnitsPmm,\n      svgUnitsX,\n      svgUnitsY,\n      svgUnitsV,\n      svgGroups\n    }\n\n    let tmpCode = shapesMapJscad(obj, codify, params)\n    code += tmpCode\n\n    if ('fill' in obj) {\n    // FIXME when CAG supports color\n    //  code += indent+on+' = '+on+'.setColor(['+obj.fill[0]+','+obj.fill[1]+','+obj.fill[2]+']);\\n';\n    }\n    if ('transforms' in obj) {\n      // NOTE: SVG specifications require that transforms are applied in the order given.\n      //       But these are applied in the order as required by CSG/CAG\n      let tr = null;\n      let ts = null;\n      let tt = null;\n\n      for (let j = 0; j < obj.transforms.length; j++) {\n        var t = obj.transforms[j]\n        if ('rotate' in t) { tr = t }\n        if ('scale' in t) { ts = t }\n        if ('translate' in t) { tt = t }\n      }\n      if (ts !== null) {\n        const x = ts.scale[0]\n        const y = ts.scale[1]\n        code += indent + on + ' = ' + on + '.scale([' + x + ',' + y + ']);\\n'\n      }\n      if (tr !== null) {\n        console.log('tr', tr)\n        const z = 0 - tr.rotate\n        code += indent + on + ' = ' + on + '.rotateZ(' + z + ');\\n'\n      }\n      if (tt !== null) {\n        const x = cagLengthX(tt.translate[0], svgUnitsPmm, svgUnitsX)\n        const y = (0 - cagLengthY(tt.translate[1], svgUnitsPmm, svgUnitsY))\n        code += indent + on + ' = ' + on + '.translate([' + x + ',' + y + ']);\\n'\n      }\n    }\n    code += indent + ln + ' = ' + ln + '.union(' + on + ');\\n'\n  }\n  // post-code\n  if (level === 0) {\n    code += indent + 'return ' + ln + ';\\n'\n    code += '}\\n'\n  }\n  // remove this group from the hiearchy\n  svgGroups.pop()\n\n  return code\n}\n\nfunction createSvgParser (src, pxPmm) {\n  // create a parser for the XML\n  const parser = sax.parser(false, {trim: true, lowercase: false, position: true})\n  if (pxPmm !== undefined && pxPmm > parser.pxPmm) {\n    parser.pxPmm = pxPmm\n  }\n  // extend the parser with functions\n  parser.onerror = e => console.log('error: line ' + e.line + ', column ' + e.column + ', bad character [' + e.c + ']')\n\n  parser.onopentag = function (node) {\n    // console.log('opentag: '+node.name+' at line '+this.line+' position '+this.column);\n    const objMap = {\n      SVG: svgSvg,\n      G: svgGroup,\n      RECT: svgRect,\n      CIRCLE: svgCircle,\n      ELLIPSE: svgEllipse,\n      LINE: svgLine,\n      POLYLINE: svgPolyline,\n      POLYGON: svgPolygon,\n      PATH: svgPath,\n      USE: svgUse,\n      DEFS: () => { svgInDefs = true; return null; },\n      DESC: () => undefined, // ignored by design\n      TITLE: () => undefined, // ignored by design\n      STYLE: () => undefined, // ignored by design\n      undefined: () => console.log('Warning: Unsupported SVG element: ' + node.name)\n    }\n    let obj = objMap[node.name] ? objMap[node.name](node.attributes, {svgObjects, customPxPmm: pxPmm}) : null\n\n    // case 'SYMBOL':\n    // this is just like an embedded SVG but does NOT render directly, only named\n    // this requires another set of control objects\n    // only add to named objects for later USE\n    //  break;\n    // console.log('node',node)\n\n    if (obj !== null) {\n      // add to named objects if necessary\n      if ('id' in obj) {\n        svgObjects[obj.id] = obj\n      }\n      if (obj.type === 'svg') {\n        // initial SVG (group)\n        svgGroups.push(obj)\n        // console.log('units', obj.unitsPmm)\n        svgUnitsPmm = obj.unitsPmm\n        svgUnitsX = obj.viewW\n        svgUnitsY = obj.viewH\n        svgUnitsV = obj.viewP\n      } else {\n        // add the object to the active group if necessary\n        if (svgGroups.length > 0 && svgInDefs === false) {\n          var group = svgGroups.pop()\n          if ('objects' in group) {\n            // console.log('push object ['+obj.type+']');\n            // console.log(JSON.stringify(obj));\n          // TBD apply presentation attributes from the group\n            group.objects.push(obj)\n          }\n          svgGroups.push(group)\n        }\n        if (obj.type === 'group') {\n          // add GROUPs to the stack\n          svgGroups.push(obj)\n        }\n      }\n    }\n  }\n\n  parser.onclosetag = function (node) {\n    // console.log('closetag: '+node)\n    const popGroup = () => svgGroups.pop()\n    const objMap = {\n      SVG: popGroup,\n      DEFS: () => { svgInDefs = false },\n      USE: popGroup,\n      G: popGroup,\n      undefined: () => {}\n    }\n    const obj = objMap[node] ? objMap[node]() : undefined\n\n    // check for completeness\n    if (svgGroups.length === 0) {\n      svgObj = obj\n    }\n  }\n\n  // parser.onattribute = function (attr) {};\n  // parser.ontext = function (t) {};\n\n  parser.onend = function () {\n  //  console.log('SVG parsing completed')\n  }\n  // start the parser\n  parser.write(src).close()\n  return parser\n}\n\nmodule.exports = {deserialize}\n\n},{\"./constants\":128,\"./helpers\":129,\"./shapesMapCsg\":131,\"./shapesMapJscad\":132,\"./svgElementHelpers\":133,\"@jscad/csg\":22,\"sax\":259}],131:[function(require,module,exports){\nconst {CSG, CAG} = require('@jscad/csg')\nconst {svg2cagX, svg2cagY, cagLengthX, cagLengthY, cagLengthP, reflect, groupValue} = require('./helpers')\nconst {cssPxUnit} = require('./constants')\n\nconst shapesMap = function (obj, codify, params) {\n  const {svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups} = params\n\n  const types = {\n    group: (obj) => {\n      // cag from nested element\n      return codify(obj)\n    },\n\n    rect: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY) => {\n      let x = cagLengthX(obj.x, svgUnitsPmm, svgUnitsX)\n      let y = (0 - cagLengthY(obj.y, svgUnitsPmm, svgUnitsY))\n      const w = cagLengthX(obj.width, svgUnitsPmm, svgUnitsX)\n      const h = cagLengthY(obj.height, svgUnitsPmm, svgUnitsY)\n      const rx = cagLengthX(obj.rx, svgUnitsPmm, svgUnitsX)\n      // const ry = cagLengthY(obj.ry, svgUnitsPmm, svgUnitsY)\n      if (w > 0 && h > 0) {\n        x = (x + (w / 2)).toFixed(4) // position the object via the center\n        y = (y - (h / 2)).toFixed(4) // position the object via the center\n        if (rx === 0) {\n          return CAG.rectangle({center: [x, y], radius: [w / 2, h / 2]})\n        } else {\n          return CAG.roundedRectangle({center: [x, y], radius: [w / 2, h / 2], roundradius: rx})\n        }\n      }\n    },\n\n    circle: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      const x = cagLengthX(obj.x, svgUnitsPmm, svgUnitsX)\n      const y = (0 - cagLengthY(obj.y, svgUnitsPmm, svgUnitsY))\n      const r = cagLengthP(obj.radius, svgUnitsPmm, svgUnitsV)\n\n      if (r > 0) {\n        return CAG.circle({center: [x, y], radius: r})\n      }\n    },\n\n    ellipse: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      const rx = cagLengthX(obj.rx, svgUnitsPmm, svgUnitsX)\n      const ry = cagLengthY(obj.ry, svgUnitsPmm, svgUnitsY)\n      const cx = cagLengthX(obj.cx, svgUnitsPmm, svgUnitsX)\n      const cy = (0 - cagLengthY(obj.cy, svgUnitsPmm, svgUnitsY))\n      if (rx > 0 && ry > 0) {\n        return CAG.ellipse({center: [cx, cy], radius: [rx, ry]})\n      }\n    },\n\n    line: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      const x1 = cagLengthX(obj.x1, svgUnitsPmm, svgUnitsX)\n      const y1 = (0 - cagLengthY(obj.y1, svgUnitsPmm, svgUnitsY))\n      const x2 = cagLengthX(obj.x2, svgUnitsPmm, svgUnitsX)\n      const y2 = (0 - cagLengthY(obj.y2, svgUnitsPmm, svgUnitsY))\n      let r = cssPxUnit // default\n      if ('strokeWidth' in obj) {\n        r = cagLengthP(obj.strokeWidth, svgUnitsPmm, svgUnitsV) / 2\n      } else {\n        const v = groupValue(svgGroups, 'strokeWidth')\n        if (v !== null) {\n          r = cagLengthP(v, svgUnitsPmm, svgUnitsV) / 2\n        }\n      }\n      const tmpObj = new CSG.Path2D([[x1, y1], [x2, y2]], false)\n        .expandToCAG(r, CSG.defaultResolution2D)\n      return tmpObj\n    },\n\n    polygon: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY) => {\n      let points = []\n      for (let j = 0; j < obj.points.length; j++) {\n        const p = obj.points[j]\n        if ('x' in p && 'y' in p) {\n          const x = cagLengthX(p.x, svgUnitsPmm, svgUnitsX)\n          const y = (0 - cagLengthY(p.y, svgUnitsPmm, svgUnitsY))\n          points.push([x, y])\n        }\n      }\n      let tmpObj = new CSG.Path2D(points, true).innerToCAG()\n      return tmpObj\n    },\n\n    polyline: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      let points = []\n      let r = cssPxUnit // default\n      if ('strokeWidth' in obj) {\n        r = cagLengthP(obj.strokeWidth, svgUnitsPmm, svgUnitsV) / 2\n      } else {\n        const v = groupValue(svgGroups, 'strokeWidth')\n        if (v !== null) {\n          r = cagLengthP(v, svgUnitsPmm, svgUnitsV) / 2\n        }\n      }\n      for (let j = 0; j < obj.points.length; j++) {\n        const p = obj.points[j]\n        if ('x' in p && 'y' in p) {\n          let x = cagLengthX(p.x, svgUnitsPmm, svgUnitsX)\n          let y = (0 - cagLengthY(p.y, svgUnitsPmm, svgUnitsY))\n          points.push([x, y])\n        }\n      }\n      let tmpObj = new CSG.Path2D(points, false).expandToCAG(r, CSG.defaultResolution2D)\n      return tmpObj\n    },\n\n    path // paths are a lot more complex, handled seperatly , see below\n  }\n  return types[obj.type](obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups)\n}\n\nmodule.exports = shapesMap\n\nfunction path (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups) {\n  let pathCag = new CAG()\n  let paths = {}\n  const on = '' // not sure\n\n  let r = cssPxUnit // default\n  if ('strokeWidth' in obj) {\n    r = cagLengthP(obj.strokeWidth, svgUnitsPmm, svgUnitsV) / 2\n  } else {\n    const v = groupValue(svgGroups, 'strokeWidth')\n    if (v !== null) {\n      r = cagLengthP(v, svgUnitsPmm, svgUnitsV) / 2\n    }\n  }\n  // Note: All values are SVG values\n  let sx = 0 // starting position\n  let sy = 0\n  let cx = 0 // current position\n  let cy = 0\n  let pi = 0 // current path index\n  let pathName = on + pi // current path name\n  let pc = false // current path closed\n  let bx = 0 // 2nd control point from previous C command\n  let by = 0 // 2nd control point from previous C command\n  let qx = 0 // 2nd control point from previous Q command\n  let qy = 0 // 2nd control point from previous Q command\n\n  for (let j = 0; j < obj.commands.length; j++) {\n    let co = obj.commands[j]\n    let pts = co.p\n    // console.log('postion: ['+cx+','+cy+'] before '+co.c);\n    switch (co.c) {\n      case 'm': // relative move to X,Y\n        // special case, if at beginning of path then treat like absolute M\n        if (j === 0) {\n          cx = 0; cy = 0\n        }\n        // close the previous path\n        if (pi > 0 && pc === false) {\n          paths[pathName] =  paths[pathName].expandToCAG(CSG.defaultResolution2D)\n          // code += indent + pathName + ' = ' + pathName + '.expandToCAG(' + r + ',CSG.defaultResolution2D);\\n'\n        }\n        // open a new path\n        if (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          pi++\n          pathName = on + pi\n          pc = false\n          paths[pathName] = new CSG.Path2D([[svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]], false)\n          sx = cx; sy = cy\n        }\n        // optional implicit relative lineTo (cf SVG spec 8.3.2)\n        while (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'M': // absolute move to X,Y\n        // close the previous path\n        if (pi > 0 && pc === false) {\n          paths[pathName] = paths[pathName].expandToCAG(CSG.defaultResolution2D)\n        }\n        // open a new path\n        if (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          pi++\n          pathName = on + pi\n          pc = false\n          paths[pathName] = new CSG.Path2D([[svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]], false)\n          sx = cx; sy = cy\n        }\n        // optional implicit absolute lineTo (cf SVG spec 8.3.2)\n        while (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'a': // relative elliptical arc\n        while (pts.length >= 7) {\n          let rx = parseFloat(pts.shift())\n          let ry = parseFloat(pts.shift())\n          let ro = 0 - parseFloat(pts.shift())\n          let lf = (pts.shift() === '1')\n          let sf = (pts.shift() === '1')\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendArc([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)], {xradius: svg2cagX(rx, svgUnitsPmm), yradius: svg2cagY(ry, svgUnitsPmm), xaxisrotation: ro, clockwise: sf, large: lf})\n        }\n        break\n      case 'A': // absolute elliptical arc\n        while (pts.length >= 7) {\n          let rx = parseFloat(pts.shift())\n          let ry = parseFloat(pts.shift())\n          let ro = 0 - parseFloat(pts.shift())\n          let lf = (pts.shift() === '1')\n          let sf = (pts.shift() === '1')\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendArc([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)], {xradius: svg2cagX(rx, svgUnitsPmm), yradius: svg2cagY(ry, svgUnitsPmm), xaxisrotation: ro, clockwise: sf, large: lf})\n        }\n        break\n      case 'c': // relative cubic Bézier\n        while (pts.length >= 6) {\n          let x1 = cx + parseFloat(pts.shift())\n          let y1 = cy + parseFloat(pts.shift())\n          bx = cx + parseFloat(pts.shift())\n          by = cy + parseFloat(pts.shift())\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(x1, svgUnitsPmm), svg2cagY(y1, svgUnitsPmm)], [svg2cagX(bx, svgUnitsPmm), svg2cagY(by, svgUnitsPmm)], [svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]])\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'C': // absolute cubic Bézier\n        while (pts.length >= 6) {\n          let x1 = parseFloat(pts.shift())\n          let y1 = parseFloat(pts.shift())\n          bx = parseFloat(pts.shift())\n          by = parseFloat(pts.shift())\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(x1, svgUnitsPmm), svg2cagY(y1, svgUnitsPmm)], [svg2cagX(bx, svgUnitsPmm), svg2cagY(by, svgUnitsPmm)], [svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]])\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'q': // relative quadratic Bézier\n        while (pts.length >= 4) {\n          qx = cx + parseFloat(pts.shift())\n          qy = cy + parseFloat(pts.shift())\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]])\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 'Q': // absolute quadratic Bézier\n        while (pts.length >= 4) {\n          qx = parseFloat(pts.shift())\n          qy = parseFloat(pts.shift())\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]])\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 't': // relative quadratic Bézier shorthand\n        while (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [cx, cy]])\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 'T': // absolute quadratic Bézier shorthand\n        while (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [svg2cagX(qx, svgUnitsPmm), svg2cagY(qy, svgUnitsPmm)], [svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]])\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 's': // relative cubic Bézier shorthand\n        while (pts.length >= 4) {\n          let x1 = bx // reflection of 2nd control point from previous C\n          let y1 = by // reflection of 2nd control point from previous C\n          bx = cx + parseFloat(pts.shift())\n          by = cy + parseFloat(pts.shift())\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(x1, svgUnitsPmm), svg2cagY(y1, svgUnitsPmm)], [svg2cagX(bx, svgUnitsPmm), svg2cagY(by, svgUnitsPmm)], [svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]])\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'S': // absolute cubic Bézier shorthand\n        while (pts.length >= 4) {\n          let x1 = bx // reflection of 2nd control point from previous C\n          let y1 = by // reflection of 2nd control point from previous C\n          bx = parseFloat(pts.shift())\n          by = parseFloat(pts.shift())\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendBezier([[svg2cagX(x1, svgUnitsPmm), svg2cagY(y1, svgUnitsPmm)], [svg2cagX(bx, svgUnitsPmm), svg2cagY(by, svgUnitsPmm)], [svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)]])\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'h': // relative Horzontal line to\n        while (pts.length >= 1) {\n          cx = cx + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'H': // absolute Horzontal line to\n        while (pts.length >= 1) {\n          cx = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'l': // relative line to\n        while (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'L': // absolute line to\n        while (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'v': // relative Vertical line to\n        while (pts.length >= 1) {\n          cy = cy + parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'V': // absolute Vertical line to\n        while (pts.length >= 1) {\n          cy = parseFloat(pts.shift())\n          paths[pathName] = paths[pathName].appendPoint([svg2cagX(cx, svgUnitsPmm), svg2cagY(cy, svgUnitsPmm)])\n        }\n        break\n      case 'z': // close current line\n      case 'Z':\n        let closedpath = paths[pathName].close();\n        paths[pathName] = closedpath.innerToCAG();\n        switch (closedpath.getTurn()) {\n          default:\n          case 'clockwise':\n            pathCag = pathCag.union(paths[pathName])\n            break;\n          case 'counter-clockwise':\n            pathCag = pathCag.subtract(paths[pathName])\n            break;\n        }\n        cx = sx\n        cy = sy // return to the starting point\n        pc = true\n        break\n      default:\n        console.log('Warning: Unknow PATH command [' + co.c + ']')\n        break\n    }\n    // console.log('postion: ['+cx+','+cy+'] after '+co.c);\n  }\n  if (pi > 0 && pc === false) {\n    paths[pathName] = paths[pathName].expandToCAG(r, CSG.defaultResolution2D)\n    pathCag = pathCag.union(paths[pathName])\n  }\n  return pathCag\n}\n\n},{\"./constants\":128,\"./helpers\":129,\"@jscad/csg\":22}],132:[function(require,module,exports){\nconst {svg2cagX, svg2cagY, cagLengthX, cagLengthY, cagLengthP, reflect, groupValue} = require('./helpers')\nconst {cssPxUnit} = require('./constants')\n\nconst shapesMap = function (obj, codify, params) {\n  const {level, indent, on, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups} = params\n\n  const types = {\n    group: (obj) => {\n      let code = codify(obj)\n      code += indent + 'var ' + on + ' = cag' + (level + 1) + ';\\n'\n      return code\n    },\n\n    rect: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY) => {\n      let x = cagLengthX(obj.x, svgUnitsPmm, svgUnitsX)\n      let y = (0 - cagLengthY(obj.y, svgUnitsPmm, svgUnitsY))\n      const w = cagLengthX(obj.width, svgUnitsPmm, svgUnitsX)\n      const h = cagLengthY(obj.height, svgUnitsPmm, svgUnitsY)\n      const rx = cagLengthX(obj.rx, svgUnitsPmm, svgUnitsX)\n      // const ry = cagLengthY(obj.ry, svgUnitsPmm, svgUnitsY)\n      if (w > 0 && h > 0) {\n        x = (x + (w / 2)).toFixed(4) // position the object via the center\n        y = (y - (h / 2)).toFixed(4) // position the object via the center\n        if (rx === 0) {\n          return indent + 'var ' + on + ' = CAG.rectangle({center: [' + x + ',' + y + '], radius: [' + w / 2 + ',' + h / 2 + ']});\\n'\n        } else {\n          return indent + 'var ' + on + ' = CAG.roundedRectangle({center: [' + x + ',' + y + '], radius: [' + w / 2 + ',' + h / 2 + '], roundradius: ' + rx + '});\\n'\n        }\n      }\n    },\n\n    circle: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      const x = cagLengthX(obj.x, svgUnitsPmm, svgUnitsX)\n      const y = (0 - cagLengthY(obj.y, svgUnitsPmm, svgUnitsY))\n      const r = cagLengthP(obj.radius, svgUnitsPmm, svgUnitsV)\n      if (r > 0) {\n        return indent + 'var ' + on + ' = CAG.circle({center: [' + x + ',' + y + '], radius: ' + r + '});\\n'\n      }\n    },\n\n    ellipse: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      const rx = cagLengthX(obj.rx, svgUnitsPmm, svgUnitsX)\n      const ry = cagLengthY(obj.ry, svgUnitsPmm, svgUnitsY)\n      const cx = cagLengthX(obj.cx, svgUnitsPmm, svgUnitsX)\n      const cy = (0 - cagLengthY(obj.cy, svgUnitsPmm, svgUnitsY))\n      if (rx > 0 && ry > 0) {\n        return indent + 'var ' + on + ' = CAG.ellipse({center: [' + cx + ',' + cy + '], radius: [' + rx + ',' + ry + ']});\\n'\n      }\n    },\n\n    line: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      const x1 = cagLengthX(obj.x1, svgUnitsPmm, svgUnitsX)\n      const y1 = (0 - cagLengthY(obj.y1, svgUnitsPmm, svgUnitsY))\n      const x2 = cagLengthX(obj.x2, svgUnitsPmm, svgUnitsX)\n      const y2 = (0 - cagLengthY(obj.y2, svgUnitsPmm, svgUnitsY))\n      let r = cssPxUnit // default\n      if ('strokeWidth' in obj) {\n        r = cagLengthP(obj.strokeWidth, svgUnitsPmm, svgUnitsV) / 2\n      } else {\n        const v = groupValue(svgGroups, 'strokeWidth')\n        if (v !== null) {\n          r = cagLengthP(v, svgUnitsPmm, svgUnitsV) / 2\n        }\n      }\n\n      let tmpCode = indent + 'var ' + on + ' = new CSG.Path2D([[' + x1 + ',' + y1 + '],[' + x2 + ',' + y2 + ']],false);\\n'\n      tmpCode += indent + on + ' = ' + on + '.expandToCAG(' + r + ',CSG.defaultResolution2D);\\n'\n\n      return tmpCode\n    },\n\n    polygon: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY) => {\n      let tmpCode = indent + 'var ' + on + ' = new CSG.Path2D([\\n'\n\n      for (let j = 0; j < obj.points.length; j++) {\n        const p = obj.points[j]\n        if ('x' in p && 'y' in p) {\n          const x = cagLengthX(p.x, svgUnitsPmm, svgUnitsX)\n          const y = (0 - cagLengthY(p.y, svgUnitsPmm, svgUnitsY))\n          tmpCode += indent + '  [' + x + ',' + y + '],\\n'\n        }\n      }\n      tmpCode += indent + '],true);\\n'\n      tmpCode += indent + on + ' = ' + on + '.innerToCAG();\\n'\n      return tmpCode\n    },\n\n    polyline: (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV) => {\n      let r = cssPxUnit // default\n      if ('strokeWidth' in obj) {\n        r = cagLengthP(obj.strokeWidth, svgUnitsPmm, svgUnitsV) / 2\n      } else {\n        const v = groupValue(svgGroups, 'strokeWidth')\n        if (v !== null) {\n          r = cagLengthP(v, svgUnitsPmm, svgUnitsV) / 2\n        }\n      }\n      let tmpCode = indent + 'var ' + on + ' = new CSG.Path2D([\\n'\n      for (let j = 0; j < obj.points.length; j++) {\n        const p = obj.points[j]\n        if ('x' in p && 'y' in p) {\n          var x = cagLengthX(p.x, svgUnitsPmm, svgUnitsX)\n          var y = (0 - cagLengthY(p.y, svgUnitsPmm, svgUnitsY))\n          tmpCode += indent + '  [' + x + ',' + y + '],\\n'\n        }\n      }\n      tmpCode += indent + '],false);\\n'\n      tmpCode += indent + on + ' = ' + on + '.expandToCAG(' + r + ',CSG.defaultResolution2D);\\n'\n      return tmpCode\n    },\n\n    path\n  }\n  return types[obj.type](obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, params, svgGroups)\n}\n\nmodule.exports = shapesMap\n\nfunction path (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, params, svgGroups) {\n  const {indent, on} = params\n  let tmpCode = indent + 'var ' + on + ' = new CAG();\\n'\n\n  let r = cssPxUnit // default\n  if ('strokeWidth' in obj) {\n    r = cagLengthP(obj.strokeWidth, svgUnitsPmm, svgUnitsV) / 2\n  } else {\n    const v = groupValue(svgGroups, 'strokeWidth')\n    if (v !== null) {\n      r = cagLengthP(v, svgUnitsPmm, svgUnitsV) / 2\n    }\n  }\n  // Note: All values are SVG values\n  let sx = 0 // starting position\n  let sy = 0\n  let cx = 0 // current position\n  let cy = 0\n  let pi = 0 // current path index\n  let pathName = on + pi // current path name\n  let pc = false // current path closed\n  let bx = 0 // 2nd control point from previous C command\n  let by = 0 // 2nd control point from previous C command\n  let qx = 0 // 2nd control point from previous Q command\n  let qy = 0 // 2nd control point from previous Q command\n\n  for (let j = 0; j < obj.commands.length; j++) {\n    let co = obj.commands[j]\n    let pts = co.p\n    // console.log('postion: ['+cx+','+cy+'] before '+co.c);\n    switch (co.c) {\n      case 'm': // relative move to X,Y\n        // special case, if at beginning of path then treat like absolute M\n        if (j === 0) {\n          cx = 0; cy = 0\n        }\n        // close the previous path\n        if (pi > 0 && pc === false) {\n          tmpCode += indent + pathName + ' = ' + pathName + '.expandToCAG(' + r + ',CSG.defaultResolution2D);\\n'\n        }\n        // open a new path\n        if (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          pi++\n          pathName = on + pi\n          pc = false\n          tmpCode += indent + 'var ' + pathName + ' = new CSG.Path2D([[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']],false);\\n'\n          sx = cx; sy = cy\n        }\n        // optional implicit relative lineTo (cf SVG spec 8.3.2)\n        while (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'M': // absolute move to X,Y\n        // close the previous path\n        if (pi > 0 && pc === false) {\n          tmpCode += indent + pathName + ' = ' + pathName + '.expandToCAG(' + r + ',CSG.defaultResolution2D);\\n'\n        }\n        // open a new path\n        if (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          pi++\n          pathName = on + pi\n          pc = false\n          tmpCode += indent + 'var ' + pathName + ' = new CSG.Path2D([[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']],false);\\n'\n          sx = cx; sy = cy\n        }\n        // optional implicit absolute lineTo (cf SVG spec 8.3.2)\n        while (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'a': // relative elliptical arc\n        while (pts.length >= 7) {\n          let rx = parseFloat(pts.shift())\n          let ry = parseFloat(pts.shift())\n          let ro = 0 - parseFloat(pts.shift())\n          let lf = (pts.shift() === '1')\n          let sf = (pts.shift() === '1')\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendArc([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + '],{xradius: ' + svg2cagX(rx, svgUnitsPmm) + ',yradius: ' + svg2cagY(ry, svgUnitsPmm) + ',xaxisrotation: ' + ro + ',clockwise: ' + sf + ',large: ' + lf + '});\\n'\n        }\n        break\n      case 'A': // absolute elliptical arc\n        while (pts.length >= 7) {\n          let rx = parseFloat(pts.shift())\n          let ry = parseFloat(pts.shift())\n          let ro = 0 - parseFloat(pts.shift())\n          let lf = (pts.shift() === '1')\n          let sf = (pts.shift() === '1')\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendArc([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + '],{xradius: ' + svg2cagX(rx, svgUnitsPmm) + ',yradius: ' + svg2cagY(ry, svgUnitsPmm) + ',xaxisrotation: ' + ro + ',clockwise: ' + sf + ',large: ' + lf + '});\\n'\n        }\n        break\n      case 'c': // relative cubic Bézier\n        while (pts.length >= 6) {\n          let x1 = cx + parseFloat(pts.shift())\n          let y1 = cy + parseFloat(pts.shift())\n          bx = cx + parseFloat(pts.shift())\n          by = cy + parseFloat(pts.shift())\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(x1, svgUnitsPmm) + ',' + svg2cagY(y1, svgUnitsPmm) + '],[' + svg2cagX(bx, svgUnitsPmm) + ',' + svg2cagY(by, svgUnitsPmm) + '],[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']]);\\n'\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'C': // absolute cubic Bézier\n        while (pts.length >= 6) {\n          let x1 = parseFloat(pts.shift())\n          let y1 = parseFloat(pts.shift())\n          bx = parseFloat(pts.shift())\n          by = parseFloat(pts.shift())\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(x1, svgUnitsPmm) + ',' + svg2cagY(y1, svgUnitsPmm) + '],[' + svg2cagX(bx, svgUnitsPmm) + ',' + svg2cagY(by, svgUnitsPmm) + '],[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']]);\\n'\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'q': // relative quadratic Bézier\n        while (pts.length >= 4) {\n          qx = cx + parseFloat(pts.shift())\n          qy = cy + parseFloat(pts.shift())\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']]);\\n'\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 'Q': // absolute quadratic Bézier\n        while (pts.length >= 4) {\n          qx = parseFloat(pts.shift())\n          qy = parseFloat(pts.shift())\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']]);\\n'\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 't': // relative quadratic Bézier shorthand\n        while (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + cx + ',' + cy + ']]);\\n'\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 'T': // absolute quadratic Bézier shorthand\n        while (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + svg2cagX(qx, svgUnitsPmm) + ',' + svg2cagY(qy, svgUnitsPmm) + '],[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']]);\\n'\n          let rf = reflect(qx, qy, cx, cy)\n          qx = rf[0]\n          qy = rf[1]\n        }\n        break\n      case 's': // relative cubic Bézier shorthand\n        while (pts.length >= 4) {\n          let x1 = bx // reflection of 2nd control point from previous C\n          let y1 = by // reflection of 2nd control point from previous C\n          bx = cx + parseFloat(pts.shift())\n          by = cy + parseFloat(pts.shift())\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(x1, svgUnitsPmm) + ',' + svg2cagY(y1, svgUnitsPmm) + '],[' + svg2cagX(bx, svgUnitsPmm) + ',' + svg2cagY(by, svgUnitsPmm) + '],[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']]);\\n'\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'S': // absolute cubic Bézier shorthand\n        while (pts.length >= 4) {\n          let x1 = bx // reflection of 2nd control point from previous C\n          let y1 = by // reflection of 2nd control point from previous C\n          bx = parseFloat(pts.shift())\n          by = parseFloat(pts.shift())\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendBezier([[' + svg2cagX(x1, svgUnitsPmm) + ',' + svg2cagY(y1, svgUnitsPmm) + '],[' + svg2cagX(bx, svgUnitsPmm) + ',' + svg2cagY(by, svgUnitsPmm) + '],[' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']]);\\n'\n          let rf = reflect(bx, by, cx, cy)\n          bx = rf[0]\n          by = rf[1]\n        }\n        break\n      case 'h': // relative Horzontal line to\n        while (pts.length >= 1) {\n          cx = cx + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'H': // absolute Horzontal line to\n        while (pts.length >= 1) {\n          cx = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'l': // relative line to\n        while (pts.length >= 2) {\n          cx = cx + parseFloat(pts.shift())\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'L': // absolute line to\n        while (pts.length >= 2) {\n          cx = parseFloat(pts.shift())\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'v': // relative Vertical line to\n        while (pts.length >= 1) {\n          cy = cy + parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'V': // absolute Vertical line to\n        while (pts.length >= 1) {\n          cy = parseFloat(pts.shift())\n          tmpCode += indent + pathName + ' = ' + pathName + '.appendPoint([' + svg2cagX(cx, svgUnitsPmm) + ',' + svg2cagY(cy, svgUnitsPmm) + ']);\\n'\n        }\n        break\n      case 'z': // close current line\n      case 'Z':\n        tmpCode += indent + pathName + ' = ' + pathName + '.close();\\n'\n        tmpCode += indent + 'switch (' + pathName + '.getTurn()) {\\n';\n        tmpCode += indent + '  default:\\n';\n        tmpCode += indent + '  case \"clockwise\":\\n';\n        tmpCode += indent + '  ' + pathName + ' = ' + pathName + '.innerToCAG();\\n'\n        tmpCode += indent + '  ' + on + ' = ' + on + '.union(' + pathName + ');\\n'\n        tmpCode += indent + '  break;\\n';\n        tmpCode += indent + '  case \"counter-clockwise\":\\n';\n        tmpCode += indent + '  ' + pathName + ' = ' + pathName + '.innerToCAG();\\n'\n        tmpCode += indent + '  ' + on + ' = ' + on + '.subtract(' + pathName + ');\\n'\n        tmpCode += indent + '  break;\\n';\n        tmpCode += indent + '}\\n';\n        cx = sx\n        cy = sy // return to the starting point\n        pc = true\n        break\n      default:\n        console.log('Warning: Unknow PATH command [' + co.c + ']')\n        break\n    }\n    // console.log('postion: ['+cx+','+cy+'] after '+co.c);\n  }\n  if (pi > 0 && pc === false) {\n    tmpCode += indent + pathName + ' = ' + pathName + '.expandToCAG(' + r + ',CSG.defaultResolution2D);\\n'\n    tmpCode += indent + on + ' = ' + on + '.union(' + pathName + ');\\n'\n  }\n  return tmpCode\n}\n\n},{\"./constants\":128,\"./helpers\":129}],133:[function(require,module,exports){\nconst {cagColor, cssStyle, css2cag} = require('./helpers')\nconst {pxPmm} = require('./constants')\n\nconst svgCore = function (obj, element) {\n  if ('ID' in element) { obj.id = element.ID }\n}\n\nconst svgPresentation = function (obj, element) {\n  // presentation attributes for all\n  if ('DISPLAY' in element) { obj.visible = element.DISPLAY }\n  // presentation attributes for solids\n  if ('COLOR' in element) { obj.fill = cagColor(element.COLOR) }\n  if ('OPACITY' in element) { obj.opacity = element.OPACITY }\n  if ('FILL' in element) {\n    obj.fill = cagColor(element.FILL)\n  } else {\n    var s = cssStyle(element, 'fill')\n    if (s !== null) {\n      obj.fill = cagColor(s)\n    }\n  }\n  if ('FILL-OPACITY' in element) { obj.opacity = element['FILL-OPACITY'] }\n  // presentation attributes for lines\n  if ('STROKE-WIDTH' in element) {\n    obj.strokeWidth = element['STROKE-WIDTH']\n  } else {\n    var sw = cssStyle(element, 'stroke-width')\n    if (sw !== null) {\n      obj.strokeWidth = sw\n    }\n  }\n  if ('STROKE' in element) {\n    obj.stroke = cagColor(element.STROKE)\n  } else {\n    let s = cssStyle(element, 'stroke')\n    if (s !== null) {\n      obj.stroke = cagColor(s)\n    }\n  }\n  if ('STROKE-OPACITY' in element) { obj.strokeOpacity = element['STROKE-OPACITY'] }\n}\n\nconst svgTransforms = function (cag, element) {\n  var list = null\n  if ('TRANSFORM' in element) {\n    list = element.TRANSFORM\n  } else {\n    var s = cssStyle(element, 'transform')\n    if (s !== null) { list = s }\n  }\n  if (list !== null) {\n    cag.transforms = []\n    let exp = new RegExp('\\\\w+\\\\(.+\\\\)', 'i')\n    var v = exp.exec(list)\n    while (v !== null) {\n      let s = exp.lastIndex\n      var e = list.indexOf(')') + 1\n      var t = list.slice(s, e) // the transform\n      t = t.trim()\n      // add the transform to the CAG\n      // which are applied in the order provided\n      var n = t.slice(0, t.indexOf('('))\n      var a = t.slice(t.indexOf('(') + 1, t.indexOf(')')).trim()\n      if (a.indexOf(',') > 0) { a = a.split(',') } else { a = a.split(' ') }\n      let o\n      switch (n) {\n        case 'translate':\n          o = {translate: [a[0], a[1]]}\n          cag.transforms.push(o)\n          break\n        case 'scale':\n          if (a.length === 1) a.push(a[0]) // as per SVG\n          o = {scale: [a[0], a[1]]}\n          cag.transforms.push(o)\n          break\n        case 'rotate':\n          o = {rotate: a}\n          cag.transforms.push(o)\n          break\n        // case 'matrix':\n        // case 'skewX':\n        // case 'skewY':\n        default:\n          break\n      }\n      // shorten the list and continue\n      list = list.slice(e, list.length)\n      v = exp.exec(list)\n    }\n  }\n}\n\nconst svgSvg = function (element, {customPxPmm}) {\n  // default SVG with no viewport\n  var obj = {type: 'svg', x: 0, y: 0, width: '100%', height: '100%', strokeWidth: '1'}\n\n  // default units per mm\n  obj.unitsPmm = [pxPmm, pxPmm]\n\n  if ('PXPMM' in element) {\n    // WOW! a supplied value for pixels per milimeter!!!\n    obj.pxPmm = element.PXPMM\n    obj.unitsPmm = [obj.pxPmm, obj.pxPmm]\n  }\n  if ('WIDTH' in element) { obj.width = element.WIDTH }\n  if ('HEIGHT' in element) { obj.height = element.HEIGHT }\n  if ('VIEWBOX' in element) {\n    var list = element.VIEWBOX.trim()\n    var exp = new RegExp('([\\\\d\\\\.\\\\-]+)[\\\\s,]+([\\\\d\\\\.\\\\-]+)[\\\\s,]+([\\\\d\\\\.\\\\-]+)[\\\\s,]+([\\\\d\\\\.\\\\-]+)', 'i')\n    var v = exp.exec(list)\n    if (v !== null) {\n      obj.viewX = parseFloat(v[1])\n      obj.viewY = parseFloat(v[2])\n      obj.viewW = parseFloat(v[3])\n      obj.viewH = parseFloat(v[4])\n    }\n    // apply the viewbox\n    if (obj.width.indexOf('%') < 0) {\n      // calculate a scaling from width and viewW\n      var s = css2cag(obj.width, customPxPmm) // width in millimeters\n      s = obj.viewW / s\n      // scale the default units\n      // obj.unitsPmm[0] = obj.unitsPmm[0] * s;\n      obj.unitsPmm[0] = s\n    } else {\n      // scale the default units by the width (%)\n      const u = obj.unitsPmm[0] * (parseFloat(obj.width) / 100.0)\n      obj.unitsPmm[0] = u\n    }\n    if (obj.height.indexOf('%') < 0) {\n      // calculate a scaling from height and viewH\n      let s = css2cag(obj.height, pxPmm) // height in millimeters\n      s = obj.viewH / s\n      // scale the default units\n      // obj.unitsPmm[1] = obj.unitsPmm[1] * s;\n      obj.unitsPmm[1] = s\n    } else {\n      // scale the default units by the width (%)\n      const u = obj.unitsPmm[1] * (parseFloat(obj.height) / 100.0)\n      obj.unitsPmm[1] = u\n    }\n  } else {\n    obj.viewX = 0\n    obj.viewY = 0\n    obj.viewW = 1920 / obj.unitsPmm[0] // average screen size / pixels per unit\n    obj.viewH = 1080 / obj.unitsPmm[1] // average screen size / pixels per unit\n  }\n  obj.viewP = Math.sqrt((obj.viewW * obj.viewW) + (obj.viewH * obj.viewH)) / Math.SQRT2\n\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n\n  obj.objects = []\n  // console.log(JSON.stringify(obj));\n  return obj\n}\n\nconst svgEllipse = function (element) {\n  const obj = {type: 'ellipse', cx: '0', cy: '0', rx: '0', ry: '0'}\n  if ('CX' in element) { obj.cx = element.CX }\n  if ('CY' in element) { obj.cy = element.CY }\n  if ('RX' in element) { obj.rx = element.RX }\n  if ('RY' in element) { obj.ry = element.RY }\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n  return obj\n}\n\nconst svgLine = function (element) {\n  var obj = {type: 'line', x1: '0', y1: '0', x2: '0', y2: '0'}\n  if ('X1' in element) { obj.x1 = element.X1 }\n  if ('Y1' in element) { obj.y1 = element.Y1 }\n  if ('X2' in element) { obj.x2 = element.X2 }\n  if ('Y2' in element) { obj.y2 = element.Y2 }\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n  return obj\n}\n\nconst svgListOfPoints = function (list) {\n  var points = []\n  var exp = new RegExp('([\\\\d\\\\-\\\\+\\\\.]+)[\\\\s,]+([\\\\d\\\\-\\\\+\\\\.]+)[\\\\s,]*', 'i')\n  list = list.trim()\n  var v = exp.exec(list)\n  while (v !== null) {\n    var point = v[0]\n    var next = exp.lastIndex + point.length\n    point = {x: v[1], y: v[2]}\n    points.push(point)\n    list = list.slice(next, list.length)\n    v = exp.exec(list)\n  }\n  return points\n}\n\nconst svgPolyline = function (element) {\n  const obj = {type: 'polyline'}\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n\n  if ('POINTS' in element) {\n    obj.points = svgListOfPoints(element.POINTS)\n  }\n  return obj\n}\n\nconst svgPolygon = function (element) {\n  const obj = {type: 'polygon'}\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n\n  if ('POINTS' in element) {\n    obj.points = svgListOfPoints(element.POINTS)\n  }\n  return obj\n}\n\nconst svgRect = function (element) {\n  var obj = {type: 'rect', x: '0', y: '0', rx: '0', ry: '0', width: '0', height: '0'}\n\n  if ('X' in element) { obj.x = element.X }\n  if ('Y' in element) { obj.y = element.Y }\n  if ('RX' in element) {\n    obj.rx = element.RX\n    if (!('RY' in element)) { obj.ry = obj.rx } // by SVG specification\n  }\n  if ('RY' in element) {\n    obj.ry = element.RY\n    if (!('RX' in element)) { obj.rx = obj.ry } // by SVG specification\n  }\n  if (obj.rx !== obj.ry) {\n    console.log('Warning: Unsupported RECT with RX and RY radius')\n  }\n  if ('WIDTH' in element) { obj.width = element.WIDTH }\n  if ('HEIGHT' in element) { obj.height = element.HEIGHT }\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n  return obj\n}\n\nconst svgCircle = function (element) {\n  let obj = {type: 'circle', x: '0', y: '0', radius: '0'}\n\n  if ('CX' in element) { obj.x = element.CX }\n  if ('CY' in element) { obj.y = element.CY }\n  if ('R' in element) { obj.radius = element.R }\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n  return obj\n}\n\nconst svgGroup = function (element) {\n  let obj = {type: 'group'}\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n\n  obj.objects = []\n  return obj\n}\n\n//\n// Convert the PATH element into object representation\n//\nconst svgPath = function (element) {\n  var obj = {type: 'path'}\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  // svgPresentation(obj,element);\n\n  obj.commands = []\n  if ('D' in element) {\n    var co = null // current command\n    var bf = ''\n\n    var i = 0\n    var l = element.D.length\n    while (i < l) {\n      var c = element.D[i]\n      switch (c) {\n      // numbers\n      // FIXME support E notation numbers\n        case '-':\n          if (bf.length > 0) {\n            co.p.push(bf)\n            bf = ''\n          }\n          bf += c\n          break\n        case '.':\n          if (bf.length > 0) {\n            if (bf.indexOf('.') >= 0) {\n              co.p.push(bf)\n              bf = ''\n            }\n          }\n          bf += c\n          break\n        case '0':\n        case '1':\n        case '2':\n        case '3':\n        case '4':\n        case '5':\n        case '6':\n        case '7':\n        case '8':\n        case '9':\n          bf += c\n          break\n        // commands\n        case 'a':\n        case 'A':\n        case 'c':\n        case 'C':\n        case 'h':\n        case 'H':\n        case 'l':\n        case 'L':\n        case 'v':\n        case 'V':\n        case 'm':\n        case 'M':\n        case 'q':\n        case 'Q':\n        case 's':\n        case 'S':\n        case 't':\n        case 'T':\n        case 'z':\n        case 'Z':\n          if (co !== null) {\n            if (bf.length > 0) {\n              co.p.push(bf)\n              bf = ''\n            }\n            obj.commands.push(co)\n          }\n          co = {c: c, p: []}\n          break\n        // white space\n        case ',':\n        case ' ':\n        case '\\n':\n          if (co !== null) {\n            if (bf.length > 0) {\n              co.p.push(bf)\n              bf = ''\n            }\n          }\n          break\n        default:\n          break\n      }\n      i++\n    }\n    if (i === l && co !== null) {\n      if (bf.length > 0) {\n        co.p.push(bf)\n      }\n      obj.commands.push(co)\n    }\n  }\n  return obj\n}\n\n// generate GROUP with attributes from USE element\n// - except X,Y,HEIGHT,WIDTH,XLINK:HREF\n// - append translate(x,y) if X,Y available\n// deep clone the referenced OBJECT and add to group\n// - clone using JSON.parse(JSON.stringify(obj))\nconst svgUse = function (element, {svgObjects}) {\n  var obj = {type: 'group'}\n  // transforms\n  svgTransforms(obj, element)\n  // core attributes\n  svgCore(obj, element)\n  // presentation attributes\n  svgPresentation(obj, element)\n\n  if ('X' in element && 'Y' in element) {\n    if (!('transforms' in obj)) obj.transforms = []\n    var o = {translate: [element.X, element.Y]}\n    obj.transforms.push(o)\n  }\n\n  obj.objects = []\n  if ('XLINK:HREF' in element) {\n  // lookup the named object\n    var ref = element['XLINK:HREF']\n    if (ref[0] === '#') { ref = ref.slice(1, ref.length) }\n    if (svgObjects[ref] !== undefined) {\n      ref = svgObjects[ref]\n      ref = JSON.parse(JSON.stringify(ref))\n      obj.objects.push(ref)\n    }\n  }\n  return obj\n}\n\nmodule.exports = {\n  svgCore,\n  svgPresentation,\n  svgSvg,\n  svgRect,\n  svgCircle,\n  svgEllipse,\n  svgLine,\n  svgPolyline,\n  svgPolygon,\n  svgGroup,\n  svgPath,\n  svgUse\n}\n\n},{\"./constants\":128,\"./helpers\":129}],134:[function(require,module,exports){\nconst {CSG} = require('@jscad/csg')\nconst stringify = require('onml/lib/stringify')\n\nconst mimeType = 'image/svg+xml'\n\nconst serialize = function (cagObject, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  var decimals = 1000\n\n  // mirror the CAG about the X axis in order to generate paths into the POSITIVE direction\n  var plane = new CSG.Plane(CSG.Vector3D.Create(0, 1, 0), 0)\n  var cag = cagObject.transform(CSG.Matrix4x4.mirroring(plane))\n\n  var bounds = cag.getBounds()\n  var paths = cag.getOutlinePaths()\n  var width = Math.round((bounds[1].x - bounds[0].x) * decimals) / decimals\n  var height = Math.round((bounds[1].y - bounds[0].y) * decimals) / decimals\n\n  var body = ['svg',\n    {\n      width: width + 'mm',\n      height: height + 'mm',\n      viewBox: ('0 0 ' + width + ' ' + height),\n      version: '1.1',\n      baseProfile: 'tiny',\n      xmlns: 'http://www.w3.org/2000/svg',\n      'xmlns:xlink': 'http://www.w3.org/1999/xlink'\n    },\n    PathsToSvg(paths, bounds)\n  ]\n\n  var svg = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated by OpenJSCAD.org -->\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1 Tiny//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd\">\n${stringify(body)}`\n\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return [svg]\n}\n\nconst PathsToSvg = function (paths, bounds, options) {\n  // calculate offsets in order to create paths orientated from the 0,0 axis\n  var xoffset = 0 - bounds[0].x\n  var yoffset = 0 - bounds[0].y\n\n  return paths.reduce(function (res, path, i) {\n    options && options.statusCallback && options.statusCallback({progress: 100 * i / paths.length})\n    return res.concat([['path', {d: dPath(path, xoffset, yoffset)}]])\n  }, ['g'])\n}\n\nconst dPath = function (path, xoffset, yoffset) {\n  var pointindex\n  var str = ''\n  var numpointsClosed = path.points.length + (path.closed ? 1 : 0)\n  for (pointindex = 0; pointindex < numpointsClosed; pointindex++) {\n    var pointindexwrapped = pointindex\n    if (pointindexwrapped >= path.points.length) pointindexwrapped -= path.points.length\n    var point = path.points[pointindexwrapped]\n    if (pointindex > 0) {\n      str += `L${(point.x + xoffset)} ${(point.y + yoffset)}`\n    } else {\n      str += `M${(point.x + xoffset)} ${(point.y + yoffset)}`\n    }\n  }\n  return str\n}\n\nmodule.exports = {\n  serialize,\n  mimeType\n}\n\n},{\"@jscad/csg\":22,\"onml/lib/stringify\":237}],135:[function(require,module,exports){\n// import xmldom from 'xmldom'\nconst xmldom = require('xmldom')\nconst { ensureManifoldness } = require('@jscad/io-utils')\n\nconst mimeType = 'model/x3d+xml'\n\nconst XMLSerializer = xmldom.XMLSerializer\n// NOTE: might be useful :https://github.com/jindw/xmldom/pull/152/commits/be5176ece6fa1591daef96a5f361aaacaa445175\n\nfunction serialize (CSG, options) {\n  options && options.statusCallback && options.statusCallback({progress: 0})\n  CSG = ensureManifoldness(CSG)\n  const DOMImplementation = typeof document !== 'undefined' ? document.implementation : new xmldom.DOMImplementation()\n  // materialPolygonLists\n  // key: a color string (e.g. \"0 1 1\" for yellow)\n  // value: an array of strings specifying polygons of this color\n  //        (as space-separated indices into vertexCoords)\n  var materialPolygonLists = {}\n  // list of coordinates (as \"x y z\" strings)\n  var vertexCoords = []\n  // map to look up the index in vertexCoords of a given vertex\n  var vertexTagToCoordIndexMap = {}\n\n  CSG.polygons.map(function (p, i) {\n    var red = 0\n    var green = 0\n    var blue = 1 // default color is blue\n    if (p.shared && p.shared.color) {\n      red = p.shared.color[0]\n      green = p.shared.color[1]\n      blue = p.shared.color[2]\n    }\n\n    var polygonVertexIndices = []\n    var numvertices = p.vertices.length\n    var vertex\n    for (var i = 0; i < numvertices; i++) {\n      vertex = p.vertices[i]\n      if (!(vertex.getTag() in vertexTagToCoordIndexMap)) {\n        vertexCoords.push(vertex.pos._x.toString() + ' ' +\n          vertex.pos._y.toString() + ' ' +\n          vertex.pos._z.toString()\n        )\n        vertexTagToCoordIndexMap[vertex.getTag()] = vertexCoords.length - 1\n      }\n      polygonVertexIndices.push(vertexTagToCoordIndexMap[vertex.getTag()])\n    }\n\n    var polygonString = polygonVertexIndices.join(' ')\n\n    var colorString = red.toString() + ' ' + green.toString() + ' ' + blue.toString()\n    if (!(colorString in materialPolygonLists)) {\n      materialPolygonLists[colorString] = []\n    }\n    // add this polygonString to the list of colorString-colored polygons\n    materialPolygonLists[colorString].push(polygonString)\n    options && options.statusCallback && options.statusCallback({progress: 100 * i / CSG.polygons.length})\n  })\n\n  // create output document\n  var docType = DOMImplementation.createDocumentType('X3D',\n    'ISO//Web3D//DTD X3D 3.1//EN', 'http://www.web3d.org/specifications/x3d-3.1.dtd')\n  var exportDoc = DOMImplementation.createDocument(null, 'X3D', docType)\n  exportDoc.insertBefore(\n    exportDoc.createProcessingInstruction('xml', 'version=\"1.0\" encoding=\"UTF-8\"'),\n    exportDoc.doctype)\n\n  var exportRoot = exportDoc.getElementsByTagName('X3D')[0]\n  exportRoot.setAttribute('profile', 'Interchange')\n  exportRoot.setAttribute('version', '3.1')\n  exportRoot.setAttribute('xsd:noNamespaceSchemaLocation', 'http://www.web3d.org/specifications/x3d-3.1.xsd')\n  exportRoot.setAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema-instance')\n\n  var exportScene = exportDoc.createElement('Scene')\n  exportRoot.appendChild(exportScene)\n\n  /*\n      For each color, create a shape made of an appropriately colored\n      material which contains all polygons that are this color.\n\n      The first shape will contain the definition of all vertices,\n      (<Coordinate DEF=\"coords_mesh\"/>), which will be referenced by\n      subsequent shapes.\n    */\n  var coordsMeshDefined = false\n  for (var colorString in materialPolygonLists) {\n    var polygonList = materialPolygonLists[colorString]\n    var shape = exportDoc.createElement('Shape')\n    exportScene.appendChild(shape)\n\n    var appearance = exportDoc.createElement('Appearance')\n    shape.appendChild(appearance)\n\n    var material = exportDoc.createElement('Material')\n    appearance.appendChild(material)\n    material.setAttribute('diffuseColor', colorString)\n    material.setAttribute('ambientIntensity', '1.0')\n\n    var ifs = exportDoc.createElement('IndexedFaceSet')\n    shape.appendChild(ifs)\n    ifs.setAttribute('solid', 'true')\n    ifs.setAttribute('coordIndex', polygonList.join(' -1 ') + ' -1')\n\n    var coordinate = exportDoc.createElement('Coordinate')\n    ifs.appendChild(coordinate)\n    if (coordsMeshDefined) {\n      coordinate.setAttribute('USE', 'coords_mesh')\n    } else {\n      coordinate.setAttribute('DEF', 'coords_mesh')\n      coordinate.setAttribute('point', vertexCoords.join(' '))\n      coordsMeshDefined = true\n    }\n  }\n\n  const x3dstring = (new XMLSerializer()).serializeToString(exportDoc)\n  options && options.statusCallback && options.statusCallback({progress: 100})\n  return [x3dstring]\n}\n\nmodule.exports = {\n  serialize,\n  mimeType\n}\n\n},{\"@jscad/io-utils\":92,\"xmldom\":270}],136:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _line = require('./line');\n\nObject.defineProperty(exports, 'Line', {\n  enumerable: true,\n  get: function get() {\n    return _line.Line;\n  }\n});\n\nvar _matrix = require('./matrix');\n\nObject.defineProperty(exports, 'Matrix', {\n  enumerable: true,\n  get: function get() {\n    return _matrix.Matrix;\n  }\n});\n\nvar _plane = require('./plane');\n\nObject.defineProperty(exports, 'Plane', {\n  enumerable: true,\n  get: function get() {\n    return _plane.Plane;\n  }\n});\n\nvar _sylvester = require('./sylvester');\n\nObject.defineProperty(exports, 'Sylvester', {\n  enumerable: true,\n  get: function get() {\n    return _sylvester.Sylvester;\n  }\n});\n\nvar _vector = require('./vector');\n\nObject.defineProperty(exports, 'Vector', {\n  enumerable: true,\n  get: function get() {\n    return _vector.Vector;\n  }\n});\n},{\"./line\":137,\"./matrix\":138,\"./plane\":139,\"./sylvester\":140,\"./vector\":141}],137:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Segment = exports.Line = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // Copyright (c) 2011, Chris Umbel, James Coglan\n\n\nvar _vector = require('./vector');\n\nvar _matrix = require('./matrix');\n\nvar _plane = require('./plane');\n\nvar _sylvester = require('./sylvester');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Line class - depends on Vector, and some methods require Matrix and Plane.\nvar Line = exports.Line = function () {\n  function Line() {\n    _classCallCheck(this, Line);\n  }\n\n  _createClass(Line, [{\n    key: 'eql',\n\n    // Returns true if the argument occupies the same space as the line\n    value: function eql(line) {\n      return this.isParallelTo(line) && this.contains(line.anchor);\n    }\n\n    // Returns a copy of the line\n\n  }, {\n    key: 'dup',\n    value: function dup() {\n      return Line.create(this.anchor, this.direction);\n    }\n\n    // Returns the result of translating the line by the given vector/array\n\n  }, {\n    key: 'translate',\n    value: function translate(vector) {\n      var V = vector.elements || vector;\n      return Line.create([this.anchor.elements[0] + V[0], this.anchor.elements[1] + V[1], this.anchor.elements[2] + (V[2] || 0)], this.direction);\n    }\n\n    // Returns true if the line is parallel to the argument. Here, 'parallel to'\n    // means that the argument's direction is either parallel or antiparallel to\n    // the line's own direction. A line is parallel to a plane if the two do not\n    // have a unique intersection.\n\n  }, {\n    key: 'isParallelTo',\n    value: function isParallelTo(obj) {\n      if (obj.normal || obj.start && obj.end) {\n        return obj.isParallelTo(this);\n      }\n      var theta = this.direction.angleFrom(obj.direction);\n      return Math.abs(theta) <= _sylvester.Sylvester.precision || Math.abs(theta - Math.PI) <= _sylvester.Sylvester.precision;\n    }\n\n    // Returns the line's perpendicular distance from the argument,\n    // which can be a point, a line or a plane\n\n  }, {\n    key: 'distanceFrom',\n    value: function distanceFrom(obj) {\n      if (obj.normal || obj.start && obj.end) {\n        return obj.distanceFrom(this);\n      }\n      if (obj.direction) {\n        // obj is a line\n        if (this.isParallelTo(obj)) {\n          return this.distanceFrom(obj.anchor);\n        }\n        var N = this.direction.cross(obj.direction).toUnitVector().elements;\n        var _A = this.anchor.elements;\n        var B = obj.anchor.elements;\n        return Math.abs((_A[0] - B[0]) * N[0] + (_A[1] - B[1]) * N[1] + (_A[2] - B[2]) * N[2]);\n      }\n\n      // obj is a point\n      var P = obj.elements || obj;\n      var A = this.anchor.elements;\n      var D = this.direction.elements;\n      var PA1 = P[0] - A[0];\n      var PA2 = P[1] - A[1];\n      var PA3 = (P[2] || 0) - A[2];\n      var modPA = Math.sqrt(PA1 * PA1 + PA2 * PA2 + PA3 * PA3);\n      if (modPA === 0) {\n        return 0;\n      }\n\n      // Assumes direction vector is normalized\n      var cosTheta = (PA1 * D[0] + PA2 * D[1] + PA3 * D[2]) / modPA;\n      var sin2 = 1 - cosTheta * cosTheta;\n      return Math.abs(modPA * Math.sqrt(sin2 < 0 ? 0 : sin2));\n    }\n\n    // Returns true iff the argument is a point on the line, or if the argument\n    // is a line segment lying within the receiver\n\n  }, {\n    key: 'contains',\n    value: function contains(obj) {\n      if (obj.start && obj.end) {\n        return this.contains(obj.start) && this.contains(obj.end);\n      }\n      var dist = this.distanceFrom(obj);\n      return dist !== null && dist <= _sylvester.Sylvester.precision;\n    }\n\n    // Returns the distance from the anchor of the given point. Negative values are\n    // returned for points that are in the opposite direction to the line's direction from\n    // the line's anchor point.\n\n  }, {\n    key: 'positionOf',\n    value: function positionOf(point) {\n      if (!this.contains(point)) {\n        return null;\n      }\n      var P = point.elements || point;\n      var A = this.anchor.elements;\n      var D = this.direction.elements;\n      return (P[0] - A[0]) * D[0] + (P[1] - A[1]) * D[1] + ((P[2] || 0) - A[2]) * D[2];\n    }\n\n    // Returns true iff the line lies in the given plane\n\n  }, {\n    key: 'liesIn',\n    value: function liesIn(plane) {\n      return plane.contains(this);\n    }\n\n    // Returns true iff the line has a unique point of intersection with the argument\n\n  }, {\n    key: 'intersects',\n    value: function intersects(obj) {\n      if (obj.normal) {\n        return obj.intersects(this);\n      }\n      return !this.isParallelTo(obj) && this.distanceFrom(obj) <= _sylvester.Sylvester.precision;\n    }\n\n    // Returns the unique intersection point with the argument, if one exists\n\n  }, {\n    key: 'intersectionWith',\n    value: function intersectionWith(obj) {\n      if (obj.normal || obj.start && obj.end) {\n        return obj.intersectionWith(this);\n      }\n      if (!this.intersects(obj)) {\n        return null;\n      }\n      var P = this.anchor.elements;\n      var X = this.direction.elements;\n      var Q = obj.anchor.elements;\n      var Y = obj.direction.elements;\n      var X1 = X[0];\n      var X2 = X[1];\n      var X3 = X[2];\n      var Y1 = Y[0];\n      var Y2 = Y[1];\n      var Y3 = Y[2];\n      var PsubQ1 = P[0] - Q[0];\n      var PsubQ2 = P[1] - Q[1];\n      var PsubQ3 = P[2] - Q[2];\n      var XdotQsubP = -X1 * PsubQ1 - X2 * PsubQ2 - X3 * PsubQ3;\n      var YdotPsubQ = Y1 * PsubQ1 + Y2 * PsubQ2 + Y3 * PsubQ3;\n      var XdotX = X1 * X1 + X2 * X2 + X3 * X3;\n      var YdotY = Y1 * Y1 + Y2 * Y2 + Y3 * Y3;\n      var XdotY = X1 * Y1 + X2 * Y2 + X3 * Y3;\n      var k = (XdotQsubP * YdotY / XdotX + XdotY * YdotPsubQ) / (YdotY - XdotY * XdotY);\n\n      return _vector.Vector.create([P[0] + k * X1, P[1] + k * X2, P[2] + k * X3]);\n    }\n\n    // Returns the point on the line that is closest to the given point or line/line segment\n\n  }, {\n    key: 'pointClosestTo',\n    value: function pointClosestTo(obj) {\n      if (obj.start && obj.end) {\n        // obj is a line segment\n        var _P = obj.pointClosestTo(this);\n        return _P === null ? null : this.pointClosestTo(_P);\n      }\n      if (obj.direction) {\n        // obj is a line\n        if (this.intersects(obj)) {\n          return this.intersectionWith(obj);\n        }\n        if (this.isParallelTo(obj)) {\n          return null;\n        }\n        var _D = this.direction.elements;\n        var E = obj.direction.elements;\n        var _D2 = _D[0];\n        var _D3 = _D[1];\n        var _D4 = _D[2];\n        var E1 = E[0];\n        var E2 = E[1];\n        var E3 = E[2];\n\n        // Create plane containing obj and the shared normal and intersect this with it\n        // Thank you: http://www.cgafaq.info/wiki/Line-line_distance\n        var _x = _D4 * E1 - _D2 * E3;\n        var _y = _D2 * E2 - _D3 * E1;\n        var _z = _D3 * E3 - _D4 * E2;\n        var N = [_x * E3 - _y * E2, _y * E1 - _z * E3, _z * E2 - _x * E1];\n        var _P2 = _plane.Plane.create(obj.anchor, N);\n        return _P2.intersectionWith(this);\n      }\n\n      // obj is a point\n      var P = obj.elements || obj;\n      if (this.contains(P)) {\n        return _vector.Vector.create(P);\n      }\n      var A = this.anchor.elements;\n      var D = this.direction.elements;\n      var D1 = D[0];\n      var D2 = D[1];\n      var D3 = D[2];\n      var A1 = A[0];\n      var A2 = A[1];\n      var A3 = A[2];\n      var x = D1 * (P[1] - A2) - D2 * (P[0] - A1);\n      var y = D2 * ((P[2] || 0) - A3) - D3 * (P[1] - A2);\n      var z = D3 * (P[0] - A1) - D1 * ((P[2] || 0) - A3);\n      var V = _vector.Vector.create([D2 * x - D3 * z, D3 * y - D1 * x, D1 * z - D2 * y]);\n      var k = this.distanceFrom(P) / V.modulus();\n      return _vector.Vector.create([P[0] + V.elements[0] * k, P[1] + V.elements[1] * k, (P[2] || 0) + V.elements[2] * k]);\n    }\n\n    // Returns a copy of the line rotated by t radians about the given line. Works by\n    // finding the argument's closest point to this line's anchor point (call this C) and\n    // rotating the anchor about C. Also rotates the line's direction about the argument's.\n    // Be careful with this - the rotation axis' direction affects the outcome!\n\n  }, {\n    key: 'rotate',\n    value: function rotate(t, line) {\n      // If we're working in 2D\n      if (typeof line.direction === 'undefined') {\n        line = Line.create(line.to3D(), _vector.Vector.k);\n      }\n      var R = _matrix.Matrix.Rotation(t, line.direction).elements;\n      var C = line.pointClosestTo(this.anchor).elements;\n      var A = this.anchor.elements;\n      var D = this.direction.elements;\n      var C1 = C[0];\n      var C2 = C[1];\n      var C3 = C[2];\n      var A1 = A[0];\n      var A2 = A[1];\n      var A3 = A[2];\n      var x = A1 - C1;\n      var y = A2 - C2;\n      var z = A3 - C3;\n      return Line.create([C1 + R[0][0] * x + R[0][1] * y + R[0][2] * z, C2 + R[1][0] * x + R[1][1] * y + R[1][2] * z, C3 + R[2][0] * x + R[2][1] * y + R[2][2] * z], [R[0][0] * D[0] + R[0][1] * D[1] + R[0][2] * D[2], R[1][0] * D[0] + R[1][1] * D[1] + R[1][2] * D[2], R[2][0] * D[0] + R[2][1] * D[1] + R[2][2] * D[2]]);\n    }\n\n    // Returns a copy of the line with its direction vector reversed.\n    // Useful when using lines for rotations.\n\n  }, {\n    key: 'reverse',\n    value: function reverse() {\n      return Line.create(this.anchor, this.direction.x(-1));\n    }\n\n    // Returns the line's reflection in the given point or line\n\n  }, {\n    key: 'reflectionIn',\n    value: function reflectionIn(obj) {\n      if (obj.normal) {\n        // obj is a plane\n        var A = this.anchor.elements;\n\n        var D = this.direction.elements;\n        var A1 = A[0];\n        var A2 = A[1];\n        var A3 = A[2];\n        var D1 = D[0];\n        var D2 = D[1];\n        var D3 = D[2];\n        var newA = this.anchor.reflectionIn(obj).elements;\n\n        // Add the line's direction vector to its anchor, then mirror that in the plane\n        var AD1 = A1 + D1;\n\n        var AD2 = A2 + D2;\n        var AD3 = A3 + D3;\n        var Q = obj.pointClosestTo([AD1, AD2, AD3]).elements;\n        var newD = [Q[0] + (Q[0] - AD1) - newA[0], Q[1] + (Q[1] - AD2) - newA[1], Q[2] + (Q[2] - AD3) - newA[2]];\n        return Line.create(newA, newD);\n      }\n      if (obj.direction) {\n        // obj is a line - reflection obtained by rotating PI radians about obj\n        return this.rotate(Math.PI, obj);\n      }\n\n      // obj is a point - just reflect the line's anchor in it\n      var P = obj.elements || obj;\n      return Line.create(this.anchor.reflectionIn([P[0], P[1], P[2] || 0]), this.direction);\n    }\n\n    // Set the line's anchor point and direction.\n\n  }, {\n    key: 'setVectors',\n    value: function setVectors(anchor, direction) {\n      // Need to do this so that line's properties are not\n      // references to the arguments passed in\n      anchor = _vector.Vector.create(anchor);\n      direction = _vector.Vector.create(direction);\n      if (anchor.elements.length === 2) {\n        anchor.elements.push(0);\n      }\n      if (direction.elements.length === 2) {\n        direction.elements.push(0);\n      }\n      if (anchor.elements.length > 3 || direction.elements.length > 3) {\n        return null;\n      }\n      var mod = direction.modulus();\n      if (mod === 0) {\n        return null;\n      }\n      this.anchor = anchor;\n      this.direction = _vector.Vector.create([direction.elements[0] / mod, direction.elements[1] / mod, direction.elements[2] / mod]);\n      return this;\n    }\n\n    // Constructor function\n\n  }], [{\n    key: 'create',\n    value: function create(anchor, direction) {\n      var L = new Line();\n      return L.setVectors(anchor, direction);\n    }\n  }]);\n\n  return Line;\n}();\n\nvar Segment = exports.Segment = function () {\n  function Segment() {\n    _classCallCheck(this, Segment);\n  }\n\n  _createClass(Segment, [{\n    key: 'eql',\n\n    // Returns true iff the line segment is equal to the argument\n    value: function eql(segment) {\n      return this.start.eql(segment.start) && this.end.eql(segment.end) || this.start.eql(segment.end) && this.end.eql(segment.start);\n    }\n\n    // Returns a copy of the line segment\n\n  }, {\n    key: 'dup',\n    value: function dup() {\n      return Segment.create(this.start, this.end);\n    }\n\n    // Returns the length of the line segment\n\n  }, {\n    key: 'length',\n    value: function length() {\n      var A = this.start.elements;\n      var B = this.end.elements;\n      var C1 = B[0] - A[0];\n      var C2 = B[1] - A[1];\n      var C3 = B[2] - A[2];\n      return Math.sqrt(C1 * C1 + C2 * C2 + C3 * C3);\n    }\n\n    // Returns the line segment as a vector equal to its\n    // end point relative to its endpoint\n\n  }, {\n    key: 'toVector',\n    value: function toVector() {\n      var A = this.start.elements;\n      var B = this.end.elements;\n      return _vector.Vector.create([B[0] - A[0], B[1] - A[1], B[2] - A[2]]);\n    }\n\n    // Returns the segment's midpoint as a vector\n\n  }, {\n    key: 'midpoint',\n    value: function midpoint() {\n      var A = this.start.elements;\n      var B = this.end.elements;\n      return _vector.Vector.create([(B[0] + A[0]) / 2, (B[1] + A[1]) / 2, (B[2] + A[2]) / 2]);\n    }\n\n    // Returns the plane that bisects the segment\n\n  }, {\n    key: 'bisectingPlane',\n    value: function bisectingPlane() {\n      return _plane.Plane.create(this.midpoint(), this.toVector());\n    }\n\n    // Returns the result of translating the line by the given vector/array\n\n  }, {\n    key: 'translate',\n    value: function translate(vector) {\n      var V = vector.elements || vector;\n      var S = this.start.elements;\n      var E = this.end.elements;\n      return Segment.create([S[0] + V[0], S[1] + V[1], S[2] + (V[2] || 0)], [E[0] + V[0], E[1] + V[1], E[2] + (V[2] || 0)]);\n    }\n\n    // Returns true iff the line segment is parallel to the argument. It simply forwards\n    // the method call onto its line property.\n\n  }, {\n    key: 'isParallelTo',\n    value: function isParallelTo(obj) {\n      return this.line.isParallelTo(obj);\n    }\n\n    // Returns the distance between the argument and the line segment's closest point to the argument\n\n  }, {\n    key: 'distanceFrom',\n    value: function distanceFrom(obj) {\n      var P = this.pointClosestTo(obj);\n      return P === null ? null : P.distanceFrom(obj);\n    }\n\n    // Returns true iff the given point lies on the segment\n\n  }, {\n    key: 'contains',\n    value: function contains(obj) {\n      if (obj.start && obj.end) {\n        return this.contains(obj.start) && this.contains(obj.end);\n      }\n      var P = (obj.elements || obj).slice();\n      if (P.length === 2) {\n        P.push(0);\n      }\n      if (this.start.eql(P)) {\n        return true;\n      }\n      var S = this.start.elements;\n      var V = _vector.Vector.create([S[0] - P[0], S[1] - P[1], S[2] - (P[2] || 0)]);\n      var vect = this.toVector();\n      return V.isAntiparallelTo(vect) && V.modulus() <= vect.modulus();\n    }\n\n    // Returns true iff the line segment intersects the argument\n\n  }, {\n    key: 'intersects',\n    value: function intersects(obj) {\n      return this.intersectionWith(obj) !== null;\n    }\n\n    // Returns the unique point of intersection with the argument\n\n  }, {\n    key: 'intersectionWith',\n    value: function intersectionWith(obj) {\n      if (!this.line.intersects(obj)) {\n        return null;\n      }\n      var P = this.line.intersectionWith(obj);\n      return this.contains(P) ? P : null;\n    }\n\n    // Returns the point on the line segment closest to the given object\n\n  }, {\n    key: 'pointClosestTo',\n    value: function pointClosestTo(obj) {\n      if (obj.normal) {\n        // obj is a plane\n        var V = this.line.intersectionWith(obj);\n        if (V === null) {\n          return null;\n        }\n        return this.pointClosestTo(V);\n      }\n\n      // obj is a line (segment) or point\n      var P = this.line.pointClosestTo(obj);\n      if (P === null) {\n        return null;\n      }\n      if (this.contains(P)) {\n        return P;\n      }\n\n      return (this.line.positionOf(P) < 0 ? this.start : this.end).dup();\n    }\n\n    // Set the start and end-points of the segment\n\n  }, {\n    key: 'setPoints',\n    value: function setPoints(startPoint, endPoint) {\n      startPoint = _vector.Vector.create(startPoint).to3D();\n      endPoint = _vector.Vector.create(endPoint).to3D();\n      if (startPoint === null || endPoint === null) {\n        return null;\n      }\n      this.line = Line.create(startPoint, endPoint.subtract(startPoint));\n      this.start = startPoint;\n      this.end = endPoint;\n      return this;\n    }\n\n    // Constructor function\n\n  }], [{\n    key: 'create',\n    value: function create(v1, v2) {\n      var S = new Segment();\n      return S.setPoints(v1, v2);\n    }\n  }]);\n\n  return Segment;\n}();\n\n// Axes\n\n\nLine.X = Line.create(_vector.Vector.Zero(3), _vector.Vector.i);\nLine.Y = Line.create(_vector.Vector.Zero(3), _vector.Vector.j);\nLine.Z = Line.create(_vector.Vector.Zero(3), _vector.Vector.k);\nLine.Segment = Segment;\n},{\"./matrix\":138,\"./plane\":139,\"./sylvester\":140,\"./vector\":141}],138:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Matrix = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _fs = require('fs');\n\nvar fs = _interopRequireWildcard(_fs);\n\nvar _sylvester = require('./sylvester');\n\nvar _vector = require('./vector');\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction sign(x) {\n  return x < 0 ? -1 : 1;\n}\n\n// augment a matrix M with identity rows/cols\nfunction identSize(M, m, n, k) {\n  var e = M.elements;\n  var i = k - 1;\n\n  while (i--) {\n    var row = [];\n\n    for (var j = 0; j < n; j++) {\n      row.push(j === i ? 1 : 0);\n    }\n\n    e.unshift(row);\n  }\n\n  for (var _i = k - 1; _i < m; _i++) {\n    while (e[_i].length < n) {\n      e[_i].unshift(0);\n    }\n  }\n\n  return Matrix.create(e); // eslint-disable-line no-use-before-define\n}\n\nfunction pca(X) {\n  var Sigma = X.transpose().x(X).x(1 / X.rows());\n  var svd = Sigma.svd();\n  return {\n    U: svd.U,\n    S: svd.S\n  };\n}\n\nvar Matrix = exports.Matrix = function () {\n  function Matrix() {\n    _classCallCheck(this, Matrix);\n  }\n\n  _createClass(Matrix, [{\n    key: 'solve',\n\n    // solve a system of linear equations (work in progress)\n    value: function solve(b) {\n      var lu = this.lu();\n      b = lu.P.x(b);\n      var y = lu.L.forwardSubstitute(b);\n      var x = lu.U.backSubstitute(y);\n      return lu.P.x(x);\n      // return this.inv().x(b);\n    }\n\n    // project a matrix onto a lower dim\n\n  }, {\n    key: 'pcaProject',\n    value: function pcaProject(k) {\n      var U = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : pca(this).U;\n\n      var Ureduce = U.slice(1, U.rows(), 1, k);\n      return {\n        Z: this.x(Ureduce),\n        U: U\n      };\n    }\n\n    // recover a matrix to a higher dimension\n\n  }, {\n    key: 'pcaRecover',\n    value: function pcaRecover(U) {\n      var k = this.cols();\n      var Ureduce = U.slice(1, U.rows(), 1, k);\n      return this.x(Ureduce.transpose());\n    }\n\n    // grab the upper triangular part of the matrix\n\n  }, {\n    key: 'triu',\n    value: function triu(k) {\n      if (!k) {\n        k = 0;\n      }\n\n      return this.map(function (x, i, j) {\n        return j - i >= k ? x : 0;\n      });\n    }\n\n    // unroll a matrix into a vector\n\n  }, {\n    key: 'unroll',\n    value: function unroll() {\n      var v = [];\n\n      for (var i = 1; i <= this.cols(); i++) {\n        for (var j = 1; j <= this.rows(); j++) {\n          v.push(this.e(j, i));\n        }\n      }\n\n      return _vector.Vector.create(v);\n    }\n\n    // return a sub-block of the matrix\n\n  }, {\n    key: 'slice',\n    value: function slice(startRow, endRow, startCol, endCol) {\n      var x = [];\n\n      if (endRow === 0) {\n        endRow = this.rows();\n      }\n\n      if (endCol === 0) {\n        endCol = this.cols();\n      }\n\n      for (var i = startRow; i <= endRow; i++) {\n        var row = [];\n\n        for (var j = startCol; j <= endCol; j++) {\n          row.push(this.e(i, j));\n        }\n\n        x.push(row);\n      }\n\n      return Matrix.create(x);\n    }\n\n    // Returns element (i,j) of the matrix\n\n  }, {\n    key: 'e',\n    value: function e(i, j) {\n      if (i < 1 || i > this.elements.length || j < 1 || j > this.elements[0].length) {\n        return null;\n      }\n      return this.elements[i - 1][j - 1];\n    }\n\n    // Returns row k of the matrix as a vector\n\n  }, {\n    key: 'row',\n    value: function row(i) {\n      if (i > this.elements.length) {\n        return null;\n      }\n      return _vector.Vector.create(this.elements[i - 1]);\n    }\n\n    // Returns column k of the matrix as a vector\n\n  }, {\n    key: 'col',\n    value: function col(j) {\n      if (j > this.elements[0].length) {\n        return null;\n      }\n      var col = [];\n      var n = this.elements.length;\n      for (var i = 0; i < n; i++) {\n        col.push(this.elements[i][j - 1]);\n      }\n      return _vector.Vector.create(col);\n    }\n\n    // Returns the number of rows/columns the matrix has\n\n  }, {\n    key: 'dimensions',\n    value: function dimensions() {\n      return {\n        rows: this.elements.length,\n        cols: this.elements[0].length\n      };\n    }\n\n    // Returns the number of rows in the matrix\n\n  }, {\n    key: 'rows',\n    value: function rows() {\n      return this.elements.length;\n    }\n\n    // Returns the number of columns in the matrix\n\n  }, {\n    key: 'cols',\n    value: function cols() {\n      return this.elements[0].length;\n    }\n  }, {\n    key: 'approxEql',\n    value: function approxEql(matrix) {\n      return this.eql(matrix, _sylvester.Sylvester.approxPrecision);\n    }\n\n    // Returns true iff the matrix is equal to the argument. You can supply\n    // a vector as the argument, in which case the receiver must be a\n    // one-column matrix equal to the vector.\n\n  }, {\n    key: 'eql',\n    value: function eql(matrix, precision) {\n      var M = matrix.elements || matrix;\n      if (typeof M[0][0] === 'undefined') {\n        M = Matrix.create(M).elements;\n      }\n      if (this.elements.length !== M.length || this.elements[0].length !== M[0].length) {\n        return false;\n      }\n      var i = this.elements.length;\n      var nj = this.elements[0].length;\n      var j = void 0;\n      while (i--) {\n        j = nj;\n        while (j--) {\n          if (Math.abs(this.elements[i][j] - M[i][j]) > (precision || _sylvester.Sylvester.precision)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    // Returns a copy of the matrix\n\n  }, {\n    key: 'dup',\n    value: function dup() {\n      return Matrix.create(this.elements);\n    }\n\n    // Maps the matrix to another matrix (of the same dimensions) according to the given function\n\n  }, {\n    key: 'map',\n    value: function map(fn) {\n      var els = [];\n      var i = this.elements.length;\n      var nj = this.elements[0].length;\n      var j = void 0;\n      while (i--) {\n        j = nj;\n        els[i] = [];\n        while (j--) {\n          els[i][j] = fn(this.elements[i][j], i + 1, j + 1);\n        }\n      }\n      return Matrix.create(els);\n    }\n\n    // Returns true iff the argument has the same dimensions as the matrix\n\n  }, {\n    key: 'isSameSizeAs',\n    value: function isSameSizeAs(matrix) {\n      var M = matrix.elements || matrix;\n      if (typeof M[0][0] === 'undefined') {\n        M = Matrix.create(M).elements;\n      }\n      return this.elements.length === M.length && this.elements[0].length === M[0].length;\n    }\n\n    // Returns the result of adding the argument to the matrix\n\n  }, {\n    key: 'add',\n    value: function add(matrix) {\n      if (typeof matrix === 'number') {\n        return this.map(function (x) {\n          return x + matrix;\n        });\n      }\n\n      var M = matrix.elements || matrix;\n      if (typeof M[0][0] === 'undefined') {\n        M = Matrix.create(M).elements;\n      }\n      if (!this.isSameSizeAs(M)) {\n        return null;\n      }\n      return this.map(function (x, i, j) {\n        return x + M[i - 1][j - 1];\n      });\n    }\n\n    // Returns the result of subtracting the argument from the matrix\n\n  }, {\n    key: 'subtract',\n    value: function subtract(matrix) {\n      if (typeof matrix === 'number') {\n        return this.map(function (x) {\n          return x - matrix;\n        });\n      }\n\n      var M = matrix.elements || matrix;\n      if (typeof M[0][0] === 'undefined') {\n        M = Matrix.create(M).elements;\n      }\n      if (!this.isSameSizeAs(M)) {\n        return null;\n      }\n      return this.map(function (x, i, j) {\n        return x - M[i - 1][j - 1];\n      });\n    }\n\n    // Returns true iff the matrix can multiply the argument from the left\n\n  }, {\n    key: 'canMultiplyFromLeft',\n    value: function canMultiplyFromLeft(matrix) {\n      var M = matrix.elements || matrix;\n      if (typeof M[0][0] === 'undefined') {\n        M = Matrix.create(M).elements;\n      }\n      // this.columns should equal matrix.rows\n      return this.elements[0].length === M.length;\n    }\n\n    // Returns the result of a multiplication-style operation the matrix from the right by the argument.\n    // If the argument is a scalar then just operate on all the elements. If the argument is\n    // a vector, a vector is returned, which saves you having to remember calling\n    // col(1) on the result.\n\n  }, {\n    key: 'mulOp',\n    value: function mulOp(matrix, op) {\n      if (!matrix.elements) {\n        return this.map(function (x) {\n          return op(x, matrix);\n        });\n      }\n\n      var returnVector = Boolean(matrix.modulus);\n      var M = matrix.elements || matrix;\n      if (typeof M[0][0] === 'undefined') {\n        M = Matrix.create(M).elements;\n      }\n      if (!this.canMultiplyFromLeft(M)) {\n        return null;\n      }\n      var e = this.elements;\n      var rowThis = void 0;\n      var rowElem = void 0;\n      var elements = [];\n      var sum = void 0;\n      var m = e.length;\n      var n = M[0].length;\n      var o = e[0].length;\n      var i = m;\n      var j = void 0;\n      var k = void 0;\n\n      while (i--) {\n        rowElem = [];\n        rowThis = e[i];\n        j = n;\n\n        while (j--) {\n          sum = 0;\n          k = o;\n\n          while (k--) {\n            sum += op(rowThis[k], M[k][j]);\n          }\n\n          rowElem[j] = sum;\n        }\n\n        elements[i] = rowElem;\n      }\n\n      var output = Matrix.create(elements);\n      return returnVector ? output.col(1) : output;\n    }\n\n    // Returns the result of dividing the matrix from the right by the argument.\n    // If the argument is a scalar then just divide all the elements. If the argument is\n    // a vector, a vector is returned, which saves you having to remember calling\n    // col(1) on the result.\n\n  }, {\n    key: 'div',\n    value: function div(matrix) {\n      return this.mulOp(matrix, function (x, y) {\n        return x / y;\n      });\n    }\n\n    // Returns the result of multiplying the matrix from the right by the argument.\n    // If the argument is a scalar then just multiply all the elements. If the argument is\n    // a vector, a vector is returned, which saves you having to remember calling\n    // col(1) on the result.\n\n  }, {\n    key: 'multiply',\n    value: function multiply(matrix) {\n      return this.mulOp(matrix, function (x, y) {\n        return x * y;\n      });\n    }\n  }, {\n    key: 'x',\n    value: function x(matrix) {\n      return this.multiply(matrix);\n    }\n  }, {\n    key: 'elementMultiply',\n    value: function elementMultiply(v) {\n      return this.map(function (k, i, j) {\n        return v.e(i, j) * k;\n      });\n    }\n\n    // sum all elements in the matrix\n\n  }, {\n    key: 'sum',\n    value: function sum() {\n      var sum = 0;\n      this.map(function (x) {\n        // eslint-disable-line array-callback-return\n        sum += x;\n      });\n      return sum;\n    }\n\n    // Returns a Vector of each colum averaged.\n\n  }, {\n    key: 'mean',\n    value: function mean() {\n      var dim = this.dimensions();\n      var r = [];\n      for (var i = 1; i <= dim.cols; i++) {\n        r.push(this.col(i).sum() / dim.rows);\n      }\n      return _vector.Vector.create(r);\n    }\n\n    // Returns a Vector of each column's standard deviation\n\n  }, {\n    key: 'std',\n    value: function std() {\n      var dim = this.dimensions();\n      var mMean = this.mean();\n      var r = [];\n      for (var i = 1; i <= dim.cols; i++) {\n        var meanDiff = this.col(i).subtract(mMean.e(i));\n        meanDiff = meanDiff.multiply(meanDiff);\n        r.push(Math.sqrt(meanDiff.sum() / dim.rows));\n      }\n      return _vector.Vector.create(r);\n    }\n  }, {\n    key: 'column',\n    value: function column(n) {\n      return this.col(n);\n    }\n\n    // element-wise log\n\n  }, {\n    key: 'log',\n    value: function log() {\n      return this.map(function (x) {\n        return Math.log(x);\n      });\n    }\n\n    // Returns a submatrix taken from the matrix\n    // Argument order is: start row, start col, nrows, ncols\n    // Element selection wraps if the required index is outside the matrix's bounds, so you could\n    // use this to perform row/column cycling or copy-augmenting.\n\n  }, {\n    key: 'minor',\n    value: function minor(a, b, c, d) {\n      var elements = [];\n      var ni = c;\n      var i = void 0;\n      var nj = void 0;\n      var j = void 0;\n      var rows = this.elements.length;\n      var cols = this.elements[0].length;\n      while (ni--) {\n        i = c - ni - 1;\n        elements[i] = [];\n        nj = d;\n        while (nj--) {\n          j = d - nj - 1;\n          elements[i][j] = this.elements[(a + i - 1) % rows][(b + j - 1) % cols];\n        }\n      }\n      return Matrix.create(elements);\n    }\n\n    // Returns the transpose of the matrix\n\n  }, {\n    key: 'transpose',\n    value: function transpose() {\n      var rows = this.elements.length;\n      var cols = this.elements[0].length;\n      var elements = [];\n      var i = cols;\n      var j = void 0;\n      while (i--) {\n        j = rows;\n        elements[i] = [];\n        while (j--) {\n          elements[i][j] = this.elements[j][i];\n        }\n      }\n      return Matrix.create(elements);\n    }\n\n    // Returns true iff the matrix is square\n\n  }, {\n    key: 'isSquare',\n    value: function isSquare() {\n      return this.elements.length === this.elements[0].length;\n    }\n\n    // Returns the (absolute) largest element of the matrix\n\n  }, {\n    key: 'max',\n    value: function max() {\n      var m = 0;\n      var i = this.elements.length;\n      var nj = this.elements[0].length;\n      var j = void 0;\n      while (i--) {\n        j = nj;\n        while (j--) {\n          if (Math.abs(this.elements[i][j]) > Math.abs(m)) {\n            m = this.elements[i][j];\n          }\n        }\n      }\n      return m;\n    }\n\n    // Returns the indeces of the first match found by reading row-by-row from left to right\n\n  }, {\n    key: 'indexOf',\n    value: function indexOf(x) {\n      var ni = this.elements.length;\n      var i = void 0;\n      var nj = this.elements[0].length;\n      var j = void 0;\n      for (i = 0; i < ni; i++) {\n        for (j = 0; j < nj; j++) {\n          if (this.elements[i][j] === x) {\n            return {\n              i: i + 1,\n              j: j + 1\n            };\n          }\n        }\n      }\n      return null;\n    }\n\n    // If the matrix is square, returns the diagonal elements as a vector.\n    // Otherwise, returns null.\n\n  }, {\n    key: 'diagonal',\n    value: function diagonal() {\n      if (!this.isSquare) {\n        return null;\n      }\n      var els = [];\n      var n = this.elements.length;\n      for (var i = 0; i < n; i++) {\n        els.push(this.elements[i][i]);\n      }\n      return _vector.Vector.create(els);\n    }\n\n    // Make the matrix upper (right) triangular by Gaussian elimination.\n    // This method only adds multiples of rows to other rows. No rows are\n    // scaled up or switched, and the determinant is preserved.\n\n  }, {\n    key: 'toRightTriangular',\n    value: function toRightTriangular() {\n      var M = this.dup();\n      var els = void 0;\n      var n = this.elements.length;\n      var i = void 0;\n      var j = void 0;\n      var np = this.elements[0].length;\n      var p = void 0;\n      for (i = 0; i < n; i++) {\n        if (M.elements[i][i] === 0) {\n          for (j = i + 1; j < n; j++) {\n            if (M.elements[j][i] !== 0) {\n              els = [];\n              for (p = 0; p < np; p++) {\n                els.push(M.elements[i][p] + M.elements[j][p]);\n              }\n              M.elements[i] = els;\n              break;\n            }\n          }\n        }\n        if (M.elements[i][i] !== 0) {\n          for (j = i + 1; j < n; j++) {\n            var multiplier = M.elements[j][i] / M.elements[i][i];\n            els = [];\n            for (p = 0; p < np; p++) {\n              // Elements with column numbers up to an including the number\n              // of the row that we're subtracting can safely be set straight to\n              // zero, since that's the point of this routine and it avoids having\n              // to loop over and correct rounding errors later\n              els.push(p <= i ? 0 : M.elements[j][p] - M.elements[i][p] * multiplier);\n            }\n            M.elements[j] = els;\n          }\n        }\n      }\n      return M;\n    }\n  }, {\n    key: 'toUpperTriangular',\n    value: function toUpperTriangular() {\n      return this.toRightTriangular();\n    }\n\n    // Returns the determinant for square matrices\n\n  }, {\n    key: 'determinant',\n    value: function determinant() {\n      if (!this.isSquare()) {\n        return null;\n      }\n      if (this.cols === 1 && this.rows === 1) {\n        return this.row(1);\n      }\n      if (this.cols === 0 && this.rows === 0) {\n        return 1;\n      }\n      var M = this.toRightTriangular();\n      var det = M.elements[0][0];\n      var n = M.elements.length;\n      for (var i = 1; i < n; i++) {\n        det *= M.elements[i][i];\n      }\n      return det;\n    }\n  }, {\n    key: 'det',\n    value: function det() {\n      return this.determinant();\n    }\n\n    // Returns true iff the matrix is singular\n\n  }, {\n    key: 'isSingular',\n    value: function isSingular() {\n      return this.isSquare() && this.determinant() === 0;\n    }\n\n    // Returns the trace for square matrices\n\n  }, {\n    key: 'trace',\n    value: function trace() {\n      if (!this.isSquare()) {\n        return null;\n      }\n      var tr = this.elements[0][0];\n      var n = this.elements.length;\n      for (var i = 1; i < n; i++) {\n        tr += this.elements[i][i];\n      }\n      return tr;\n    }\n  }, {\n    key: 'tr',\n    value: function tr() {\n      return this.trace();\n    }\n\n    // Returns the rank of the matrix\n\n  }, {\n    key: 'rank',\n    value: function rank() {\n      var M = this.toRightTriangular();\n      var rank = 0;\n      var i = this.elements.length;\n      var nj = this.elements[0].length;\n      var j = void 0;\n      while (i--) {\n        j = nj;\n        while (j--) {\n          if (Math.abs(M.elements[i][j]) > _sylvester.Sylvester.precision) {\n            rank++;\n            break;\n          }\n        }\n      }\n      return rank;\n    }\n  }, {\n    key: 'rk',\n    value: function rk() {\n      return this.rank();\n    }\n\n    // Returns the result of attaching the given argument to the right-hand side of the matrix\n\n  }, {\n    key: 'augment',\n    value: function augment(matrix) {\n      var M = matrix.elements || matrix;\n      if (typeof M[0][0] === 'undefined') {\n        M = Matrix.create(M).elements;\n      }\n      var T = this.dup();\n      var cols = T.elements[0].length;\n      var i = T.elements.length;\n      var nj = M[0].length;\n      var j = void 0;\n      if (i !== M.length) {\n        return null;\n      }\n      while (i--) {\n        j = nj;\n        while (j--) {\n          T.elements[i][cols + j] = M[i][j];\n        }\n      }\n      return T;\n    }\n\n    // Returns the inverse (if one exists) using Gauss-Jordan\n\n  }, {\n    key: 'inverse',\n    value: function inverse() {\n      if (!this.isSquare() || this.isSingular()) {\n        return null;\n      }\n      var n = this.elements.length;\n      var i = n;\n      var j = void 0;\n      var M = this.augment(Matrix.I(n)).toRightTriangular();\n      var np = M.elements[0].length;\n      var p = void 0;\n      var els = void 0;\n      var divisor = void 0;\n\n      var inverseElements = [];\n      // Matrix is non-singular so there will be no zeros on the diagonal\n      // Cycle through rows from last to first\n\n      var newElement = void 0;\n      while (i--) {\n        // First, normalise diagonal elements to 1\n        els = [];\n        inverseElements[i] = [];\n        divisor = M.elements[i][i];\n        for (p = 0; p < np; p++) {\n          newElement = M.elements[i][p] / divisor;\n          els.push(newElement);\n          // Shuffle off the current row of the right hand side into the results\n          // array as it will not be modified by later runs through this loop\n          if (p >= n) {\n            inverseElements[i].push(newElement);\n          }\n        }\n        M.elements[i] = els;\n        // Then, subtract this row from those above it to\n        // give the identity matrix on the left hand side\n        j = i;\n        while (j--) {\n          els = [];\n          for (p = 0; p < np; p++) {\n            els.push(M.elements[j][p] - M.elements[i][p] * M.elements[j][i]);\n          }\n          M.elements[j] = els;\n        }\n      }\n      return Matrix.create(inverseElements);\n    }\n  }, {\n    key: 'inv',\n    value: function inv() {\n      return this.inverse();\n    }\n\n    // Returns the result of rounding all the elements\n\n  }, {\n    key: 'round',\n    value: function round() {\n      return this.map(function (x) {\n        return Math.round(x);\n      });\n    }\n\n    // Returns a copy of the matrix with elements set to the given value if they\n    // differ from it by less than Sylvester.precision\n\n  }, {\n    key: 'snapTo',\n    value: function snapTo(x) {\n      return this.map(function (p) {\n        return Math.abs(p - x) <= _sylvester.Sylvester.precision ? x : p;\n      });\n    }\n\n    // Returns a string representation of the matrix\n\n  }, {\n    key: 'inspect',\n    value: function inspect() {\n      var matrixRows = [];\n      var n = this.elements.length;\n      for (var i = 0; i < n; i++) {\n        matrixRows.push(_vector.Vector.create(this.elements[i]).inspect());\n      }\n      return matrixRows.join('\\n');\n    }\n\n    // Returns a array representation of the matrix\n\n  }, {\n    key: 'toArray',\n    value: function toArray() {\n      var matrixRows = [];\n      var n = this.elements.length;\n      for (var i = 0; i < n; i++) {\n        matrixRows.push(this.elements[i]);\n      }\n      return matrixRows;\n    }\n\n    // Set the matrix's elements from an array. If the argument passed\n    // is a vector, the resulting matrix will be a single column.\n\n  }, {\n    key: 'setElements',\n    value: function setElements(els) {\n      var i = void 0;\n      var j = void 0;\n      var elements = els.elements || els;\n      if (typeof elements[0][0] !== 'undefined') {\n        i = elements.length;\n        this.elements = [];\n        while (i--) {\n          j = elements[i].length;\n          this.elements[i] = [];\n          while (j--) {\n            this.elements[i][j] = elements[i][j];\n          }\n        }\n        return this;\n      }\n      var n = elements.length;\n      this.elements = [];\n      for (i = 0; i < n; i++) {\n        this.elements.push([elements[i]]);\n      }\n      return this;\n    }\n\n    // return the indexes of the columns with the largest value\n    // for each row\n\n  }, {\n    key: 'maxColumnIndexes',\n    value: function maxColumnIndexes() {\n      var maxes = [];\n\n      for (var i = 1; i <= this.rows(); i++) {\n        var max = null;\n        var maxIndex = -1;\n\n        for (var j = 1; j <= this.cols(); j++) {\n          if (max === null || this.e(i, j) > max) {\n            max = this.e(i, j);\n            maxIndex = j;\n          }\n        }\n\n        maxes.push(maxIndex);\n      }\n\n      return _vector.Vector.create(maxes);\n    }\n\n    // return the largest values in each row\n\n  }, {\n    key: 'maxColumns',\n    value: function maxColumns() {\n      var maxes = [];\n\n      for (var i = 1; i <= this.rows(); i++) {\n        var max = null;\n\n        for (var j = 1; j <= this.cols(); j++) {\n          if (max === null || this.e(i, j) > max) {\n            max = this.e(i, j);\n          }\n        }\n\n        maxes.push(max);\n      }\n\n      return _vector.Vector.create(maxes);\n    }\n\n    // return the indexes of the columns with the smallest values\n    // for each row\n\n  }, {\n    key: 'minColumnIndexes',\n    value: function minColumnIndexes() {\n      var mins = [];\n\n      for (var i = 1; i <= this.rows(); i++) {\n        var min = null;\n        var minIndex = -1;\n\n        for (var j = 1; j <= this.cols(); j++) {\n          if (min === null || this.e(i, j) < min) {\n            min = this.e(i, j);\n            minIndex = j;\n          }\n        }\n\n        mins.push(minIndex);\n      }\n\n      return _vector.Vector.create(mins);\n    }\n\n    // return the smallest values in each row\n\n  }, {\n    key: 'minColumns',\n    value: function minColumns() {\n      var mins = [];\n\n      for (var i = 1; i <= this.rows(); i++) {\n        var min = null;\n\n        for (var j = 1; j <= this.cols(); j++) {\n          if (min === null || this.e(i, j) < min) {\n            min = this.e(i, j);\n          }\n        }\n\n        mins.push(min);\n      }\n\n      return _vector.Vector.create(mins);\n    }\n\n    // perorm a partial pivot on the matrix. essentially move the largest\n    // row below-or-including the pivot and replace the pivot's row with it.\n    // a pivot matrix is returned so multiplication can perform the transform.\n\n  }, {\n    key: 'partialPivot',\n    value: function partialPivot(k, j, P, A) {\n      var maxIndex = 0;\n      var maxValue = 0;\n\n      for (var i = k; i <= A.rows(); i++) {\n        if (Math.abs(A.e(i, j)) > maxValue) {\n          maxValue = Math.abs(A.e(k, j));\n          maxIndex = i;\n        }\n      }\n\n      if (maxIndex !== k) {\n        var tmp = A.elements[k - 1];\n        A.elements[k - 1] = A.elements[maxIndex - 1];\n        A.elements[maxIndex - 1] = tmp;\n\n        P.elements[k - 1][k - 1] = 0;\n        P.elements[k - 1][maxIndex - 1] = 1;\n        P.elements[maxIndex - 1][maxIndex - 1] = 0;\n        P.elements[maxIndex - 1][k - 1] = 1;\n      }\n\n      return P;\n    }\n\n    // solve lower-triangular matrix * x = b via forward substitution\n\n  }, {\n    key: 'forwardSubstitute',\n    value: function forwardSubstitute(b) {\n      var xa = [];\n\n      for (var i = 1; i <= this.rows(); i++) {\n        var w = 0;\n\n        for (var j = 1; j < i; j++) {\n          w += this.e(i, j) * xa[j - 1];\n        }\n\n        xa.push((b.e(i) - w) / this.e(i, i));\n      }\n\n      return _vector.Vector.create(xa);\n    }\n\n    // solve an upper-triangular matrix * x = b via back substitution\n\n  }, {\n    key: 'backSubstitute',\n    value: function backSubstitute(b) {\n      var xa = [];\n\n      for (var i = this.rows(); i > 0; i--) {\n        var w = 0;\n\n        for (var j = this.cols(); j > i; j--) {\n          w += this.e(i, j) * xa[this.rows() - j];\n        }\n\n        xa.push((b.e(i) - w) / this.e(i, i));\n      }\n\n      return _vector.Vector.create(xa.reverse());\n    }\n  }, {\n    key: 'svdJs',\n    value: function svdJs() {\n      var A = this;\n      var V = Matrix.I(A.rows());\n      var S = A.transpose();\n      var U = Matrix.I(A.cols());\n      var err = Number.MAX_VALUE;\n      var i = 0;\n      var maxLoop = 100;\n\n      while (err > 2.2737e-13 && i < maxLoop) {\n        var qr = S.transpose().qrJs();\n        S = qr.R;\n        V = V.x(qr.Q);\n        qr = S.transpose().qrJs();\n        U = U.x(qr.Q);\n        S = qr.R;\n\n        var e = S.triu(1).unroll().norm();\n        var f = S.diagonal().norm();\n\n        if (f === 0) {\n          f = 1;\n        }\n\n        err = e / f;\n\n        i++;\n      }\n\n      var ss = S.diagonal();\n      var s = [];\n\n      for (var _i2 = 1; _i2 <= ss.cols(); _i2++) {\n        var ssn = ss.e(_i2);\n        s.push(Math.abs(ssn));\n\n        if (ssn < 0) {\n          for (var j = 0; j < U.rows(); j++) {\n            V.elements[j][_i2 - 1] = -V.elements[j][_i2 - 1];\n          }\n        }\n      }\n\n      return {\n        U: U,\n        S: _vector.Vector.create(s).toDiagonalMatrix(),\n        V: V\n      };\n    }\n\n    // QR decomposition in pure javascript\n\n  }, {\n    key: 'qrJs',\n    value: function qrJs() {\n      var m = this.rows();\n      var n = this.cols();\n      var Q = Matrix.I(m);\n      var A = this;\n\n      for (var k = 1; k < Math.min(m, n); k++) {\n        var ak = A.slice(k, 0, k, k).col(1);\n        var oneZero = [1];\n\n        while (oneZero.length <= m - k) {\n          oneZero.push(0);\n        }\n\n        oneZero = _vector.Vector.create(oneZero);\n        var vk = ak.add(oneZero.x(ak.norm() * sign(ak.e(1))));\n        var Vk = Matrix.create(vk);\n        var Hk = Matrix.I(m - k + 1).subtract(Vk.x(2).x(Vk.transpose()).div(Vk.transpose().x(Vk).e(1, 1)));\n        var Qk = identSize(Hk, m, n, k);\n        A = Qk.x(A);\n        // slow way to compute Q\n        Q = Q.x(Qk);\n      }\n\n      return {\n        Q: Q,\n        R: A\n      };\n    }\n\n    // pure Javascript LU factorization\n\n  }, {\n    key: 'luJs',\n    value: function luJs() {\n      var A = this.dup();\n      var L = Matrix.I(A.rows());\n      var P = Matrix.I(A.rows());\n      var U = Matrix.Zeros(A.rows(), A.cols());\n      var p = 1;\n\n      for (var k = 1; k <= Math.min(A.cols(), A.rows()); k++) {\n        P = A.partialPivot(k, p, P, A, L);\n\n        for (var i = k + 1; i <= A.rows(); i++) {\n          var l = A.e(i, p) / A.e(k, p);\n          L.elements[i - 1][k - 1] = l;\n\n          for (var j = k + 1; j <= A.cols(); j++) {\n            A.elements[i - 1][j - 1] -= A.e(k, j) * l;\n          }\n        }\n\n        for (var _j = k; _j <= A.cols(); _j++) {\n          U.elements[k - 1][_j - 1] = A.e(k, _j);\n        }\n\n        if (p < A.cols()) {\n          p++;\n        }\n      }\n\n      return {\n        L: L,\n        U: U,\n        P: P\n      };\n    }\n\n    // Constructor function\n\n  }], [{\n    key: 'create',\n    value: function create(aElements) {\n      var M = new Matrix().setElements(aElements);\n      return M;\n    }\n\n    // Identity matrix of size n\n\n  }, {\n    key: 'I',\n    value: function I(n) {\n      var els = [];\n      var i = n;\n      var j = void 0;\n      while (i--) {\n        j = n;\n        els[i] = [];\n        while (j--) {\n          els[i][j] = i === j ? 1 : 0;\n        }\n      }\n      return Matrix.create(els);\n    }\n  }, {\n    key: 'loadFile',\n    value: function loadFile(file) {\n      var contents = fs.readFileSync(file, 'utf-8');\n      var matrix = [];\n\n      var rowArray = contents.split('\\n');\n      for (var i = 0; i < rowArray.length; i++) {\n        var d = rowArray[i].split(',');\n        if (d.length > 1) {\n          matrix.push(d);\n        }\n      }\n\n      var M = new Matrix();\n      return M.setElements(matrix);\n    }\n\n    // Diagonal matrix - all off-diagonal elements are zero\n\n  }, {\n    key: 'Diagonal',\n    value: function Diagonal(elements) {\n      var i = elements.length;\n      var M = Matrix.I(i);\n      while (i--) {\n        M.elements[i][i] = elements[i];\n      }\n      return M;\n    }\n\n    // Rotation matrix about some axis. If no axis is\n    // supplied, assume we're after a 2D transform\n\n  }, {\n    key: 'Rotation',\n    value: function Rotation(theta, a) {\n      if (!a) {\n        return Matrix.create([[Math.cos(theta), -Math.sin(theta)], [Math.sin(theta), Math.cos(theta)]]);\n      }\n      var axis = a.dup();\n      if (axis.elements.length !== 3) {\n        return null;\n      }\n      var mod = axis.modulus();\n      var x = axis.elements[0] / mod;\n      var y = axis.elements[1] / mod;\n      var z = axis.elements[2] / mod;\n\n      var s = Math.sin(theta);\n      // Formula derived here: http://www.gamedev.net/reference/articles/article1199.asp\n      // That proof rotates the co-ordinate system so theta\n      // becomes -theta and sin becomes -sin here.\n\n      var c = Math.cos(theta);\n      var t = 1 - c;\n      return Matrix.create([[t * x * x + c, t * x * y - s * z, t * x * z + s * y], [t * x * y + s * z, t * y * y + c, t * y * z - s * x], [t * x * z - s * y, t * y * z + s * x, t * z * z + c]]);\n    }\n\n    // Special case rotations\n\n  }, {\n    key: 'RotationX',\n    value: function RotationX(t) {\n      var c = Math.cos(t);\n      var s = Math.sin(t);\n      return Matrix.create([[1, 0, 0], [0, c, -s], [0, s, c]]);\n    }\n  }, {\n    key: 'RotationY',\n    value: function RotationY(t) {\n      var c = Math.cos(t);\n      var s = Math.sin(t);\n      return Matrix.create([[c, 0, s], [0, 1, 0], [-s, 0, c]]);\n    }\n  }, {\n    key: 'RotationZ',\n    value: function RotationZ(t) {\n      var c = Math.cos(t);\n      var s = Math.sin(t);\n      return Matrix.create([[c, -s, 0], [s, c, 0], [0, 0, 1]]);\n    }\n\n    // Random matrix of n rows, m columns\n\n  }, {\n    key: 'Random',\n    value: function Random(n, m) {\n      if (arguments.length === 1) {\n        m = n;\n      }\n      return Matrix.Zero(n, m).map(function () {\n        return Math.random();\n      });\n    }\n  }, {\n    key: 'Fill',\n    value: function Fill(n, m, v) {\n      if (arguments.length === 2) {\n        v = m;\n        m = n;\n      }\n\n      var els = [];\n      var i = n;\n      var j = void 0;\n\n      while (i--) {\n        j = m;\n        els[i] = [];\n\n        while (j--) {\n          els[i][j] = v;\n        }\n      }\n\n      return Matrix.create(els);\n    }\n\n    // Matrix filled with zeros\n\n  }, {\n    key: 'Zero',\n    value: function Zero(n, m) {\n      return Matrix.Fill(n, m, 0);\n    }\n\n    // Matrix filled with zeros\n\n  }, {\n    key: 'Zeros',\n    value: function Zeros(n, m) {\n      return Matrix.Zero(n, m);\n    }\n\n    // Matrix filled with ones\n\n  }, {\n    key: 'One',\n    value: function One(n, m) {\n      return Matrix.Fill(n, m, 1);\n    }\n\n    // Matrix filled with ones\n\n  }, {\n    key: 'Ones',\n    value: function Ones(n, m) {\n      return Matrix.One(n, m);\n    }\n  }]);\n\n  return Matrix;\n}();\n\n// otherwise use the slower pure Javascript versions\n\n\nMatrix.prototype.svd = Matrix.prototype.svdJs;\nMatrix.prototype.qr = Matrix.prototype.qrJs;\nMatrix.prototype.lu = Matrix.prototype.luJs;\n},{\"./sylvester\":140,\"./vector\":141,\"fs\":152}],139:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Plane = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _line = require('./line');\n\nvar _matrix = require('./matrix');\n\nvar _sylvester = require('./sylvester');\n\nvar _vector = require('./vector');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Plane = exports.Plane = function () {\n  function Plane() {\n    _classCallCheck(this, Plane);\n  }\n\n  _createClass(Plane, [{\n    key: 'eql',\n\n    // Returns true iff the plane occupies the same space as the argument\n    value: function eql(plane) {\n      return this.contains(plane.anchor) && this.isParallelTo(plane);\n    }\n\n    // Returns a copy of the plane\n\n  }, {\n    key: 'dup',\n    value: function dup() {\n      return Plane.create(this.anchor, this.normal);\n    }\n\n    // Returns the result of translating the plane by the given vector\n\n  }, {\n    key: 'translate',\n    value: function translate(vector) {\n      var V = vector.elements || vector;\n      return Plane.create([this.anchor.elements[0] + V[0], this.anchor.elements[1] + V[1], this.anchor.elements[2] + (V[2] || 0)], this.normal);\n    }\n\n    // Returns true iff the plane is parallel to the argument. Will return true\n    // if the planes are equal, or if you give a line and it lies in the plane.\n\n  }, {\n    key: 'isParallelTo',\n    value: function isParallelTo(obj) {\n      var theta = void 0;\n      if (obj.normal) {\n        // obj is a plane\n        theta = this.normal.angleFrom(obj.normal);\n        return Math.abs(theta) <= _sylvester.Sylvester.precision || Math.abs(Math.PI - theta) <= _sylvester.Sylvester.precision;\n      } else if (obj.direction) {\n        // obj is a line\n        return this.normal.isPerpendicularTo(obj.direction);\n      }\n      return null;\n    }\n\n    // Returns true iff the receiver is perpendicular to the argument\n\n  }, {\n    key: 'isPerpendicularTo',\n    value: function isPerpendicularTo(plane) {\n      var theta = this.normal.angleFrom(plane.normal);\n      return Math.abs(Math.PI / 2 - theta) <= _sylvester.Sylvester.precision;\n    }\n\n    // Returns the plane's distance from the given object (point, line or plane)\n\n  }, {\n    key: 'distanceFrom',\n    value: function distanceFrom(obj) {\n      if (this.intersects(obj) || this.contains(obj)) {\n        return 0;\n      }\n      if (obj.anchor) {\n        // obj is a plane or line\n        var _A = this.anchor.elements;\n        var B = obj.anchor.elements;\n        var _N = this.normal.elements;\n        return Math.abs((_A[0] - B[0]) * _N[0] + (_A[1] - B[1]) * _N[1] + (_A[2] - B[2]) * _N[2]);\n      }\n\n      // obj is a point\n      var P = obj.elements || obj;\n      var A = this.anchor.elements;\n      var N = this.normal.elements;\n      return Math.abs((A[0] - P[0]) * N[0] + (A[1] - P[1]) * N[1] + (A[2] - (P[2] || 0)) * N[2]);\n    }\n\n    // Returns true iff the plane contains the given point or line\n\n  }, {\n    key: 'contains',\n    value: function contains(obj) {\n      if (obj.normal) {\n        return null;\n      }\n      if (obj.direction) {\n        return this.contains(obj.anchor) && this.contains(obj.anchor.add(obj.direction));\n      }\n\n      var P = obj.elements || obj;\n      var A = this.anchor.elements;\n      var N = this.normal.elements;\n      var diff = Math.abs(N[0] * (A[0] - P[0]) + N[1] * (A[1] - P[1]) + N[2] * (A[2] - (P[2] || 0)));\n      return diff <= _sylvester.Sylvester.precision;\n    }\n\n    // Returns true iff the plane has a unique point/line of intersection with the argument\n\n  }, {\n    key: 'intersects',\n    value: function intersects(obj) {\n      if (typeof obj.direction === 'undefined' && typeof obj.normal === 'undefined') {\n        return null;\n      }\n      return !this.isParallelTo(obj);\n    }\n\n    // Returns the unique intersection with the argument, if one exists. The result\n    // will be a vector if a line is supplied, and a line if a plane is supplied.\n\n  }, {\n    key: 'intersectionWith',\n    value: function intersectionWith(obj) {\n      if (!this.intersects(obj)) {\n        return null;\n      }\n\n      if (obj.direction) {\n        // obj is a line\n        var A = obj.anchor.elements;\n\n        var D = obj.direction.elements;\n        var P = this.anchor.elements;\n        var N = this.normal.elements;\n        var multiplier = (N[0] * (P[0] - A[0]) + N[1] * (P[1] - A[1]) + N[2] * (P[2] - A[2])) / (N[0] * D[0] + N[1] * D[1] + N[2] * D[2]);\n\n        return _vector.Vector.create([A[0] + D[0] * multiplier, A[1] + D[1] * multiplier, A[2] + D[2] * multiplier]);\n      }\n\n      if (obj.normal) {\n        // obj is a plane\n        var direction = this.normal.cross(obj.normal).toUnitVector();\n\n        // To find an anchor point, we find one co-ordinate that has a value\n        // of zero somewhere on the intersection, and remember which one we picked\n        var _N2 = this.normal.elements;\n\n        var _A2 = this.anchor.elements;\n        var O = obj.normal.elements;\n        var B = obj.anchor.elements;\n        var solver = _matrix.Matrix.Zero(2, 2);\n        var i = 0;\n        while (solver.isSingular()) {\n          i++;\n          solver = _matrix.Matrix.create([[_N2[i % 3], _N2[(i + 1) % 3]], [O[i % 3], O[(i + 1) % 3]]]);\n        }\n        // Then we solve the simultaneous equations in the remaining dimensions\n        var inverse = solver.inverse().elements;\n        var x = _N2[0] * _A2[0] + _N2[1] * _A2[1] + _N2[2] * _A2[2];\n        var y = O[0] * B[0] + O[1] * B[1] + O[2] * B[2];\n        var intersection = [inverse[0][0] * x + inverse[0][1] * y, inverse[1][0] * x + inverse[1][1] * y];\n        var anchor = [];\n        for (var j = 1; j <= 3; j++) {\n          // This formula picks the right element from intersection by\n          // cycling depending on which element we set to zero above\n          anchor.push(i === j ? 0 : intersection[(j + (5 - i) % 3) % 3]);\n        }\n        return _line.Line.create(anchor, direction);\n      }\n\n      return null; // todo(connor4312): is this a case that needs to be handled?\n    }\n\n    // Returns the point in the plane closest to the given point\n\n  }, {\n    key: 'pointClosestTo',\n    value: function pointClosestTo(point) {\n      var P = point.elements || point;\n      var A = this.anchor.elements;\n      var N = this.normal.elements;\n      var dot = (A[0] - P[0]) * N[0] + (A[1] - P[1]) * N[1] + (A[2] - (P[2] || 0)) * N[2];\n      return _vector.Vector.create([P[0] + N[0] * dot, P[1] + N[1] * dot, (P[2] || 0) + N[2] * dot]);\n    }\n\n    // Returns a copy of the plane, rotated by t radians about the given line\n    // See notes on Line#rotate.\n\n  }, {\n    key: 'rotate',\n    value: function rotate(t, line) {\n      var R = t.determinant ? t.elements : _matrix.Matrix.Rotation(t, line.direction).elements;\n      var C = line.pointClosestTo(this.anchor).elements;\n      var A = this.anchor.elements;\n      var N = this.normal.elements;\n      var C1 = C[0];\n      var C2 = C[1];\n      var C3 = C[2];\n      var A1 = A[0];\n      var A2 = A[1];\n      var A3 = A[2];\n      var x = A1 - C1;\n      var y = A2 - C2;\n      var z = A3 - C3;\n      return Plane.create([C1 + R[0][0] * x + R[0][1] * y + R[0][2] * z, C2 + R[1][0] * x + R[1][1] * y + R[1][2] * z, C3 + R[2][0] * x + R[2][1] * y + R[2][2] * z], [R[0][0] * N[0] + R[0][1] * N[1] + R[0][2] * N[2], R[1][0] * N[0] + R[1][1] * N[1] + R[1][2] * N[2], R[2][0] * N[0] + R[2][1] * N[1] + R[2][2] * N[2]]);\n    }\n\n    // Returns the reflection of the plane in the given point, line or plane.\n\n  }, {\n    key: 'reflectionIn',\n    value: function reflectionIn(obj) {\n      if (obj.normal) {\n        // obj is a plane\n        var A = this.anchor.elements;\n\n        var N = this.normal.elements;\n        var A1 = A[0];\n        var A2 = A[1];\n        var A3 = A[2];\n        var N1 = N[0];\n        var N2 = N[1];\n        var N3 = N[2];\n        var newA = this.anchor.reflectionIn(obj).elements;\n\n        // Add the plane's normal to its anchor, then mirror that in the other plane\n        var AN1 = A1 + N1;\n\n        var AN2 = A2 + N2;\n        var AN3 = A3 + N3;\n        var Q = obj.pointClosestTo([AN1, AN2, AN3]).elements;\n        var newN = [Q[0] + (Q[0] - AN1) - newA[0], Q[1] + (Q[1] - AN2) - newA[1], Q[2] + (Q[2] - AN3) - newA[2]];\n        return Plane.create(newA, newN);\n      }\n      if (obj.direction) {\n        // obj is a line\n        return this.rotate(Math.PI, obj);\n      }\n\n      // obj is a point\n      var P = obj.elements || obj;\n      return Plane.create(this.anchor.reflectionIn([P[0], P[1], P[2] || 0]), this.normal);\n    }\n\n    // Sets the anchor point and normal to the plane. If three arguments are specified,\n    // the normal is calculated by assuming the three points should lie in the same plane.\n    // If only two are sepcified, the second is taken to be the normal. Normal vector is\n    // normalised before storage.\n\n  }, {\n    key: 'setVectors',\n    value: function setVectors(anchor, v1, v2) {\n      anchor = _vector.Vector.create(anchor);\n      anchor = anchor.to3D();\n      if (anchor === null) {\n        return null;\n      }\n      v1 = _vector.Vector.create(v1);\n      v1 = v1.to3D();\n      if (v1 === null) {\n        return null;\n      }\n      if (typeof v2 === 'undefined') {\n        v2 = null;\n      } else {\n        v2 = _vector.Vector.create(v2);\n        v2 = v2.to3D();\n        if (v2 === null) {\n          return null;\n        }\n      }\n      var A1 = anchor.elements[0];\n      var A2 = anchor.elements[1];\n      var A3 = anchor.elements[2];\n      var v11 = v1.elements[0];\n      var v12 = v1.elements[1];\n      var v13 = v1.elements[2];\n      var normal = void 0;\n      var mod = void 0;\n      if (v2 === null) {\n        mod = Math.sqrt(v11 * v11 + v12 * v12 + v13 * v13);\n        if (mod === 0) {\n          return null;\n        }\n        normal = _vector.Vector.create([v1.elements[0] / mod, v1.elements[1] / mod, v1.elements[2] / mod]);\n      } else {\n        var v21 = v2.elements[0];\n        var v22 = v2.elements[1];\n        var v23 = v2.elements[2];\n        normal = _vector.Vector.create([(v12 - A2) * (v23 - A3) - (v13 - A3) * (v22 - A2), (v13 - A3) * (v21 - A1) - (v11 - A1) * (v23 - A3), (v11 - A1) * (v22 - A2) - (v12 - A2) * (v21 - A1)]);\n        mod = normal.modulus();\n        if (mod === 0) {\n          return null;\n        }\n        normal = _vector.Vector.create([normal.elements[0] / mod, normal.elements[1] / mod, normal.elements[2] / mod]);\n      }\n\n      this.anchor = anchor;\n      this.normal = normal;\n      return this;\n    }\n\n    // Constructor function\n\n  }], [{\n    key: 'create',\n    value: function create(anchor, v1, v2) {\n      var P = new Plane();\n      return P.setVectors(anchor, v1, v2);\n    }\n\n    // Returns the plane containing the given points (can be arrays as\n    // well as vectors). If the points are not coplanar, returns null.\n\n  }, {\n    key: 'fromPoints',\n    value: function fromPoints(points) {\n      var np = points.length;\n      var list = [];\n      var i = void 0;\n      var P = void 0;\n      var n = void 0;\n      var N = void 0;\n      var A = void 0;\n      var B = void 0;\n      var C = void 0;\n      var theta = void 0;\n      var prevN = void 0;\n      var totalN = _vector.Vector.Zero(3);\n      for (i = 0; i < np; i++) {\n        P = _vector.Vector.create(points[i]).to3D();\n        if (P === null) {\n          return null;\n        }\n        list.push(P);\n        n = list.length;\n        if (n > 2) {\n          // Compute plane normal for the latest three points\n          A = list[n - 1].elements;\n          B = list[n - 2].elements;\n          C = list[n - 3].elements;\n          N = _vector.Vector.create([(A[1] - B[1]) * (C[2] - B[2]) - (A[2] - B[2]) * (C[1] - B[1]), (A[2] - B[2]) * (C[0] - B[0]) - (A[0] - B[0]) * (C[2] - B[2]), (A[0] - B[0]) * (C[1] - B[1]) - (A[1] - B[1]) * (C[0] - B[0])]).toUnitVector();\n\n          if (n > 3) {\n            // If the latest normal is not (anti)parallel to the previous one, we've strayed off the plane.\n            // This might be a slightly long-winded way of doing things, but we need the sum of all the normals\n            // to find which way the plane normal should point so that the points form an anticlockwise list.\n            theta = N.angleFrom(prevN);\n            if (theta !== null) {\n              if (!(Math.abs(theta) <= _sylvester.Sylvester.precision || Math.abs(theta - Math.PI) <= _sylvester.Sylvester.precision)) {\n                return null;\n              }\n            }\n          }\n          totalN = totalN.add(N);\n          prevN = N;\n        }\n      }\n      // We need to add in the normals at the start and end points, which the above misses out\n      A = list[1].elements;\n      B = list[0].elements;\n      C = list[n - 1].elements;\n      var D = list[n - 2].elements;\n      totalN = totalN.add(_vector.Vector.create([(A[1] - B[1]) * (C[2] - B[2]) - (A[2] - B[2]) * (C[1] - B[1]), (A[2] - B[2]) * (C[0] - B[0]) - (A[0] - B[0]) * (C[2] - B[2]), (A[0] - B[0]) * (C[1] - B[1]) - (A[1] - B[1]) * (C[0] - B[0])]).toUnitVector()).add(_vector.Vector.create([(B[1] - C[1]) * (D[2] - C[2]) - (B[2] - C[2]) * (D[1] - C[1]), (B[2] - C[2]) * (D[0] - C[0]) - (B[0] - C[0]) * (D[2] - C[2]), (B[0] - C[0]) * (D[1] - C[1]) - (B[1] - C[1]) * (D[0] - C[0])]).toUnitVector());\n      return Plane.create(list[0], totalN);\n    }\n  }]);\n\n  return Plane;\n}();\n\n// X-Y-Z planes\n\n\nPlane.XY = Plane.YX = Plane.create(_vector.Vector.Zero(3), _vector.Vector.k);\nPlane.YZ = Plane.ZY = Plane.create(_vector.Vector.Zero(3), _vector.Vector.i);\nPlane.ZX = Plane.XZ = Plane.create(_vector.Vector.Zero(3), _vector.Vector.j);\n},{\"./line\":137,\"./matrix\":138,\"./sylvester\":140,\"./vector\":141}],140:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\n * Default Sylvester configurations.\n * @type {Object}\n */\nvar Sylvester = exports.Sylvester = {\n  precision: 1e-6,\n  approxPrecision: 1e-5\n};\n\n/**\n * A DimensionalityMismatchError is thrown when an operation is run on two\n * units which should share a certain dimensional relationship, but fail it.\n */\n\nvar DimensionalityMismatchError = exports.DimensionalityMismatchError = function (_Error) {\n  _inherits(DimensionalityMismatchError, _Error);\n\n  function DimensionalityMismatchError() {\n    _classCallCheck(this, DimensionalityMismatchError);\n\n    return _possibleConstructorReturn(this, (DimensionalityMismatchError.__proto__ || Object.getPrototypeOf(DimensionalityMismatchError)).apply(this, arguments));\n  }\n\n  return DimensionalityMismatchError;\n}(Error);\n},{}],141:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Vector = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _sylvester = require('./sylvester');\n\nvar _matrix = require('./matrix');\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The Vector class is designed to model vectors in any number of dimensions.\n * All the elements of a vector must be real numbers. Depending on what you’re\n * using them for, it can be helpful to think of a vector either as a point\n * in n-dimensional space, or as a line connecting\n * the origin to that same point.\n */\nvar Vector = exports.Vector = function () {\n\n  /**\n   * Creates a new vector, initializing it with the provided elements.\n   * @param  {Number[]} elements\n   */\n  function Vector(elements) {\n    _classCallCheck(this, Vector);\n\n    this.elements = elements;\n  }\n\n  /**\n   * Returns the magnitude (also: euclidean norm, magnitude) of the vector.\n   *\n   * $example Vector.magnitude\n   * @see https://en.wikipedia.org/wiki/Euclidean_distance\n   * @return {Number}\n   */\n\n\n  _createClass(Vector, [{\n    key: 'magnitude',\n    value: function magnitude() {\n      var sum = 0;\n      for (var i = 0; i < this.elements.length; i++) {\n        sum += this.elements[i] * this.elements[i];\n      }\n\n      return Math.sqrt(sum);\n    }\n\n    /**\n     * Returns the `ith` element if the vector. Returns null if `i` is out\n     * of bounds, indexing starts from 1.\n     *\n     * $example Vector.e\n     * @param  {Number} i\n     * @return {Number}\n     */\n\n  }, {\n    key: 'e',\n    value: function e(i) {\n      return i < 1 || i > this.elements.length ? null : this.elements[i - 1];\n    }\n\n    /**\n     * Returns the number of rows and columns the vector has.\n     *\n     * $example Vector.dimensions\n     * @return {IDimensions} the \"rows\" will always equal zero\n     */\n\n  }, {\n    key: 'dimensions',\n    value: function dimensions() {\n      return {\n        rows: 1,\n        cols: this.elements.length\n      };\n    }\n\n    /**\n     * Returns the number of rows the vector has.\n     *\n     * $example Vector.rows\n     * @return {Number} always `1`\n     */\n\n  }, {\n    key: 'rows',\n    value: function rows() {\n      return 1;\n    }\n\n    /**\n     * Returns the number of columns the vector has.\n     *\n     * $example Vector.cols\n     * @return {Number}\n     */\n\n  }, {\n    key: 'cols',\n    value: function cols() {\n      return this.elements.length;\n    }\n\n    /**\n     * Returns if the Vector is equal to the input vector.\n     * $example Vector.eql\n     * @param  {Vector} vector\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'eql',\n    value: function eql(vector) {\n      var n = this.elements.length;\n      var V = vector.elements || vector;\n      if (n !== V.length) {\n        return false;\n      }\n      while (n--) {\n        if (Math.abs(this.elements[n] - V[n]) > _sylvester.Sylvester.precision) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Returns a new function created by calling the iterator on all values of this vector.\n     * @param  {Function} fn\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'map',\n    value: function map(fn) {\n      var n = this.elements.length;\n      var elements = new Array(n);\n      for (var i = 0; i < n; i++) {\n        elements[i] = fn(this.elements[i], i + 1);\n      }\n\n      return new Vector(elements);\n    }\n\n    /**\n     * Iterates through the elements of the vector\n     * @param {Function} fn called with the `(element, index)`\n     */\n\n  }, {\n    key: 'each',\n    value: function each(fn) {\n      var n = this.elements.length;\n      for (var i = 0; i < n; i++) {\n        fn(this.elements[i], i + 1);\n      }\n    }\n\n    /**\n     * Returns a new vector created by normalizing this one to a have a\n     * magnitude of `1`. If the vector is the zero vector, it will not be modified.\n     *\n     * $example Vector.toUnitVector\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'toUnitVector',\n    value: function toUnitVector() {\n      var r = this.modulus();\n      if (r === 0) {\n        return this.dup();\n      }\n\n      return this.map(function (x) {\n        return x / r;\n      });\n    }\n\n    /**\n     * Returns the angle between this vector the argument in radians. If the\n     * vectors are mirrored across their axes this will return `NaN`.\n     * $example Vector.angleFrom\n     * @throws {DimensionalityMismatchError} If a vector is passed in with\n     *     different dimensions\n     * @param  {Vector} vector\n     * @return {Number}\n     */\n\n  }, {\n    key: 'angleFrom',\n    value: function angleFrom(vector) {\n      var V = vector.elements || vector;\n      var n = this.elements.length;\n      if (n !== V.length) {\n        throw new _sylvester.DimensionalityMismatchError('Cannot compute the angle between vectors with different dimensionality');\n      }\n\n      // Work things out in parallel to save time\n      var dot = 0;\n      var mod1 = 0;\n      var mod2 = 0;\n      this.each(function (x, i) {\n        dot += x * V[i - 1];\n        mod1 += x * x;\n        mod2 += V[i - 1] * V[i - 1];\n      });\n      mod1 = Math.sqrt(mod1);\n      mod2 = Math.sqrt(mod2);\n      if (mod1 * mod2 === 0) {\n        return NaN;\n      }\n\n      var theta = dot / (mod1 * mod2);\n      if (theta < -1) {\n        theta = -1;\n      }\n      if (theta > 1) {\n        theta = 1;\n      }\n      return Math.acos(theta);\n    }\n\n    /**\n     * Returns whether the vectors are parallel to each other.\n     * $example Vector.isParallelTo\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isParallelTo',\n    value: function isParallelTo(vector) {\n      var angle = this.angleFrom(vector);\n      return angle === null ? false : angle <= _sylvester.Sylvester.precision;\n    }\n\n    /**\n     * Returns whether the vectors are antiparallel to each other.\n     * $example Vector.isAntiparallelTo\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isAntiparallelTo',\n    value: function isAntiparallelTo(vector) {\n      var angle = this.angleFrom(vector);\n      return angle === null ? false : Math.abs(angle - Math.PI) <= _sylvester.Sylvester.precision;\n    }\n\n    /**\n     * Returns whether the vectors are perpendicular to each other.\n     * $example Vector.isPerpendicularTo\n     * @return {Boolean}\n     */\n\n  }, {\n    key: 'isPerpendicularTo',\n    value: function isPerpendicularTo(vector) {\n      return Math.abs(this.dot(vector)) <= _sylvester.Sylvester.precision;\n    }\n  }, {\n    key: '_runBinaryOp',\n    value: function _runBinaryOp(value, operator) {\n      if (typeof value === 'number') {\n        return this.map(function (v) {\n          return operator(v, value);\n        });\n      }\n\n      var values = value.elements || value;\n      if (this.elements.length !== values.length) {\n        throw new _sylvester.DimensionalityMismatchError('Cannot add vectors with different dimensions.');\n      }\n\n      return this.map(function (x, i) {\n        return operator(x, values[i - 1]);\n      });\n    }\n\n    /**\n     * When the input is a constant, this returns the result of adding it to\n     * all cevtor elements. When it's a vector, the vectors will be added.\n     * $example Vector.add\n     * @throws {DimensionalityMismatchError} If a vector is passed in with\n     *     different dimensions\n     * @param {Number|Number[]|Vector} value\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'add',\n    value: function add(value) {\n      return this._runBinaryOp(value, function (a, b) {\n        return a + b;\n      });\n    }\n\n    /**\n     * When the input is a constant, this returns the result of subtracting it\n     * from all vector elements. When it's a vector, the vectors will be subtracted.\n     * $example Vector.subtract\n     * @throws {DimensionalityMismatchError} If a vector is passed in with\n     *     different dimensions\n     * @param {Number|Number[]|Vector} value\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'subtract',\n    value: function subtract(value) {\n      return this._runBinaryOp(value, function (a, b) {\n        return a - b;\n      });\n    }\n\n    /**\n     * When the input is a constant, this returns the result of multiplying it\n     * with all vector elements. When it's a vector, the vectors will be\n     * element-wise multiplied.\n     * $example Vector.multiply\n     * @throws {DimensionalityMismatchError} If a vector is passed in with\n     *     different dimensions\n     * @param {Number|Number[]|Vector} value\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'multiply',\n    value: function multiply(value) {\n      return this._runBinaryOp(value, function (a, b) {\n        return a * b;\n      });\n    }\n\n    /**\n     * Returns the sum of all elements in the Vector.\n     * $example Vector.sum\n     * @return {Number}\n     */\n\n  }, {\n    key: 'sum',\n    value: function sum() {\n      var sum = 0;\n      this.each(function (x) {\n        sum += x;\n      });\n      return sum;\n    }\n\n    /**\n     * Returns a new vector with the first `n` elements removed from the beginning.\n     * $example Vector.chomp\n     * @param  {Number} n\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'chomp',\n    value: function chomp(n) {\n      var elements = [];\n      for (var i = n; i < this.elements.length; i++) {\n        elements.push(this.elements[i]);\n      }\n\n      return Vector.create(elements);\n    }\n\n    /**\n     * Returns a new vector consisting only of the first `n` elements.\n     * $example Vector.chomp\n     * @param  {Number} n\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'top',\n    value: function top(n) {\n      var elements = [];\n      for (var i = 0; i < n; i++) {\n        elements.push(this.elements[i]);\n      }\n\n      return Vector.create(elements);\n    }\n\n    /**\n     * Returns a new vector with the provided `elements` concatenated on the end.\n     * $example Vector.augment\n     * @param  {Number[]|Vector} elements\n     * @return {Vector}\n     */\n\n  }, {\n    key: 'augment',\n    value: function augment(elements) {\n      return Vector.create(this.elements.concat(elements.elements || elements));\n    }\n\n    /**\n     * @alias Vector#multiply\n     */\n\n  }, {\n    key: 'x',\n    value: function x(k) {\n      return this.multiply(k);\n    }\n  }, {\n    key: 'log',\n    value: function log() {\n      return Vector.log(this);\n    }\n\n    /**\n     * Returns the product of all elements in the vector.\n     * $example Vector.product\n     * @return {Number}\n     */\n\n  }, {\n    key: 'product',\n    value: function product() {\n      var p = 1;\n      this.each(function (v) {\n        p *= v;\n      });\n\n      return p;\n    }\n\n    /**\n     * Returns the scalar (dot) product of the vector with the argument.\n     *\n     * $example Vector.dot\n     * @see https://en.wikipedia.org/wiki/Scalar_product\n     * @throws {DimensionalityMismatchError} If a vector is passed in with\n     *     different dimensions\n     * @param  {Vector|Number[]} vector\n     * @return {Number}\n     */\n\n  }, {\n    key: 'dot',\n    value: function dot(vector) {\n      var V = vector.elements || vector;\n      var n = this.elements.length;\n      if (n !== V.length) {\n        throw new _sylvester.DimensionalityMismatchError('Cannot compute the dot product of vectors with different dimensionality');\n      }\n\n      var product = 0;\n      while (n--) {\n        product += this.elements[n] * V[n];\n      }\n      return product;\n    }\n\n    // Returns the vector product of the vector with the argument\n    // Both vectors must have dimensionality 3\n\n  }, {\n    key: 'cross',\n    value: function cross(vector) {\n      var B = vector.elements || vector;\n      if (this.elements.length !== 3 || B.length !== 3) {\n        return null;\n      }\n      var A = this.elements;\n      return Vector.create([A[1] * B[2] - A[2] * B[1], A[2] * B[0] - A[0] * B[2], A[0] * B[1] - A[1] * B[0]]);\n    }\n\n    // Returns the (absolute) largest element of the vector\n\n  }, {\n    key: 'max',\n    value: function max() {\n      var m = 0;\n      var i = this.elements.length;\n      while (i--) {\n        if (Math.abs(this.elements[i]) > Math.abs(m)) {\n          m = this.elements[i];\n        }\n      }\n      return m;\n    }\n  }, {\n    key: 'maxIndex',\n    value: function maxIndex() {\n      var m = 0;\n      var i = this.elements.length;\n      var maxIndex = -1;\n\n      while (i--) {\n        if (Math.abs(this.elements[i]) > Math.abs(m)) {\n          m = this.elements[i];\n          maxIndex = i + 1;\n        }\n      }\n\n      return maxIndex;\n    }\n\n    // Returns the index of the first match found\n\n  }, {\n    key: 'indexOf',\n    value: function indexOf(x) {\n      var index = null;\n      var n = this.elements.length;\n      for (var i = 0; i < n; i++) {\n        if (index === null && this.elements[i] === x) {\n          index = i + 1;\n        }\n      }\n      return index;\n    }\n\n    // Returns a diagonal matrix with the vector's elements as its diagonal elements\n\n  }, {\n    key: 'toDiagonalMatrix',\n    value: function toDiagonalMatrix() {\n      return _matrix.Matrix.Diagonal(this.elements);\n    }\n\n    // Returns the result of rounding the elements of the vector\n\n  }, {\n    key: 'round',\n    value: function round() {\n      return this.map(function (x) {\n        return Math.round(x);\n      });\n    }\n\n    // Transpose a Vector, return a 1xn Matrix\n\n  }, {\n    key: 'transpose',\n    value: function transpose() {\n      var rows = this.elements.length;\n      var elements = [];\n\n      for (var i = 0; i < rows; i++) {\n        elements.push([this.elements[i]]);\n      }\n      return _matrix.Matrix.create(elements);\n    }\n\n    // Returns a copy of the vector with elements set to the given value if they\n    // differ from it by less than Sylvester.precision\n\n  }, {\n    key: 'snapTo',\n    value: function snapTo(x) {\n      return this.map(function (y) {\n        return Math.abs(y - x) <= _sylvester.Sylvester.precision ? x : y;\n      });\n    }\n\n    // Returns the vector's distance from the argument, when considered as a point in space\n\n  }, {\n    key: 'distanceFrom',\n    value: function distanceFrom(obj) {\n      if (obj.anchor || obj.start && obj.end) {\n        return obj.distanceFrom(this);\n      }\n      var V = obj.elements || obj;\n      if (V.length !== this.elements.length) {\n        return null;\n      }\n      var sum = 0;\n      var part = void 0;\n      this.each(function (x, i) {\n        part = x - V[i - 1];\n        sum += part * part;\n      });\n      return Math.sqrt(sum);\n    }\n\n    // Returns true if the vector is point on the given line\n\n  }, {\n    key: 'liesOn',\n    value: function liesOn(line) {\n      return line.contains(this);\n    }\n\n    // Return true iff the vector is a point in the given plane\n\n  }, {\n    key: 'liesIn',\n    value: function liesIn(plane) {\n      return plane.contains(this);\n    }\n\n    // Rotates the vector about the given object. The object should be a\n    // point if the vector is 2D, and a line if it is 3D. Be careful with line directions!\n\n  }, {\n    key: 'rotate',\n    value: function rotate(t, obj) {\n      var V = void 0;\n      var R = null;\n      var x = void 0;\n      var y = void 0;\n      var z = void 0;\n      var C = void 0;\n      if (t.determinant) {\n        R = t.elements;\n      }\n      switch (this.elements.length) {\n        case 2:\n          V = obj.elements || obj;\n          if (V.length !== 2) {\n            return null;\n          }\n          if (!R) {\n            R = _matrix.Matrix.Rotation(t).elements;\n          }\n          x = this.elements[0] - V[0];\n          y = this.elements[1] - V[1];\n          return Vector.create([V[0] + R[0][0] * x + R[0][1] * y, V[1] + R[1][0] * x + R[1][1] * y]);\n        case 3:\n          if (!obj.direction) {\n            return null;\n          }\n          C = obj.pointClosestTo(this).elements;\n          if (!R) {\n            R = _matrix.Matrix.Rotation(t, obj.direction).elements;\n          }\n          x = this.elements[0] - C[0];\n          y = this.elements[1] - C[1];\n          z = this.elements[2] - C[2];\n          return Vector.create([C[0] + R[0][0] * x + R[0][1] * y + R[0][2] * z, C[1] + R[1][0] * x + R[1][1] * y + R[1][2] * z, C[2] + R[2][0] * x + R[2][1] * y + R[2][2] * z]);\n        default:\n          return null;\n      }\n    }\n\n    // Returns the result of reflecting the point in the given point, line or plane\n\n  }, {\n    key: 'reflectionIn',\n    value: function reflectionIn(obj) {\n      if (obj.anchor) {\n        // obj is a plane or line\n        var P = this.elements.slice();\n        var C = obj.pointClosestTo(P).elements;\n        return Vector.create([C[0] + (C[0] - P[0]), C[1] + (C[1] - P[1]), C[2] + (C[2] - (P[2] || 0))]);\n      }\n\n      // obj is a point\n      var Q = obj.elements || obj;\n      if (this.elements.length !== Q.length) {\n        return null;\n      }\n      return this.map(function (x, i) {\n        return Q[i - 1] + (Q[i - 1] - x);\n      });\n    }\n\n    // Utility to make sure vectors are 3D. If they are 2D, a zero z-component is added\n\n  }, {\n    key: 'to3D',\n    value: function to3D() {\n      var V = this.dup();\n      switch (V.elements.length) {\n        case 3:\n          break;\n        case 2:\n          V.elements.push(0);\n          break;\n        default:\n          return null;\n      }\n      return V;\n    }\n\n    // Returns a string representation of the vector\n\n  }, {\n    key: 'inspect',\n    value: function inspect() {\n      return 'Vector<[' + this.elements.join(', ') + ']>';\n    }\n\n    // Set vector's elements from an array\n\n  }, {\n    key: 'setElements',\n    value: function setElements(els) {\n      this.elements = (els.elements || els).slice();\n      return this;\n    }\n  }, {\n    key: 'toJSON',\n    value: function toJSON() {\n      return this.elements;\n    }\n\n    // Constructor function\n\n  }], [{\n    key: 'create',\n    value: function create(elements) {\n      var V = new Vector();\n      return V.setElements(elements);\n    }\n\n    // Random vector of size n\n\n  }, {\n    key: 'Random',\n    value: function Random(n) {\n      var elements = [];\n      while (n--) {\n        elements.push(Math.random());\n      }\n      return Vector.create(elements);\n    }\n  }, {\n    key: 'Fill',\n    value: function Fill(n, v) {\n      var elements = [];\n      while (n--) {\n        elements.push(v);\n      }\n      return Vector.create(elements);\n    }\n\n    // Vector filled with zeros\n\n  }, {\n    key: 'Zero',\n    value: function Zero(n) {\n      return Vector.Fill(n, 0);\n    }\n  }, {\n    key: 'One',\n    value: function One(n) {\n      return Vector.Fill(n, 1);\n    }\n  }, {\n    key: 'log',\n    value: function log(v) {\n      return v.map(function (x) {\n        return Math.log(x);\n      });\n    }\n  }]);\n\n  return Vector;\n}();\n\n// i, j, k unit vectors\n\n\nVector.i = Vector.create([1, 0, 0]);\nVector.j = Vector.create([0, 1, 0]);\nVector.k = Vector.create([0, 0, 1]);\n\n// The following are shims for deprecated methods removed in 1.0.0\nVector.prototype.modulus = Vector.prototype.magnitude;\nVector.prototype.norm = Vector.prototype.magnitude;\nVector.prototype.dup = function () {\n  return this.map(function (x) {\n    return x;\n  });\n};\n},{\"./matrix\":138,\"./sylvester\":140}],142:[function(require,module,exports){\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@most/prelude')) :\n  typeof define === 'function' && define.amd ? define(['exports', '@most/prelude'], factory) :\n  (factory((global.mostMulticast = global.mostMulticast || {}),global.mostPrelude));\n}(this, (function (exports,_most_prelude) { 'use strict';\n\nvar MulticastDisposable = function MulticastDisposable (source, sink) {\n  this.source = source\n  this.sink = sink\n  this.disposed = false\n};\n\nMulticastDisposable.prototype.dispose = function dispose () {\n  if (this.disposed) {\n    return\n  }\n  this.disposed = true\n  var remaining = this.source.remove(this.sink)\n  return remaining === 0 && this.source._dispose()\n};\n\nfunction tryEvent (t, x, sink) {\n  try {\n    sink.event(t, x)\n  } catch (e) {\n    sink.error(t, e)\n  }\n}\n\nfunction tryEnd (t, x, sink) {\n  try {\n    sink.end(t, x)\n  } catch (e) {\n    sink.error(t, e)\n  }\n}\n\nvar dispose = function (disposable) { return disposable.dispose(); }\n\nvar emptyDisposable = {\n  dispose: function dispose$1 () {}\n}\n\nvar MulticastSource = function MulticastSource (source) {\n  this.source = source\n  this.sinks = []\n  this._disposable = emptyDisposable\n};\n\nMulticastSource.prototype.run = function run (sink, scheduler) {\n  var n = this.add(sink)\n  if (n === 1) {\n    this._disposable = this.source.run(this, scheduler)\n  }\n  return new MulticastDisposable(this, sink)\n};\n\nMulticastSource.prototype._dispose = function _dispose () {\n  var disposable = this._disposable\n  this._disposable = emptyDisposable\n  return Promise.resolve(disposable).then(dispose)\n};\n\nMulticastSource.prototype.add = function add (sink) {\n  this.sinks = _most_prelude.append(sink, this.sinks)\n  return this.sinks.length\n};\n\nMulticastSource.prototype.remove = function remove$1 (sink) {\n  var i = _most_prelude.findIndex(sink, this.sinks)\n  // istanbul ignore next\n  if (i >= 0) {\n    this.sinks = _most_prelude.remove(i, this.sinks)\n  }\n\n  return this.sinks.length\n};\n\nMulticastSource.prototype.event = function event (time, value) {\n  var s = this.sinks\n  if (s.length === 1) {\n    return s[0].event(time, value)\n  }\n  for (var i = 0; i < s.length; ++i) {\n    tryEvent(time, value, s[i])\n  }\n};\n\nMulticastSource.prototype.end = function end (time, value) {\n  var s = this.sinks\n  for (var i = 0; i < s.length; ++i) {\n    tryEnd(time, value, s[i])\n  }\n};\n\nMulticastSource.prototype.error = function error (time, err) {\n  var s = this.sinks\n  for (var i = 0; i < s.length; ++i) {\n    s[i].error(time, err)\n  }\n};\n\nfunction multicast (stream) {\n  var source = stream.source\n  return source instanceof MulticastSource\n    ? stream\n    : new stream.constructor(new MulticastSource(source))\n}\n\nexports['default'] = multicast;\nexports.MulticastSource = MulticastSource;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n},{\"@most/prelude\":143}],143:[function(require,module,exports){\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.mostPrelude = {})));\n}(this, (function (exports) { 'use strict';\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n\n// Non-mutating array operations\n\n// cons :: a -> [a] -> [a]\n// a with x prepended\nfunction cons(x, a) {\n  var l = a.length;\n  var b = new Array(l + 1);\n  b[0] = x;\n  for (var i = 0; i < l; ++i) {\n    b[i + 1] = a[i];\n  }\n  return b;\n}\n\n// append :: a -> [a] -> [a]\n// a with x appended\nfunction append(x, a) {\n  var l = a.length;\n  var b = new Array(l + 1);\n  for (var i = 0; i < l; ++i) {\n    b[i] = a[i];\n  }\n\n  b[l] = x;\n  return b;\n}\n\n// drop :: Int -> [a] -> [a]\n// drop first n elements\nfunction drop(n, a) {\n  // eslint-disable-line complexity\n  if (n < 0) {\n    throw new TypeError('n must be >= 0');\n  }\n\n  var l = a.length;\n  if (n === 0 || l === 0) {\n    return a;\n  }\n\n  if (n >= l) {\n    return [];\n  }\n\n  return unsafeDrop(n, a, l - n);\n}\n\n// unsafeDrop :: Int -> [a] -> Int -> [a]\n// Internal helper for drop\nfunction unsafeDrop(n, a, l) {\n  var b = new Array(l);\n  for (var i = 0; i < l; ++i) {\n    b[i] = a[n + i];\n  }\n  return b;\n}\n\n// tail :: [a] -> [a]\n// drop head element\nfunction tail(a) {\n  return drop(1, a);\n}\n\n// copy :: [a] -> [a]\n// duplicate a (shallow duplication)\nfunction copy(a) {\n  var l = a.length;\n  var b = new Array(l);\n  for (var i = 0; i < l; ++i) {\n    b[i] = a[i];\n  }\n  return b;\n}\n\n// map :: (a -> b) -> [a] -> [b]\n// transform each element with f\nfunction map(f, a) {\n  var l = a.length;\n  var b = new Array(l);\n  for (var i = 0; i < l; ++i) {\n    b[i] = f(a[i]);\n  }\n  return b;\n}\n\n// reduce :: (a -> b -> a) -> a -> [b] -> a\n// accumulate via left-fold\nfunction reduce(f, z, a) {\n  var r = z;\n  for (var i = 0, l = a.length; i < l; ++i) {\n    r = f(r, a[i], i);\n  }\n  return r;\n}\n\n// replace :: a -> Int -> [a]\n// replace element at index\nfunction replace(x, i, a) {\n  // eslint-disable-line complexity\n  if (i < 0) {\n    throw new TypeError('i must be >= 0');\n  }\n\n  var l = a.length;\n  var b = new Array(l);\n  for (var j = 0; j < l; ++j) {\n    b[j] = i === j ? x : a[j];\n  }\n  return b;\n}\n\n// remove :: Int -> [a] -> [a]\n// remove element at index\nfunction remove(i, a) {\n  // eslint-disable-line complexity\n  if (i < 0) {\n    throw new TypeError('i must be >= 0');\n  }\n\n  var l = a.length;\n  if (l === 0 || i >= l) {\n    // exit early if index beyond end of array\n    return a;\n  }\n\n  if (l === 1) {\n    // exit early if index in bounds and length === 1\n    return [];\n  }\n\n  return unsafeRemove(i, a, l - 1);\n}\n\n// unsafeRemove :: Int -> [a] -> Int -> [a]\n// Internal helper to remove element at index\nfunction unsafeRemove(i, a, l) {\n  var b = new Array(l);\n  var j = void 0;\n  for (j = 0; j < i; ++j) {\n    b[j] = a[j];\n  }\n  for (j = i; j < l; ++j) {\n    b[j] = a[j + 1];\n  }\n\n  return b;\n}\n\n// removeAll :: (a -> boolean) -> [a] -> [a]\n// remove all elements matching a predicate\n// @deprecated\nfunction removeAll(f, a) {\n  var l = a.length;\n  var b = new Array(l);\n  var j = 0;\n  for (var x, i = 0; i < l; ++i) {\n    x = a[i];\n    if (!f(x)) {\n      b[j] = x;\n      ++j;\n    }\n  }\n\n  b.length = j;\n  return b;\n}\n\n// findIndex :: a -> [a] -> Int\n// find index of x in a, from the left\nfunction findIndex(x, a) {\n  for (var i = 0, l = a.length; i < l; ++i) {\n    if (x === a[i]) {\n      return i;\n    }\n  }\n  return -1;\n}\n\n// isArrayLike :: * -> boolean\n// Return true iff x is array-like\nfunction isArrayLike(x) {\n  return x != null && typeof x.length === 'number' && typeof x !== 'function';\n}\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n\n// id :: a -> a\nvar id = function id(x) {\n  return x;\n};\n\n// compose :: (b -> c) -> (a -> b) -> (a -> c)\nvar compose = function compose(f, g) {\n  return function (x) {\n    return f(g(x));\n  };\n};\n\n// apply :: (a -> b) -> a -> b\nvar apply = function apply(f, x) {\n  return f(x);\n};\n\n// curry2 :: ((a, b) -> c) -> (a -> b -> c)\nfunction curry2(f) {\n  function curried(a, b) {\n    switch (arguments.length) {\n      case 0:\n        return curried;\n      case 1:\n        return function (b) {\n          return f(a, b);\n        };\n      default:\n        return f(a, b);\n    }\n  }\n  return curried;\n}\n\n// curry3 :: ((a, b, c) -> d) -> (a -> b -> c -> d)\nfunction curry3(f) {\n  function curried(a, b, c) {\n    // eslint-disable-line complexity\n    switch (arguments.length) {\n      case 0:\n        return curried;\n      case 1:\n        return curry2(function (b, c) {\n          return f(a, b, c);\n        });\n      case 2:\n        return function (c) {\n          return f(a, b, c);\n        };\n      default:\n        return f(a, b, c);\n    }\n  }\n  return curried;\n}\n\n// curry4 :: ((a, b, c, d) -> e) -> (a -> b -> c -> d -> e)\nfunction curry4(f) {\n  function curried(a, b, c, d) {\n    // eslint-disable-line complexity\n    switch (arguments.length) {\n      case 0:\n        return curried;\n      case 1:\n        return curry3(function (b, c, d) {\n          return f(a, b, c, d);\n        });\n      case 2:\n        return curry2(function (c, d) {\n          return f(a, b, c, d);\n        });\n      case 3:\n        return function (d) {\n          return f(a, b, c, d);\n        };\n      default:\n        return f(a, b, c, d);\n    }\n  }\n  return curried;\n}\n\n/** @license MIT License (c) copyright 2016 original author or authors */\n\nexports.cons = cons;\nexports.append = append;\nexports.drop = drop;\nexports.tail = tail;\nexports.copy = copy;\nexports.map = map;\nexports.reduce = reduce;\nexports.replace = replace;\nexports.remove = remove;\nexports.removeAll = removeAll;\nexports.findIndex = findIndex;\nexports.isArrayLike = isArrayLike;\nexports.id = id;\nexports.compose = compose;\nexports.apply = apply;\nexports.curry2 = curry2;\nexports.curry3 = curry3;\nexports.curry4 = curry4;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n},{}],144:[function(require,module,exports){\n(function (global, factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define(['exports'], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(exports);\n  } else {\n    var mod = {\n      exports: {}\n    };\n    factory(mod.exports);\n    global.astring = mod.exports;\n  }\n})(this, function (exports) {\n  'use strict';\n\n  exports.__esModule = true;\n  exports.generate = generate;\n\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  var stringify = JSON.stringify;\n\n\n  /* istanbul ignore if */\n  if (!String.prototype.repeat) {\n    /* istanbul ignore next */\n    throw new Error('String.prototype.repeat is undefined, see https://github.com/davidbonnet/astring#installation');\n  }\n\n  /* istanbul ignore if */\n  if (!String.prototype.endsWith) {\n    /* istanbul ignore next */\n    throw new Error('String.prototype.endsWith is undefined, see https://github.com/davidbonnet/astring#installation');\n  }\n\n  var OPERATOR_PRECEDENCE = {\n    '||': 3,\n    '&&': 4,\n    '|': 5,\n    '^': 6,\n    '&': 7,\n    '==': 8,\n    '!=': 8,\n    '===': 8,\n    '!==': 8,\n    '<': 9,\n    '>': 9,\n    '<=': 9,\n    '>=': 9,\n    in: 9,\n    instanceof: 9,\n    '<<': 10,\n    '>>': 10,\n    '>>>': 10,\n    '+': 11,\n    '-': 11,\n    '*': 12,\n    '%': 12,\n    '/': 12,\n    '**': 13\n\n    // Enables parenthesis regardless of precedence\n  };var NEEDS_PARENTHESES = 17;\n\n  var EXPRESSIONS_PRECEDENCE = {\n    // Definitions\n    ArrayExpression: 20,\n    TaggedTemplateExpression: 20,\n    ThisExpression: 20,\n    Identifier: 20,\n    Literal: 18,\n    TemplateLiteral: 20,\n    Super: 20,\n    SequenceExpression: 20,\n    // Operations\n    MemberExpression: 19,\n    CallExpression: 19,\n    NewExpression: 19,\n    // Other definitions\n    ArrowFunctionExpression: NEEDS_PARENTHESES,\n    ClassExpression: NEEDS_PARENTHESES,\n    FunctionExpression: NEEDS_PARENTHESES,\n    ObjectExpression: NEEDS_PARENTHESES,\n    // Other operations\n    UpdateExpression: 16,\n    UnaryExpression: 15,\n    BinaryExpression: 14,\n    LogicalExpression: 13,\n    ConditionalExpression: 4,\n    AssignmentExpression: 3,\n    AwaitExpression: 2,\n    YieldExpression: 2,\n    RestElement: 1\n  };\n\n  function formatSequence(state, nodes) {\n    var generator = state.generator;\n\n    state.write('(');\n    if (nodes != null && nodes.length > 0) {\n      generator[nodes[0].type](nodes[0], state);\n      var length = nodes.length;\n\n      for (var i = 1; i < length; i++) {\n        var param = nodes[i];\n        state.write(', ');\n        generator[param.type](param, state);\n      }\n    }\n    state.write(')');\n  }\n\n  function expressionNeedsParenthesis(node, parentNode, isRightHand) {\n    var nodePrecedence = EXPRESSIONS_PRECEDENCE[node.type];\n    if (nodePrecedence === NEEDS_PARENTHESES) {\n      return true;\n    }\n    var parentNodePrecedence = EXPRESSIONS_PRECEDENCE[parentNode.type];\n    if (nodePrecedence !== parentNodePrecedence) {\n      // Different node types\n      return nodePrecedence < parentNodePrecedence;\n    }\n    if (nodePrecedence !== 13 && nodePrecedence !== 14) {\n      // Not a `LogicalExpression` or `BinaryExpression`\n      return false;\n    }\n    if (node.operator === '**' && parentNode.operator === '**') {\n      // Exponentiation operator has right-to-left associativity\n      return !isRightHand;\n    }\n    if (isRightHand) {\n      // Parenthesis are used if both operators have the same precedence\n      return OPERATOR_PRECEDENCE[node.operator] <= OPERATOR_PRECEDENCE[parentNode.operator];\n    }\n    return OPERATOR_PRECEDENCE[node.operator] < OPERATOR_PRECEDENCE[parentNode.operator];\n  }\n\n  function formatBinaryExpressionPart(state, node, parentNode, isRightHand) {\n    var generator = state.generator;\n\n    if (expressionNeedsParenthesis(node, parentNode, isRightHand)) {\n      state.write('(');\n      generator[node.type](node, state);\n      state.write(')');\n    } else {\n      generator[node.type](node, state);\n    }\n  }\n\n  function reindent(state, text, indent, lineEnd) {\n    /*\n    Writes into `state` the `text` string reindented with the provided `indent`.\n    */\n    var lines = text.split('\\n');\n    var end = lines.length - 1;\n    state.write(lines[0].trim());\n    if (end > 0) {\n      state.write(lineEnd);\n      for (var i = 1; i < end; i++) {\n        state.write(indent + lines[i].trim() + lineEnd);\n      }\n      state.write(indent + lines[end].trim());\n    }\n  }\n\n  function formatComments(state, comments, indent, lineEnd) {\n    var length = comments.length;\n\n    for (var i = 0; i < length; i++) {\n      var comment = comments[i];\n      state.write(indent);\n      if (comment.type[0] === 'L') {\n        // Line comment\n        state.write('// ' + comment.value.trim() + '\\n');\n      } else {\n        // Block comment\n        state.write('/*');\n        reindent(state, comment.value, indent, lineEnd);\n        state.write('*/' + lineEnd);\n      }\n    }\n  }\n\n  function hasCallExpression(node) {\n    /*\n    Returns `true` if the provided `node` contains a call expression and `false` otherwise.\n    */\n    var currentNode = node;\n    while (currentNode != null) {\n      var _currentNode = currentNode,\n          type = _currentNode.type;\n\n      if (type[0] === 'C' && type[1] === 'a') {\n        // Is CallExpression\n        return true;\n      } else if (type[0] === 'M' && type[1] === 'e' && type[2] === 'm') {\n        // Is MemberExpression\n        currentNode = currentNode.object;\n      } else {\n        return false;\n      }\n    }\n  }\n\n  function formatVariableDeclaration(state, node) {\n    var generator = state.generator;\n    var declarations = node.declarations;\n\n    state.write(node.kind + ' ');\n    var length = declarations.length;\n\n    if (length > 0) {\n      generator.VariableDeclarator(declarations[0], state);\n      for (var i = 1; i < length; i++) {\n        state.write(', ');\n        generator.VariableDeclarator(declarations[i], state);\n      }\n    }\n  }\n\n  var ForInStatement = void 0,\n      FunctionDeclaration = void 0,\n      RestElement = void 0,\n      BinaryExpression = void 0,\n      ArrayExpression = void 0,\n      BlockStatement = void 0;\n\n  var baseGenerator = exports.baseGenerator = {\n    Program: function Program(node, state) {\n      var indent = state.indent.repeat(state.indentLevel);\n      var lineEnd = state.lineEnd,\n          writeComments = state.writeComments;\n\n      if (writeComments && node.comments != null) {\n        formatComments(state, node.comments, indent, lineEnd);\n      }\n      var statements = node.body;\n      var length = statements.length;\n\n      for (var i = 0; i < length; i++) {\n        var statement = statements[i];\n        if (writeComments && statement.comments != null) {\n          formatComments(state, statement.comments, indent, lineEnd);\n        }\n        state.write(indent);\n        this[statement.type](statement, state);\n        state.write(lineEnd);\n      }\n      if (writeComments && node.trailingComments != null) {\n        formatComments(state, node.trailingComments, indent, lineEnd);\n      }\n    },\n\n    BlockStatement: BlockStatement = function BlockStatement(node, state) {\n      var indent = state.indent.repeat(state.indentLevel++);\n      var lineEnd = state.lineEnd,\n          writeComments = state.writeComments;\n\n      var statementIndent = indent + state.indent;\n      state.write('{');\n      var statements = node.body;\n      if (statements != null && statements.length > 0) {\n        state.write(lineEnd);\n        if (writeComments && node.comments != null) {\n          formatComments(state, node.comments, statementIndent, lineEnd);\n        }\n        var length = statements.length;\n\n        for (var i = 0; i < length; i++) {\n          var statement = statements[i];\n          if (writeComments && statement.comments != null) {\n            formatComments(state, statement.comments, statementIndent, lineEnd);\n          }\n          state.write(statementIndent);\n          this[statement.type](statement, state);\n          state.write(lineEnd);\n        }\n        state.write(indent);\n      } else {\n        if (writeComments && node.comments != null) {\n          state.write(lineEnd);\n          formatComments(state, node.comments, statementIndent, lineEnd);\n          state.write(indent);\n        }\n      }\n      if (writeComments && node.trailingComments != null) {\n        formatComments(state, node.trailingComments, statementIndent, lineEnd);\n      }\n      state.write('}');\n      state.indentLevel--;\n    },\n    ClassBody: BlockStatement,\n    EmptyStatement: function EmptyStatement(node, state) {\n      state.write(';');\n    },\n    ExpressionStatement: function ExpressionStatement(node, state) {\n      var precedence = EXPRESSIONS_PRECEDENCE[node.expression.type];\n      if (precedence === NEEDS_PARENTHESES || precedence === 3 && node.expression.left.type[0] === 'O') {\n        // Should always have parentheses or is an AssignmentExpression to an ObjectPattern\n        state.write('(');\n        this[node.expression.type](node.expression, state);\n        state.write(')');\n      } else {\n        this[node.expression.type](node.expression, state);\n      }\n      state.write(';');\n    },\n    IfStatement: function IfStatement(node, state) {\n      state.write('if (');\n      this[node.test.type](node.test, state);\n      state.write(') ');\n      this[node.consequent.type](node.consequent, state);\n      if (node.alternate != null) {\n        state.write(' else ');\n        this[node.alternate.type](node.alternate, state);\n      }\n    },\n    LabeledStatement: function LabeledStatement(node, state) {\n      this[node.label.type](node.label, state);\n      state.write(': ');\n      this[node.body.type](node.body, state);\n    },\n    BreakStatement: function BreakStatement(node, state) {\n      state.write('break');\n      if (node.label != null) {\n        state.write(' ');\n        this[node.label.type](node.label, state);\n      }\n      state.write(';');\n    },\n    ContinueStatement: function ContinueStatement(node, state) {\n      state.write('continue');\n      if (node.label != null) {\n        state.write(' ');\n        this[node.label.type](node.label, state);\n      }\n      state.write(';');\n    },\n    WithStatement: function WithStatement(node, state) {\n      state.write('with (');\n      this[node.object.type](node.object, state);\n      state.write(') ');\n      this[node.body.type](node.body, state);\n    },\n    SwitchStatement: function SwitchStatement(node, state) {\n      var indent = state.indent.repeat(state.indentLevel++);\n      var lineEnd = state.lineEnd,\n          writeComments = state.writeComments;\n\n      state.indentLevel++;\n      var caseIndent = indent + state.indent;\n      var statementIndent = caseIndent + state.indent;\n      state.write('switch (');\n      this[node.discriminant.type](node.discriminant, state);\n      state.write(') {' + lineEnd);\n      var occurences = node.cases;\n      var occurencesCount = occurences.length;\n\n      for (var i = 0; i < occurencesCount; i++) {\n        var occurence = occurences[i];\n        if (writeComments && occurence.comments != null) {\n          formatComments(state, occurence.comments, caseIndent, lineEnd);\n        }\n        if (occurence.test) {\n          state.write(caseIndent + 'case ');\n          this[occurence.test.type](occurence.test, state);\n          state.write(':' + lineEnd);\n        } else {\n          state.write(caseIndent + 'default:' + lineEnd);\n        }\n        var consequent = occurence.consequent;\n        var consequentCount = consequent.length;\n\n        for (var _i = 0; _i < consequentCount; _i++) {\n          var statement = consequent[_i];\n          if (writeComments && statement.comments != null) {\n            formatComments(state, statement.comments, statementIndent, lineEnd);\n          }\n          state.write(statementIndent);\n          this[statement.type](statement, state);\n          state.write(lineEnd);\n        }\n      }\n      state.indentLevel -= 2;\n      state.write(indent + '}');\n    },\n    ReturnStatement: function ReturnStatement(node, state) {\n      state.write('return');\n      if (node.argument) {\n        state.write(' ');\n        this[node.argument.type](node.argument, state);\n      }\n      state.write(';');\n    },\n    ThrowStatement: function ThrowStatement(node, state) {\n      state.write('throw ');\n      this[node.argument.type](node.argument, state);\n      state.write(';');\n    },\n    TryStatement: function TryStatement(node, state) {\n      state.write('try ');\n      this[node.block.type](node.block, state);\n      if (node.handler) {\n        var handler = node.handler;\n\n        state.write(' catch (');\n        this[handler.param.type](handler.param, state);\n        state.write(') ');\n        this[handler.body.type](handler.body, state);\n      }\n      if (node.finalizer) {\n        state.write(' finally ');\n        this[node.finalizer.type](node.finalizer, state);\n      }\n    },\n    WhileStatement: function WhileStatement(node, state) {\n      state.write('while (');\n      this[node.test.type](node.test, state);\n      state.write(') ');\n      this[node.body.type](node.body, state);\n    },\n    DoWhileStatement: function DoWhileStatement(node, state) {\n      state.write('do ');\n      this[node.body.type](node.body, state);\n      state.write(' while (');\n      this[node.test.type](node.test, state);\n      state.write(');');\n    },\n    ForStatement: function ForStatement(node, state) {\n      state.write('for (');\n      if (node.init != null) {\n        var init = node.init;\n\n        if (init.type[0] === 'V') {\n          formatVariableDeclaration(state, init);\n        } else {\n          this[init.type](init, state);\n        }\n      }\n      state.write('; ');\n      if (node.test) {\n        this[node.test.type](node.test, state);\n      }\n      state.write('; ');\n      if (node.update) {\n        this[node.update.type](node.update, state);\n      }\n      state.write(') ');\n      this[node.body.type](node.body, state);\n    },\n\n    ForInStatement: ForInStatement = function ForInStatement(node, state) {\n      state.write('for (');\n      var left = node.left;\n\n      if (left.type[0] === 'V') {\n        formatVariableDeclaration(state, left);\n      } else {\n        this[left.type](left, state);\n      }\n      // Identifying whether node.type is `ForInStatement` or `ForOfStatement`\n      state.write(node.type[3] === 'I' ? ' in ' : ' of ');\n      this[node.right.type](node.right, state);\n      state.write(') ');\n      this[node.body.type](node.body, state);\n    },\n    ForOfStatement: ForInStatement,\n    DebuggerStatement: function DebuggerStatement(node, state) {\n      state.write('debugger;' + state.lineEnd);\n    },\n\n    FunctionDeclaration: FunctionDeclaration = function FunctionDeclaration(node, state) {\n      state.write((node.async ? 'async ' : '') + (node.generator ? 'function* ' : 'function ') + (node.id ? node.id.name : ''), node);\n      formatSequence(state, node.params);\n      state.write(' ');\n      this[node.body.type](node.body, state);\n    },\n    FunctionExpression: FunctionDeclaration,\n    VariableDeclaration: function VariableDeclaration(node, state) {\n      formatVariableDeclaration(state, node);\n      state.write(';');\n    },\n    VariableDeclarator: function VariableDeclarator(node, state) {\n      this[node.id.type](node.id, state);\n      if (node.init != null) {\n        state.write(' = ');\n        this[node.init.type](node.init, state);\n      }\n    },\n    ClassDeclaration: function ClassDeclaration(node, state) {\n      state.write('class ' + (node.id ? node.id.name + ' ' : ''), node);\n      if (node.superClass) {\n        state.write('extends ');\n        this[node.superClass.type](node.superClass, state);\n        state.write(' ');\n      }\n      this.ClassBody(node.body, state);\n    },\n    ImportDeclaration: function ImportDeclaration(node, state) {\n      state.write('import ');\n      var specifiers = node.specifiers;\n      var length = specifiers.length;\n      // NOTE: Once babili is fixed, put this after condition\n      // https://github.com/babel/babili/issues/430\n\n      var i = 0;\n      if (length > 0) {\n        for (; i < length;) {\n          if (i > 0) {\n            state.write(', ');\n          }\n          var specifier = specifiers[i];\n          var type = specifier.type[6];\n          if (type === 'D') {\n            // ImportDefaultSpecifier\n            state.write(specifier.local.name, specifier);\n            i++;\n          } else if (type === 'N') {\n            // ImportNamespaceSpecifier\n            state.write('* as ' + specifier.local.name, specifier);\n            i++;\n          } else {\n            // ImportSpecifier\n            break;\n          }\n        }\n        if (i < length) {\n          state.write('{');\n          for (;;) {\n            var _specifier = specifiers[i];\n            var name = _specifier.imported.name;\n\n            state.write(name, _specifier);\n            if (name !== _specifier.local.name) {\n              state.write(' as ' + _specifier.local.name);\n            }\n            if (++i < length) {\n              state.write(', ');\n            } else {\n              break;\n            }\n          }\n          state.write('}');\n        }\n        state.write(' from ');\n      }\n      this.Literal(node.source, state);\n      state.write(';');\n    },\n    ExportDefaultDeclaration: function ExportDefaultDeclaration(node, state) {\n      state.write('export default ');\n      this[node.declaration.type](node.declaration, state);\n      if (EXPRESSIONS_PRECEDENCE[node.declaration.type] && node.declaration.type[0] !== 'F') {\n        // All expression nodes except `FunctionExpression`\n        state.write(';');\n      }\n    },\n    ExportNamedDeclaration: function ExportNamedDeclaration(node, state) {\n      state.write('export ');\n      if (node.declaration) {\n        this[node.declaration.type](node.declaration, state);\n      } else {\n        state.write('{');\n        var specifiers = node.specifiers,\n            length = specifiers.length;\n\n        if (length > 0) {\n          for (var i = 0;;) {\n            var specifier = specifiers[i];\n            var name = specifier.local.name;\n\n            state.write(name, specifier);\n            if (name !== specifier.exported.name) {\n              state.write(' as ' + specifier.exported.name);\n            }\n            if (++i < length) {\n              state.write(', ');\n            } else {\n              break;\n            }\n          }\n        }\n        state.write('}');\n        if (node.source) {\n          state.write(' from ');\n          this.Literal(node.source, state);\n        }\n        state.write(';');\n      }\n    },\n    ExportAllDeclaration: function ExportAllDeclaration(node, state) {\n      state.write('export * from ');\n      this.Literal(node.source, state);\n      state.write(';');\n    },\n    MethodDefinition: function MethodDefinition(node, state) {\n      if (node.static) {\n        state.write('static ');\n      }\n      var kind = node.kind[0];\n      if (kind === 'g' || kind === 's') {\n        // Getter or setter\n        state.write(node.kind + ' ');\n      }\n      if (node.value.async) {\n        state.write('async ');\n      }\n      if (node.value.generator) {\n        state.write('*');\n      }\n      if (node.computed) {\n        state.write('[');\n        this[node.key.type](node.key, state);\n        state.write(']');\n      } else {\n        this[node.key.type](node.key, state);\n      }\n      formatSequence(state, node.value.params);\n      state.write(' ');\n      this[node.value.body.type](node.value.body, state);\n    },\n    ClassExpression: function ClassExpression(node, state) {\n      this.ClassDeclaration(node, state);\n    },\n    ArrowFunctionExpression: function ArrowFunctionExpression(node, state) {\n      state.write(node.async ? 'async ' : '', node);\n      var params = node.params;\n\n      if (params != null) {\n        // Omit parenthesis if only one named parameter\n        if (params.length === 1 && params[0].type[0] === 'I') {\n          // If params[0].type[0] starts with 'I', it can't be `ImportDeclaration` nor `IfStatement` and thus is `Identifier`\n          state.write(params[0].name, params[0]);\n        } else {\n          formatSequence(state, node.params);\n        }\n      }\n      state.write(' => ');\n      if (node.body.type[0] === 'O') {\n        // Body is an object expression\n        state.write('(');\n        this.ObjectExpression(node.body, state);\n        state.write(')');\n      } else {\n        this[node.body.type](node.body, state);\n      }\n    },\n    ThisExpression: function ThisExpression(node, state) {\n      state.write('this', node);\n    },\n    Super: function Super(node, state) {\n      state.write('super', node);\n    },\n\n    RestElement: RestElement = function RestElement(node, state) {\n      state.write('...');\n      this[node.argument.type](node.argument, state);\n    },\n    SpreadElement: RestElement,\n    YieldExpression: function YieldExpression(node, state) {\n      state.write(node.delegate ? 'yield*' : 'yield');\n      if (node.argument) {\n        state.write(' ');\n        this[node.argument.type](node.argument, state);\n      }\n    },\n    AwaitExpression: function AwaitExpression(node, state) {\n      state.write('await ');\n      if (node.argument) {\n        this[node.argument.type](node.argument, state);\n      }\n    },\n    TemplateLiteral: function TemplateLiteral(node, state) {\n      var quasis = node.quasis,\n          expressions = node.expressions;\n\n      state.write('`');\n      var length = expressions.length;\n\n      for (var i = 0; i < length; i++) {\n        var expression = expressions[i];\n        state.write(quasis[i].value.raw);\n        state.write('${');\n        this[expression.type](expression, state);\n        state.write('}');\n      }\n      state.write(quasis[quasis.length - 1].value.raw);\n      state.write('`');\n    },\n    TaggedTemplateExpression: function TaggedTemplateExpression(node, state) {\n      this[node.tag.type](node.tag, state);\n      this[node.quasi.type](node.quasi, state);\n    },\n\n    ArrayExpression: ArrayExpression = function ArrayExpression(node, state) {\n      state.write('[');\n      if (node.elements.length > 0) {\n        var elements = node.elements,\n            length = elements.length;\n\n        for (var i = 0;;) {\n          var element = elements[i];\n          if (element != null) {\n            this[element.type](element, state);\n          }\n          if (++i < length) {\n            state.write(', ');\n          } else {\n            if (element == null) {\n              state.write(', ');\n            }\n            break;\n          }\n        }\n      }\n      state.write(']');\n    },\n    ArrayPattern: ArrayExpression,\n    ObjectExpression: function ObjectExpression(node, state) {\n      var indent = state.indent.repeat(state.indentLevel++);\n      var lineEnd = state.lineEnd,\n          writeComments = state.writeComments;\n\n      var propertyIndent = indent + state.indent;\n      state.write('{');\n      if (node.properties.length > 0) {\n        state.write(lineEnd);\n        if (writeComments && node.comments != null) {\n          formatComments(state, node.comments, propertyIndent, lineEnd);\n        }\n        var comma = ',' + lineEnd;\n        var properties = node.properties,\n            length = properties.length;\n\n        for (var i = 0;;) {\n          var property = properties[i];\n          if (writeComments && property.comments != null) {\n            formatComments(state, property.comments, propertyIndent, lineEnd);\n          }\n          state.write(propertyIndent);\n          this.Property(property, state);\n          if (++i < length) {\n            state.write(comma);\n          } else {\n            break;\n          }\n        }\n        state.write(lineEnd);\n        if (writeComments && node.trailingComments != null) {\n          formatComments(state, node.trailingComments, propertyIndent, lineEnd);\n        }\n        state.write(indent + '}');\n      } else if (writeComments) {\n        if (node.comments != null) {\n          state.write(lineEnd);\n          formatComments(state, node.comments, propertyIndent, lineEnd);\n          if (node.trailingComments != null) {\n            formatComments(state, node.trailingComments, propertyIndent, lineEnd);\n          }\n          state.write(indent + '}');\n        } else if (node.trailingComments != null) {\n          state.write(lineEnd);\n          formatComments(state, node.trailingComments, propertyIndent, lineEnd);\n          state.write(indent + '}');\n        } else {\n          state.write('}');\n        }\n      } else {\n        state.write('}');\n      }\n      state.indentLevel--;\n    },\n    Property: function Property(node, state) {\n      if (node.method || node.kind[0] !== 'i') {\n        // Either a method or of kind `set` or `get` (not `init`)\n        this.MethodDefinition(node, state);\n      } else {\n        if (!node.shorthand) {\n          if (node.computed) {\n            state.write('[');\n            this[node.key.type](node.key, state);\n            state.write(']');\n          } else {\n            this[node.key.type](node.key, state);\n          }\n          state.write(': ');\n        }\n        this[node.value.type](node.value, state);\n      }\n    },\n    ObjectPattern: function ObjectPattern(node, state) {\n      state.write('{');\n      if (node.properties.length > 0) {\n        var properties = node.properties,\n            length = properties.length;\n\n        for (var i = 0;;) {\n          this[properties[i].type](properties[i], state);\n          if (++i < length) {\n            state.write(', ');\n          } else {\n            break;\n          }\n        }\n      }\n      state.write('}');\n    },\n    SequenceExpression: function SequenceExpression(node, state) {\n      formatSequence(state, node.expressions);\n    },\n    UnaryExpression: function UnaryExpression(node, state) {\n      if (node.prefix) {\n        state.write(node.operator);\n        if (node.operator.length > 1) {\n          state.write(' ');\n        }\n        if (EXPRESSIONS_PRECEDENCE[node.argument.type] < EXPRESSIONS_PRECEDENCE.UnaryExpression) {\n          state.write('(');\n          this[node.argument.type](node.argument, state);\n          state.write(')');\n        } else {\n          this[node.argument.type](node.argument, state);\n        }\n      } else {\n        // FIXME: This case never occurs\n        this[node.argument.type](node.argument, state);\n        state.write(node.operator);\n      }\n    },\n    UpdateExpression: function UpdateExpression(node, state) {\n      // Always applied to identifiers or members, no parenthesis check needed\n      if (node.prefix) {\n        state.write(node.operator);\n        this[node.argument.type](node.argument, state);\n      } else {\n        this[node.argument.type](node.argument, state);\n        state.write(node.operator);\n      }\n    },\n    AssignmentExpression: function AssignmentExpression(node, state) {\n      this[node.left.type](node.left, state);\n      state.write(' ' + node.operator + ' ');\n      this[node.right.type](node.right, state);\n    },\n    AssignmentPattern: function AssignmentPattern(node, state) {\n      this[node.left.type](node.left, state);\n      state.write(' = ');\n      this[node.right.type](node.right, state);\n    },\n\n    BinaryExpression: BinaryExpression = function BinaryExpression(node, state) {\n      if (node.operator === 'in') {\n        // Avoids confusion in `for` loops initializers\n        state.write('(');\n        formatBinaryExpressionPart(state, node.left, node, false);\n        state.write(' ' + node.operator + ' ');\n        formatBinaryExpressionPart(state, node.right, node, true);\n        state.write(')');\n      } else {\n        formatBinaryExpressionPart(state, node.left, node, false);\n        state.write(' ' + node.operator + ' ');\n        formatBinaryExpressionPart(state, node.right, node, true);\n      }\n    },\n    LogicalExpression: BinaryExpression,\n    ConditionalExpression: function ConditionalExpression(node, state) {\n      if (EXPRESSIONS_PRECEDENCE[node.test.type] > EXPRESSIONS_PRECEDENCE.ConditionalExpression) {\n        this[node.test.type](node.test, state);\n      } else {\n        state.write('(');\n        this[node.test.type](node.test, state);\n        state.write(')');\n      }\n      state.write(' ? ');\n      this[node.consequent.type](node.consequent, state);\n      state.write(' : ');\n      this[node.alternate.type](node.alternate, state);\n    },\n    NewExpression: function NewExpression(node, state) {\n      state.write('new ');\n      if (EXPRESSIONS_PRECEDENCE[node.callee.type] < EXPRESSIONS_PRECEDENCE.CallExpression || hasCallExpression(node.callee)) {\n        state.write('(');\n        this[node.callee.type](node.callee, state);\n        state.write(')');\n      } else {\n        this[node.callee.type](node.callee, state);\n      }\n      formatSequence(state, node['arguments']);\n    },\n    CallExpression: function CallExpression(node, state) {\n      if (EXPRESSIONS_PRECEDENCE[node.callee.type] < EXPRESSIONS_PRECEDENCE.CallExpression) {\n        state.write('(');\n        this[node.callee.type](node.callee, state);\n        state.write(')');\n      } else {\n        this[node.callee.type](node.callee, state);\n      }\n      formatSequence(state, node['arguments']);\n    },\n    MemberExpression: function MemberExpression(node, state) {\n      if (EXPRESSIONS_PRECEDENCE[node.object.type] < EXPRESSIONS_PRECEDENCE.MemberExpression) {\n        state.write('(');\n        this[node.object.type](node.object, state);\n        state.write(')');\n      } else {\n        this[node.object.type](node.object, state);\n      }\n      if (node.computed) {\n        state.write('[');\n        this[node.property.type](node.property, state);\n        state.write(']');\n      } else {\n        state.write('.');\n        this[node.property.type](node.property, state);\n      }\n    },\n    MetaProperty: function MetaProperty(node, state) {\n      state.write(node.meta.name + '.' + node.property.name, node);\n    },\n    Identifier: function Identifier(node, state) {\n      state.write(node.name, node);\n    },\n    Literal: function Literal(node, state) {\n      if (node.raw != null) {\n        state.write(node.raw, node);\n      } else if (node.regex != null) {\n        this.RegExpLiteral(node, state);\n      } else {\n        state.write(stringify(node.value), node);\n      }\n    },\n    RegExpLiteral: function RegExpLiteral(node, state) {\n      var regex = node.regex;\n\n      state.write('/' + regex.pattern + '/' + regex.flags, node);\n    }\n  };\n\n  var EMPTY_OBJECT = {};\n\n  var State = function () {\n    function State(options) {\n      _classCallCheck(this, State);\n\n      var setup = options == null ? EMPTY_OBJECT : options;\n      this.output = '';\n      // Functional options\n      if (setup.output != null) {\n        this.output = setup.output;\n        this.write = this.writeToStream;\n      } else {\n        this.output = '';\n      }\n      this.generator = setup.generator != null ? setup.generator : baseGenerator;\n      // Formating setup\n      this.indent = setup.indent != null ? setup.indent : '  ';\n      this.lineEnd = setup.lineEnd != null ? setup.lineEnd : '\\n';\n      this.indentLevel = setup.startingIndentLevel != null ? setup.startingIndentLevel : 0;\n      this.writeComments = setup.comments ? setup.comments : false;\n      // Source map\n      if (setup.sourceMap != null) {\n        this.write = setup.output == null ? this.writeAndMap : this.writeToStreamAndMap;\n        this.sourceMap = setup.sourceMap;\n        this.line = 1;\n        this.column = 0;\n        this.lineEndSize = this.lineEnd.split('\\n').length - 1;\n        this.mapping = {\n          original: null,\n          generated: this,\n          name: undefined,\n          source: setup.sourceMap.file || setup.sourceMap._file\n        };\n      }\n    }\n\n    State.prototype.write = function write(code) {\n      this.output += code;\n    };\n\n    State.prototype.writeToStream = function writeToStream(code) {\n      this.output.write(code);\n    };\n\n    State.prototype.writeAndMap = function writeAndMap(code, node) {\n      this.output += code;\n      this.map(code, node);\n    };\n\n    State.prototype.writeToStreamAndMap = function writeToStreamAndMap(code, node) {\n      this.output.write(code);\n      this.map(code, node);\n    };\n\n    State.prototype.map = function map(code, node) {\n      if (node != null && node.loc != null) {\n        var mapping = this.mapping;\n\n        mapping.original = node.loc.start;\n        mapping.name = node.name;\n        this.sourceMap.addMapping(mapping);\n      }\n      if (code.length > 0) {\n        if (this.lineEndSize > 0) {\n          if (code.endsWith(this.lineEnd)) {\n            this.line += this.lineEndSize;\n            this.column = 0;\n          } else if (code[code.length - 1] === '\\n') {\n            // Case of inline comment\n            this.line++;\n            this.column = 0;\n          } else {\n            this.column += code.length;\n          }\n        } else {\n          if (code[code.length - 1] === '\\n') {\n            // Case of inline comment\n            this.line++;\n            this.column = 0;\n          } else {\n            this.column += code.length;\n          }\n        }\n      }\n    };\n\n    State.prototype.toString = function toString() {\n      return this.output;\n    };\n\n    return State;\n  }();\n\n  function generate(node, options) {\n    /*\n    Returns a string representing the rendered code of the provided AST `node`.\n    The `options` are:\n     - `indent`: string to use for indentation (defaults to `␣␣`)\n    - `lineEnd`: string to use for line endings (defaults to `\\n`)\n    - `startingIndentLevel`: indent level to start from (defaults to `0`)\n    - `comments`: generate comments if `true` (defaults to `false`)\n    - `output`: output stream to write the rendered code to (defaults to `null`)\n    - `generator`: custom code generator (defaults to `baseGenerator`)\n    */\n    var state = new State(options);\n    // Travel through the AST node and generate the code\n    state.generator[node.type](node, state);\n    return state.output;\n  }\n});\n\n\n},{}],145:[function(require,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  for (var i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n\n},{}],146:[function(require,module,exports){\n/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (acequire, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\n\n\nif (!ACE_NAMESPACE && typeof acequirejs !== \"undefined\")\n    return;\n\n\nvar define = function(module, deps, payload) {\n    if (typeof module !== \"string\") {\n        if (define.original)\n            define.original.apply(this, arguments);\n        else {\n            console.error(\"dropping module because define wasn\\'t a string.\");\n            console.trace();\n        }\n        return;\n    }\n    if (arguments.length == 2)\n        payload = deps;\n    if (!define.modules[module]) {\n        define.payloads[module] = payload;\n        define.modules[module] = null;\n    }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _acequire = function(parentId, module, callback) {\n    if (typeof module === \"string\") {\n        var payload = lookup(parentId, module);\n        if (payload != undefined) {\n            callback && callback();\n            return payload;\n        }\n    } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n        var params = [];\n        for (var i = 0, l = module.length; i < l; ++i) {\n            var dep = lookup(parentId, module[i]);\n            if (dep == undefined && acequire.original)\n                return;\n            params.push(dep);\n        }\n        return callback && callback.apply(null, params) || true;\n    }\n};\n\nvar acequire = function(module, callback) {\n    var packagedModule = _acequire(\"\", module, callback);\n    if (packagedModule == undefined && acequire.original)\n        return acequire.original.apply(this, arguments);\n    return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin acequires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative acequires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = base + \"/\" + moduleName;\n\n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\n    moduleName = normalizeModule(parentId, moduleName);\n\n    var module = define.modules[moduleName];\n    if (!module) {\n        module = define.payloads[moduleName];\n        if (typeof module === 'function') {\n            var exports = {};\n            var mod = {\n                id: moduleName,\n                uri: '',\n                exports: exports,\n                packaged: true\n            };\n\n            var req = function(module, callback) {\n                return _acequire(moduleName, module, callback);\n            };\n\n            var returnValue = module(req, exports, mod);\n            exports = returnValue || mod.exports;\n            define.modules[moduleName] = exports;\n            delete define.payloads[moduleName];\n        }\n        module = define.modules[moduleName] = exports || module;\n    }\n    return module;\n};\n\nfunction exportAce(ns) {\n    var root = global;\n    if (ns) {\n        if (!global[ns])\n            global[ns] = {};\n        root = global[ns];\n    }\n\n    if (!root.define || !root.define.packaged) {\n        define.original = root.define;\n        root.define = define;\n        root.define.packaged = true;\n    }\n\n    if (!root.acequire || !root.acequire.packaged) {\n        acequire.original = root.acequire;\n        root.acequire = acequire;\n        root.acequire.packaged = true;\n    }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n    if (!compliantLastIndexIncrement) {\n        RegExp.prototype.test = function (str) {\n            var match = real.exec.call(this, str);\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./regexp\");\nacequire(\"./es5-shim\");\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n    if (!doc)\n        doc = document;\n    return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n}\n\nexports.createElement = function(tag, ns) {\n    return document.createElementNS ?\n           document.createElementNS(ns || XHTML_NS, tag) :\n           document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n    var classes = (el.className + \"\").split(/\\s+/g);\n    return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n    if (!exports.hasCssClass(el, name)) {\n        el.className += \" \" + name;\n    }\n};\nexports.removeCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        classes.splice(index, 1);\n    }\n    el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g), add = true;\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        add = false;\n        classes.splice(index, 1);\n    }\n    if (add)\n        classes.push(name);\n\n    el.className = classes.join(\" \");\n    return add;\n};\nexports.setCssClass = function(node, className, include) {\n    if (include) {\n        exports.addCssClass(node, className);\n    } else {\n        exports.removeCssClass(node, className);\n    }\n};\n\nexports.hasCssString = function(id, doc) {\n    var index = 0, sheets;\n    doc = doc || document;\n\n    if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n        while (index < sheets.length)\n            if (sheets[index++].owningElement.id === id) return true;\n    } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n        while (index < sheets.length)\n            if (sheets[index++].id === id) return true;\n    }\n\n    return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n    doc = doc || document;\n    if (id && exports.hasCssString(id, doc))\n        return null;\n    \n    var style;\n    \n    if (id)\n        cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n    \n    if (doc.createStyleSheet) {\n        style = doc.createStyleSheet();\n        style.cssText = cssText;\n        if (id)\n            style.owningElement.id = id;\n    } else {\n        style = exports.createElement(\"style\");\n        style.appendChild(doc.createTextNode(cssText));\n        if (id)\n            style.id = id;\n\n        exports.getDocumentHead(doc).appendChild(style);\n    }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n    if (doc.createStyleSheet) {\n        doc.createStyleSheet(uri);\n    } else {\n        var link = exports.createElement('link');\n        link.rel = 'stylesheet';\n        link.href = uri;\n\n        exports.getDocumentHead(doc).appendChild(link);\n    }\n};\n\nexports.getInnerWidth = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n        element.clientWidth\n    );\n};\n\nexports.getInnerHeight = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n        element.clientHeight\n    );\n};\n\nexports.scrollbarWidth = function(document) {\n    var inner = exports.createElement(\"ace_inner\");\n    inner.style.width = \"100%\";\n    inner.style.minWidth = \"0px\";\n    inner.style.height = \"200px\";\n    inner.style.display = \"block\";\n\n    var outer = exports.createElement(\"ace_outer\");\n    var style = outer.style;\n\n    style.position = \"absolute\";\n    style.left = \"-10000px\";\n    style.overflow = \"hidden\";\n    style.width = \"200px\";\n    style.minWidth = \"0px\";\n    style.height = \"150px\";\n    style.display = \"block\";\n\n    outer.appendChild(inner);\n\n    var body = document.documentElement;\n    body.appendChild(outer);\n\n    var noScrollbar = inner.offsetWidth;\n\n    style.overflow = \"scroll\";\n    var withScrollbar = inner.offsetWidth;\n\n    if (noScrollbar == withScrollbar) {\n        withScrollbar = outer.clientWidth;\n    }\n\n    body.removeChild(outer);\n\n    return noScrollbar-withScrollbar;\n};\n\nif (typeof document == \"undefined\") {\n    exports.importCssString = function() {};\n    return;\n}\n\nif (window.pageYOffset !== undefined) {\n    exports.getPageScrollTop = function() {\n        return window.pageYOffset;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return window.pageXOffset;\n    };\n}\nelse {\n    exports.getPageScrollTop = function() {\n        return document.body.scrollTop;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return document.body.scrollLeft;\n    };\n}\n\nif (window.getComputedStyle)\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n        return window.getComputedStyle(element, \"\") || {};\n    };\nelse\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return element.currentStyle[style];\n        return element.currentStyle;\n    };\nexports.setInnerHtml = function(el, innerHtml) {\n    var element = el.cloneNode(false);//document.createElement(\"div\");\n    element.innerHTML = innerHtml;\n    el.parentNode.replaceChild(element, el);\n    return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n    exports.setInnerText = function(el, innerText) {\n        el.textContent = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.textContent;\n    };\n}\nelse {\n    exports.setInnerText = function(el, innerText) {\n        el.innerText = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.innerText;\n    };\n}\n\nexports.getParentWindow = function(document) {\n    return document.defaultView || document.parentWindow;\n};\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n        constructor: {\n            value: ctor,\n            enumerable: false,\n            writable: true,\n            configurable: true\n        }\n    });\n};\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./fixoldbrowsers\");\n\nvar oop = acequire(\"./oop\");\nvar Keys = (function() {\n    var ret = {\n        MODIFIER_KEYS: {\n            16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n        },\n\n        KEY_MODS: {\n            \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n            \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n        },\n\n        FUNCTION_KEYS : {\n            8  : \"Backspace\",\n            9  : \"Tab\",\n            13 : \"Return\",\n            19 : \"Pause\",\n            27 : \"Esc\",\n            32 : \"Space\",\n            33 : \"PageUp\",\n            34 : \"PageDown\",\n            35 : \"End\",\n            36 : \"Home\",\n            37 : \"Left\",\n            38 : \"Up\",\n            39 : \"Right\",\n            40 : \"Down\",\n            44 : \"Print\",\n            45 : \"Insert\",\n            46 : \"Delete\",\n            96 : \"Numpad0\",\n            97 : \"Numpad1\",\n            98 : \"Numpad2\",\n            99 : \"Numpad3\",\n            100: \"Numpad4\",\n            101: \"Numpad5\",\n            102: \"Numpad6\",\n            103: \"Numpad7\",\n            104: \"Numpad8\",\n            105: \"Numpad9\",\n            '-13': \"NumpadEnter\",\n            112: \"F1\",\n            113: \"F2\",\n            114: \"F3\",\n            115: \"F4\",\n            116: \"F5\",\n            117: \"F6\",\n            118: \"F7\",\n            119: \"F8\",\n            120: \"F9\",\n            121: \"F10\",\n            122: \"F11\",\n            123: \"F12\",\n            144: \"Numlock\",\n            145: \"Scrolllock\"\n        },\n\n        PRINTABLE_KEYS: {\n           32: ' ',  48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',\n           54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',\n           66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',\n           73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',\n           80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',\n           87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',\n          186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n          219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\n        }\n    };\n    var name, i;\n    for (i in ret.FUNCTION_KEYS) {\n        name = ret.FUNCTION_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n    for (i in ret.PRINTABLE_KEYS) {\n        name = ret.PRINTABLE_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n    oop.mixin(ret, ret.MODIFIER_KEYS);\n    oop.mixin(ret, ret.PRINTABLE_KEYS);\n    oop.mixin(ret, ret.FUNCTION_KEYS);\n    ret.enter = ret[\"return\"];\n    ret.escape = ret.esc;\n    ret.del = ret[\"delete\"];\n    ret[173] = '-';\n    \n    (function() {\n        var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n        for (var i = Math.pow(2, mods.length); i--;) {            \n            ret.KEY_MODS[i] = mods.filter(function(x) {\n                return i & ret.KEY_MODS[x];\n            }).join(\"-\") + \"-\";\n        }\n    })();\n\n    ret.KEY_MODS[0] = \"\";\n    ret.KEY_MODS[-1] = \"input-\";\n\n    return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n    var keyString = Keys[keyCode];\n    if (typeof keyString != \"string\")\n        keyString = String.fromCharCode(keyCode);\n    return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.OS = {\n    LINUX: \"LINUX\",\n    MAC: \"MAC\",\n    WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n    if (exports.isMac) {\n        return exports.OS.MAC;\n    } else if (exports.isLinux) {\n        return exports.OS.LINUX;\n    } else {\n        return exports.OS.WINDOWS;\n    }\n};\nif (typeof navigator != \"object\")\n    return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n    (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n    ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n    : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n    \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isTouchPad = ua.indexOf(\"TouchPad\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keys = acequire(\"./keys\");\nvar useragent = acequire(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nexports.addListener = function(elem, type, callback) {\n    if (elem.addEventListener) {\n        return elem.addEventListener(type, callback, false);\n    }\n    if (elem.attachEvent) {\n        var wrapper = function() {\n            callback.call(elem, window.event);\n        };\n        callback._wrapper = wrapper;\n        elem.attachEvent(\"on\" + type, wrapper);\n    }\n};\n\nexports.removeListener = function(elem, type, callback) {\n    if (elem.removeEventListener) {\n        return elem.removeEventListener(type, callback, false);\n    }\n    if (elem.detachEvent) {\n        elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n    }\n};\nexports.stopEvent = function(e) {\n    exports.stopPropagation(e);\n    exports.preventDefault(e);\n    return false;\n};\n\nexports.stopPropagation = function(e) {\n    if (e.stopPropagation)\n        e.stopPropagation();\n    else\n        e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n    if (e.preventDefault)\n        e.preventDefault();\n    else\n        e.returnValue = false;\n};\nexports.getButton = function(e) {\n    if (e.type == \"dblclick\")\n        return 0;\n    if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n        return 2;\n    if (e.preventDefault) {\n        return e.button;\n    }\n    else {\n        return {1:0, 2:2, 4:1}[e.button];\n    }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n    function onMouseUp(e) {\n        eventHandler && eventHandler(e);\n        releaseCaptureHandler && releaseCaptureHandler(e);\n\n        exports.removeListener(document, \"mousemove\", eventHandler, true);\n        exports.removeListener(document, \"mouseup\", onMouseUp, true);\n        exports.removeListener(document, \"dragstart\", onMouseUp, true);\n    }\n\n    exports.addListener(document, \"mousemove\", eventHandler, true);\n    exports.addListener(document, \"mouseup\", onMouseUp, true);\n    exports.addListener(document, \"dragstart\", onMouseUp, true);\n    \n    return onMouseUp;\n};\n\nexports.addTouchMoveListener = function (el, callback) {\n    if (\"ontouchmove\" in el) {\n        var startx, starty;\n        exports.addListener(el, \"touchstart\", function (e) {\n            var touchObj = e.changedTouches[0];\n            startx = touchObj.clientX;\n            starty = touchObj.clientY;\n        });\n        exports.addListener(el, \"touchmove\", function (e) {\n            var factor = 1,\n            touchObj = e.changedTouches[0];\n\n            e.wheelX = -(touchObj.clientX - startx) / factor;\n            e.wheelY = -(touchObj.clientY - starty) / factor;\n\n            startx = touchObj.clientX;\n            starty = touchObj.clientY;\n\n            callback(e);\n        });\n    } \n};\n\nexports.addMouseWheelListener = function(el, callback) {\n    if (\"onmousewheel\" in el) {\n        exports.addListener(el, \"mousewheel\", function(e) {\n            var factor = 8;\n            if (e.wheelDeltaX !== undefined) {\n                e.wheelX = -e.wheelDeltaX / factor;\n                e.wheelY = -e.wheelDeltaY / factor;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = -e.wheelDelta / factor;\n            }\n            callback(e);\n        });\n    } else if (\"onwheel\" in el) {\n        exports.addListener(el, \"wheel\",  function(e) {\n            var factor = 0.35;\n            switch (e.deltaMode) {\n                case e.DOM_DELTA_PIXEL:\n                    e.wheelX = e.deltaX * factor || 0;\n                    e.wheelY = e.deltaY * factor || 0;\n                    break;\n                case e.DOM_DELTA_LINE:\n                case e.DOM_DELTA_PAGE:\n                    e.wheelX = (e.deltaX || 0) * 5;\n                    e.wheelY = (e.deltaY || 0) * 5;\n                    break;\n            }\n            \n            callback(e);\n        });\n    } else {\n        exports.addListener(el, \"DOMMouseScroll\", function(e) {\n            if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n                e.wheelX = (e.detail || 0) * 5;\n                e.wheelY = 0;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = (e.detail || 0) * 5;\n            }\n            callback(e);\n        });\n    }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\n    var clicks = 0;\n    var startX, startY, timer; \n    var eventNames = {\n        2: \"dblclick\",\n        3: \"tripleclick\",\n        4: \"quadclick\"\n    };\n\n    function onMousedown(e) {\n        if (exports.getButton(e) !== 0) {\n            clicks = 0;\n        } else if (e.detail > 1) {\n            clicks++;\n            if (clicks > 4)\n                clicks = 1;\n        } else {\n            clicks = 1;\n        }\n        if (useragent.isIE) {\n            var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n            if (!timer || isNewClick)\n                clicks = 1;\n            if (timer)\n                clearTimeout(timer);\n            timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n\n            if (clicks == 1) {\n                startX = e.clientX;\n                startY = e.clientY;\n            }\n        }\n        \n        e._clicks = clicks;\n\n        eventHandler[callbackName](\"mousedown\", e);\n\n        if (clicks > 4)\n            clicks = 0;\n        else if (clicks > 1)\n            return eventHandler[callbackName](eventNames[clicks], e);\n    }\n    function onDblclick(e) {\n        clicks = 2;\n        if (timer)\n            clearTimeout(timer);\n        timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n        eventHandler[callbackName](\"mousedown\", e);\n        eventHandler[callbackName](eventNames[clicks], e);\n    }\n    if (!Array.isArray(elements))\n        elements = [elements];\n    elements.forEach(function(el) {\n        exports.addListener(el, \"mousedown\", onMousedown);\n        if (useragent.isOldIE)\n            exports.addListener(el, \"dblclick\", onDblclick);\n    });\n};\n\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n    ? function(e) {\n        return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n    }\n    : function(e) {\n        return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n    };\n\nexports.getModifierString = function(e) {\n    return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n    var hashId = getModifierHash(e);\n\n    if (!useragent.isMac && pressedKeys) {\n        if (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\n            hashId |= 8;\n        if (pressedKeys.altGr) {\n            if ((3 & hashId) != 3)\n                pressedKeys.altGr = 0;\n            else\n                return;\n        }\n        if (keyCode === 18 || keyCode === 17) {\n            var location = \"location\" in e ? e.location : e.keyLocation;\n            if (keyCode === 17 && location === 1) {\n                if (pressedKeys[keyCode] == 1)\n                    ts = e.timeStamp;\n            } else if (keyCode === 18 && hashId === 3 && location === 2) {\n                var dt = e.timeStamp - ts;\n                if (dt < 50)\n                    pressedKeys.altGr = true;\n            }\n        }\n    }\n    \n    if (keyCode in keys.MODIFIER_KEYS) {\n        keyCode = -1;\n    }\n    if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\n        keyCode = -1;\n    }\n    \n    if (!hashId && keyCode === 13) {\n        var location = \"location\" in e ? e.location : e.keyLocation;\n        if (location === 3) {\n            callback(e, hashId, -keyCode);\n            if (e.defaultPrevented)\n                return;\n        }\n    }\n    \n    if (useragent.isChromeOS && hashId & 8) {\n        callback(e, hashId, keyCode);\n        if (e.defaultPrevented)\n            return;\n        else\n            hashId &= ~8;\n    }\n    if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n        return false;\n    }\n    \n    return callback(e, hashId, keyCode);\n}\n\n\nexports.addCommandKeyListener = function(el, callback) {\n    var addListener = exports.addListener;\n    if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n        var lastKeyDownKeyCode = null;\n        addListener(el, \"keydown\", function(e) {\n            lastKeyDownKeyCode = e.keyCode;\n        });\n        addListener(el, \"keypress\", function(e) {\n            return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n        });\n    } else {\n        var lastDefaultPrevented = null;\n\n        addListener(el, \"keydown\", function(e) {\n            pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n            var result = normalizeCommandKeys(callback, e, e.keyCode);\n            lastDefaultPrevented = e.defaultPrevented;\n            return result;\n        });\n\n        addListener(el, \"keypress\", function(e) {\n            if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n                exports.stopEvent(e);\n                lastDefaultPrevented = null;\n            }\n        });\n\n        addListener(el, \"keyup\", function(e) {\n            pressedKeys[e.keyCode] = null;\n        });\n\n        if (!pressedKeys) {\n            resetPressedKeys();\n            addListener(window, \"focus\", resetPressedKeys);\n        }\n    }\n};\nfunction resetPressedKeys() {\n    pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n    var postMessageId = 1;\n    exports.nextTick = function(callback, win) {\n        win = win || window;\n        var messageName = \"zero-timeout-message-\" + postMessageId;\n        exports.addListener(win, \"message\", function listener(e) {\n            if (e.data == messageName) {\n                exports.stopPropagation(e);\n                exports.removeListener(win, \"message\", listener);\n                callback();\n            }\n        });\n        win.postMessage(messageName, \"*\");\n    };\n}\n\n\nexports.nextFrame = typeof window == \"object\" && (window.requestAnimationFrame\n    || window.mozRequestAnimationFrame\n    || window.webkitRequestAnimationFrame\n    || window.msRequestAnimationFrame\n    || window.oRequestAnimationFrame);\n\nif (exports.nextFrame)\n    exports.nextFrame = exports.nextFrame.bind(window);\nelse\n    exports.nextFrame = function(callback) {\n        setTimeout(callback, 17);\n    };\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject(array[i]);\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function deepCopy(obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var copy;\n    if (Array.isArray(obj)) {\n        copy = [];\n        for (var key = 0; key < obj.length; key++) {\n            copy[key] = deepCopy(obj[key]);\n        }\n        return copy;\n    }\n    if (Object.prototype.toString.call(obj) !== \"[object Object]\")\n        return obj;\n    \n    copy = {};\n    for (var key in obj)\n        copy[key] = deepCopy(obj[key]);\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE =  useragent.isIE;\n\nvar TextInput = function(parentNode, host) {\n    var text = dom.createElement(\"textarea\");\n    text.className = \"ace_text-input\";\n\n    if (useragent.isTouchPad)\n        text.setAttribute(\"x-palm-disable-auto-cap\", true);\n\n    text.setAttribute(\"wrap\", \"off\");\n    text.setAttribute(\"autocorrect\", \"off\");\n    text.setAttribute(\"autocapitalize\", \"off\");\n    text.setAttribute(\"spellcheck\", false);\n\n    text.style.opacity = \"0\";\n    if (useragent.isOldIE) text.style.top = \"-1000px\";\n    parentNode.insertBefore(text, parentNode.firstChild);\n\n    var PLACEHOLDER = \"\\x01\\x01\";\n\n    var copied = false;\n    var pasted = false;\n    var inComposition = false;\n    var tempStyle = '';\n    var isSelectionEmpty = true;\n    try { var isFocused = document.activeElement === text; } catch(e) {}\n    \n    event.addListener(text, \"blur\", function(e) {\n        host.onBlur(e);\n        isFocused = false;\n    });\n    event.addListener(text, \"focus\", function(e) {\n        isFocused = true;\n        host.onFocus(e);\n        resetSelection();\n    });\n    this.focus = function() {\n        if (tempStyle) return text.focus();\n        var top = text.style.top;\n        text.style.position = \"fixed\";\n        text.style.top = \"0px\";\n        text.focus();\n        setTimeout(function() {\n            text.style.position = \"\";\n            if (text.style.top == \"0px\")\n                text.style.top = top;\n        }, 0);\n    };\n    this.blur = function() {\n        text.blur();\n    };\n    this.isFocused = function() {\n        return isFocused;\n    };\n    var syncSelection = lang.delayedCall(function() {\n        isFocused && resetSelection(isSelectionEmpty);\n    });\n    var syncValue = lang.delayedCall(function() {\n         if (!inComposition) {\n            text.value = PLACEHOLDER;\n            isFocused && resetSelection();\n         }\n    });\n\n    function resetSelection(isEmpty) {\n        if (inComposition)\n            return;\n        inComposition = true;\n        \n        if (inputHandler) {\n            selectionStart = 0;\n            selectionEnd = isEmpty ? 0 : text.value.length - 1;\n        } else {\n            var selectionStart = isEmpty ? 2 : 1;\n            var selectionEnd = 2;\n        }\n        try {\n            text.setSelectionRange(selectionStart, selectionEnd);\n        } catch(e){}\n        \n        inComposition = false;\n    }\n\n    function resetValue() {\n        if (inComposition)\n            return;\n        text.value = PLACEHOLDER;\n        if (useragent.isWebKit)\n            syncValue.schedule();\n    }\n\n    useragent.isWebKit || host.addEventListener('changeSelection', function() {\n        if (host.selection.isEmpty() != isSelectionEmpty) {\n            isSelectionEmpty = !isSelectionEmpty;\n            syncSelection.schedule();\n        }\n    });\n\n    resetValue();\n    if (isFocused)\n        host.onFocus();\n\n\n    var isAllSelected = function(text) {\n        return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n    };\n    if (!text.setSelectionRange && text.createTextRange) {\n        text.setSelectionRange = function(selectionStart, selectionEnd) {\n            var range = this.createTextRange();\n            range.collapse(true);\n            range.moveStart('character', selectionStart);\n            range.moveEnd('character', selectionEnd);\n            range.select();\n        };\n        isAllSelected = function(text) {\n            try {\n                var range = text.ownerDocument.selection.createRange();\n            }catch(e) {}\n            if (!range || range.parentElement() != text) return false;\n                return range.text == text.value;\n        }\n    }\n    if (useragent.isOldIE) {\n        var inPropertyChange = false;\n        var onPropertyChange = function(e){\n            if (inPropertyChange)\n                return;\n            var data = text.value;\n            if (inComposition || !data || data == PLACEHOLDER)\n                return;\n            if (e && data == PLACEHOLDER[0])\n                return syncProperty.schedule();\n\n            sendText(data);\n            inPropertyChange = true;\n            resetValue();\n            inPropertyChange = false;\n        };\n        var syncProperty = lang.delayedCall(onPropertyChange);\n        event.addListener(text, \"propertychange\", onPropertyChange);\n\n        var keytable = { 13:1, 27:1 };\n        event.addListener(text, \"keyup\", function (e) {\n            if (inComposition && (!text.value || keytable[e.keyCode]))\n                setTimeout(onCompositionEnd, 0);\n            if ((text.value.charCodeAt(0)||0) < 129) {\n                return syncProperty.call();\n            }\n            inComposition ? onCompositionUpdate() : onCompositionStart();\n        });\n        event.addListener(text, \"keydown\", function (e) {\n            syncProperty.schedule(50);\n        });\n    }\n\n    var onSelect = function(e) {\n        if (copied) {\n            copied = false;\n        } else if (isAllSelected(text)) {\n            host.selectAll();\n            resetSelection();\n        } else if (inputHandler) {\n            resetSelection(host.selection.isEmpty());\n        }\n    };\n\n    var inputHandler = null;\n    this.setInputHandler = function(cb) {inputHandler = cb};\n    this.getInputHandler = function() {return inputHandler};\n    var afterContextMenu = false;\n    \n    var sendText = function(data) {\n        if (inputHandler) {\n            data = inputHandler(data);\n            inputHandler = null;\n        }\n        if (pasted) {\n            resetSelection();\n            if (data)\n                host.onPaste(data);\n            pasted = false;\n        } else if (data == PLACEHOLDER.charAt(0)) {\n            if (afterContextMenu)\n                host.execCommand(\"del\", {source: \"ace\"});\n            else // some versions of android do not fire keydown when pressing backspace\n                host.execCommand(\"backspace\", {source: \"ace\"});\n        } else {\n            if (data.substring(0, 2) == PLACEHOLDER)\n                data = data.substr(2);\n            else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n                data = data.substr(1);\n            else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            \n            if (data)\n                host.onTextInput(data);\n        }\n        if (afterContextMenu)\n            afterContextMenu = false;\n    };\n    var onInput = function(e) {\n        if (inComposition)\n            return;\n        var data = text.value;\n        sendText(data);\n        resetValue();\n    };\n    \n    var handleClipboardData = function(e, data, forceIEMime) {\n        var clipboardData = e.clipboardData || window.clipboardData;\n        if (!clipboardData || BROKEN_SETDATA)\n            return;\n        var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n        try {\n            if (data) {\n                return clipboardData.setData(mime, data) !== false;\n            } else {\n                return clipboardData.getData(mime);\n            }\n        } catch(e) {\n            if (!forceIEMime)\n                return handleClipboardData(e, data, true);\n        }\n    };\n\n    var doCopy = function(e, isCut) {\n        var data = host.getCopyText();\n        if (!data)\n            return event.preventDefault(e);\n\n        if (handleClipboardData(e, data)) {\n            isCut ? host.onCut() : host.onCopy();\n            event.preventDefault(e);\n        } else {\n            copied = true;\n            text.value = data;\n            text.select();\n            setTimeout(function(){\n                copied = false;\n                resetValue();\n                resetSelection();\n                isCut ? host.onCut() : host.onCopy();\n            });\n        }\n    };\n    \n    var onCut = function(e) {\n        doCopy(e, true);\n    };\n    \n    var onCopy = function(e) {\n        doCopy(e, false);\n    };\n    \n    var onPaste = function(e) {\n        var data = handleClipboardData(e);\n        if (typeof data == \"string\") {\n            if (data)\n                host.onPaste(data, e);\n            if (useragent.isIE)\n                setTimeout(resetSelection);\n            event.preventDefault(e);\n        }\n        else {\n            text.value = \"\";\n            pasted = true;\n        }\n    };\n\n    event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n    event.addListener(text, \"select\", onSelect);\n\n    event.addListener(text, \"input\", onInput);\n\n    event.addListener(text, \"cut\", onCut);\n    event.addListener(text, \"copy\", onCopy);\n    event.addListener(text, \"paste\", onPaste);\n    if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)){\n        event.addListener(parentNode, \"keydown\", function(e) {\n            if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n                return;\n\n            switch (e.keyCode) {\n                case 67:\n                    onCopy(e);\n                    break;\n                case 86:\n                    onPaste(e);\n                    break;\n                case 88:\n                    onCut(e);\n                    break;\n            }\n        });\n    }\n    var onCompositionStart = function(e) {\n        if (inComposition || !host.onCompositionStart || host.$readOnly) \n            return;\n        inComposition = {};\n        inComposition.canUndo = host.session.$undoManager;\n        host.onCompositionStart();\n        setTimeout(onCompositionUpdate, 0);\n        host.on(\"mousedown\", onCompositionEnd);\n        if (inComposition.canUndo && !host.selection.isEmpty()) {\n            host.insert(\"\");\n            host.session.markUndoGroup();\n            host.selection.clearSelection();\n        }\n        host.session.markUndoGroup();\n    };\n\n    var onCompositionUpdate = function() {\n        if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n            return;\n        var val = text.value.replace(/\\x01/g, \"\");\n        if (inComposition.lastValue === val) return;\n        \n        host.onCompositionUpdate(val);\n        if (inComposition.lastValue)\n            host.undo();\n        if (inComposition.canUndo)\n            inComposition.lastValue = val;\n        if (inComposition.lastValue) {\n            var r = host.selection.getRange();\n            host.insert(inComposition.lastValue);\n            host.session.markUndoGroup();\n            inComposition.range = host.selection.getRange();\n            host.selection.setRange(r);\n            host.selection.clearSelection();\n        }\n    };\n\n    var onCompositionEnd = function(e) {\n        if (!host.onCompositionEnd || host.$readOnly) return;\n        var c = inComposition;\n        inComposition = false;\n        var timer = setTimeout(function() {\n            timer = null;\n            var str = text.value.replace(/\\x01/g, \"\");\n            if (inComposition)\n                return;\n            else if (str == c.lastValue)\n                resetValue();\n            else if (!c.lastValue && str) {\n                resetValue();\n                sendText(str);\n            }\n        });\n        inputHandler = function compositionInputHandler(str) {\n            if (timer)\n                clearTimeout(timer);\n            str = str.replace(/\\x01/g, \"\");\n            if (str == c.lastValue)\n                return \"\";\n            if (c.lastValue && timer)\n                host.undo();\n            return str;\n        };\n        host.onCompositionEnd();\n        host.removeListener(\"mousedown\", onCompositionEnd);\n        if (e.type == \"compositionend\" && c.range) {\n            host.selection.setRange(c.range);\n        }\n        if (useragent.isChrome && useragent.isChrome >= 53) {\n          onInput();\n        }\n    };\n    \n    \n\n    var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n    event.addListener(text, \"compositionstart\", onCompositionStart);\n    if (useragent.isGecko) {\n        event.addListener(text, \"text\", function(){syncComposition.schedule()});\n    } else {\n        event.addListener(text, \"keyup\", function(){syncComposition.schedule()});\n        event.addListener(text, \"keydown\", function(){syncComposition.schedule()});\n    }\n    event.addListener(text, \"compositionend\", onCompositionEnd);\n\n    this.getElement = function() {\n        return text;\n    };\n\n    this.setReadOnly = function(readOnly) {\n       text.readOnly = readOnly;\n    };\n\n    this.onContextMenu = function(e) {\n        afterContextMenu = true;\n        resetSelection(host.selection.isEmpty());\n        host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n        this.moveToMouse(e, true);\n    };\n    \n    this.moveToMouse = function(e, bringToFront) {\n        if (!bringToFront && useragent.isOldIE)\n            return;\n        if (!tempStyle)\n            tempStyle = text.style.cssText;\n        text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n            + \"height:\" + text.style.height + \";\"\n            + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n        var rect = host.container.getBoundingClientRect();\n        var style = dom.computedStyle(host.container);\n        var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n        var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n        var maxTop = rect.bottom - top - text.clientHeight -2;\n        var move = function(e) {\n            text.style.left = e.clientX - left - 2 + \"px\";\n            text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n        }; \n        move(e);\n\n        if (e.type != \"mousedown\")\n            return;\n\n        if (host.renderer.$keepTextAreaAtCursor)\n            host.renderer.$keepTextAreaAtCursor = null;\n\n        clearTimeout(closeTimeout);\n        if (useragent.isWin && !useragent.isOldIE)\n            event.capture(host.container, move, onContextMenuClose);\n    };\n\n    this.onContextMenuClose = onContextMenuClose;\n    var closeTimeout;\n    function onContextMenuClose() {\n        clearTimeout(closeTimeout);\n        closeTimeout = setTimeout(function () {\n            if (tempStyle) {\n                text.style.cssText = tempStyle;\n                tempStyle = '';\n            }\n            if (host.renderer.$keepTextAreaAtCursor == null) {\n                host.renderer.$keepTextAreaAtCursor = true;\n                host.renderer.$moveTextAreaToCursor();\n            }\n        }, useragent.isOldIE ? 200 : 0);\n    }\n\n    var onContextMenu = function(e) {\n        host.textInput.onContextMenu(e);\n        onContextMenuClose();\n    };\n    event.addListener(text, \"mouseup\", onContextMenu);\n    event.addListener(text, \"mousedown\", function(e) {\n        e.preventDefault();\n        onContextMenuClose();\n    });\n    event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n    event.addListener(text, \"contextmenu\", onContextMenu);\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\n\nfunction DefaultHandlers(mouseHandler) {\n    mouseHandler.$clickSelection = null;\n\n    var editor = mouseHandler.editor;\n    editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n    editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n    editor.setDefaultHandler(\"touchmove\", this.onTouchMove.bind(mouseHandler));\n\n    var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n        \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n    exports.forEach(function(x) {\n        mouseHandler[x] = this[x];\n    }, this);\n\n    mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n    mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n    this.onMouseDown = function(ev) {\n        var inSelection = ev.inSelection();\n        var pos = ev.getDocumentPosition();\n        this.mousedownEvent = ev;\n        var editor = this.editor;\n\n        var button = ev.getButton();\n        if (button !== 0) {\n            var selectionRange = editor.getSelectionRange();\n            var selectionEmpty = selectionRange.isEmpty();\n            editor.$blockScrolling++;\n            if (selectionEmpty || button == 1)\n                editor.selection.moveToPosition(pos);\n            editor.$blockScrolling--;\n            if (button == 2)\n                editor.textInput.onContextMenu(ev.domEvent);\n            return; // stopping event here breaks contextmenu on ff mac\n        }\n\n        this.mousedownEvent.time = Date.now();\n        if (inSelection && !editor.isFocused()) {\n            editor.focus();\n            if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n                this.setState(\"focusWait\");\n                this.captureMouse(ev);\n                return;\n            }\n        }\n\n        this.captureMouse(ev);\n        this.startSelect(pos, ev.domEvent._clicks > 1);\n        return ev.preventDefault();\n    };\n\n    this.startSelect = function(pos, waitForClickSelection) {\n        pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var editor = this.editor;\n        editor.$blockScrolling++;\n        if (this.mousedownEvent.getShiftKey())\n            editor.selection.selectToPosition(pos);\n        else if (!waitForClickSelection)\n            editor.selection.moveToPosition(pos);\n        if (!waitForClickSelection)\n            this.select();\n        if (editor.renderer.scroller.setCapture) {\n            editor.renderer.scroller.setCapture();\n        }\n        editor.setStyle(\"ace_selecting\");\n        this.setState(\"select\");\n        editor.$blockScrolling--;\n    };\n\n    this.select = function() {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        editor.$blockScrolling++;\n        if (this.$clickSelection) {\n            var cmp = this.$clickSelection.comparePoint(cursor);\n\n            if (cmp == -1) {\n                anchor = this.$clickSelection.end;\n            } else if (cmp == 1) {\n                anchor = this.$clickSelection.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n        editor.$blockScrolling--;\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.extendSelectionBy = function(unitName) {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var range = editor.selection[unitName](cursor.row, cursor.column);\n        editor.$blockScrolling++;\n        if (this.$clickSelection) {\n            var cmpStart = this.$clickSelection.comparePoint(range.start);\n            var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n            if (cmpStart == -1 && cmpEnd <= 0) {\n                anchor = this.$clickSelection.end;\n                if (range.end.row != cursor.row || range.end.column != cursor.column)\n                    cursor = range.start;\n            } else if (cmpEnd == 1 && cmpStart >= 0) {\n                anchor = this.$clickSelection.start;\n                if (range.start.row != cursor.row || range.start.column != cursor.column)\n                    cursor = range.end;\n            } else if (cmpStart == -1 && cmpEnd == 1) {\n                cursor = range.end;\n                anchor = range.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n        editor.$blockScrolling--;\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.selectEnd =\n    this.selectAllEnd =\n    this.selectByWordsEnd =\n    this.selectByLinesEnd = function() {\n        this.$clickSelection = null;\n        this.editor.unsetStyle(\"ace_selecting\");\n        if (this.editor.renderer.scroller.releaseCapture) {\n            this.editor.renderer.scroller.releaseCapture();\n        }\n    };\n\n    this.focusWait = function() {\n        var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n        var time = Date.now();\n\n        if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n            this.startSelect(this.mousedownEvent.getDocumentPosition());\n    };\n\n    this.onDoubleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n        var session = editor.session;\n\n        var range = session.getBracketRange(pos);\n        if (range) {\n            if (range.isEmpty()) {\n                range.start.column--;\n                range.end.column++;\n            }\n            this.setState(\"select\");\n        } else {\n            range = editor.selection.getWordRange(pos.row, pos.column);\n            this.setState(\"selectByWords\");\n        }\n        this.$clickSelection = range;\n        this.select();\n    };\n\n    this.onTripleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n\n        this.setState(\"selectByLines\");\n        var range = editor.getSelectionRange();\n        if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n            this.$clickSelection = editor.selection.getLineRange(range.start.row);\n            this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n        } else {\n            this.$clickSelection = editor.selection.getLineRange(pos.row);\n        }\n        this.select();\n    };\n\n    this.onQuadClick = function(ev) {\n        var editor = this.editor;\n\n        editor.selectAll();\n        this.$clickSelection = editor.getSelectionRange();\n        this.setState(\"selectAll\");\n    };\n\n    this.onMouseWheel = function(ev) {\n        if (ev.getAccelKey())\n            return;\n        if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n            ev.wheelX = ev.wheelY;\n            ev.wheelY = 0;\n        }\n\n        var t = ev.domEvent.timeStamp;\n        var dt = t - (this.$lastScrollTime||0);\n        \n        var editor = this.editor;\n        var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n        if (isScrolable || dt < 200) {\n            this.$lastScrollTime = t;\n            editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n            return ev.stop();\n        }\n    };\n    \n    this.onTouchMove = function (ev) {\n        var t = ev.domEvent.timeStamp;\n        var dt = t - (this.$lastScrollTime || 0);\n\n        var editor = this.editor;\n        var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n        if (isScrolable || dt < 200) {\n            this.$lastScrollTime = t;\n            editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n            return ev.stop();\n        }\n    };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n    if (range.start.row == range.end.row)\n        var cmp = 2 * cursor.column - range.start.column - range.end.column;\n    else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n        var cmp = cursor.column - 4;\n    else\n        var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n    if (cmp < 0)\n        return {cursor: range.start, anchor: range.end};\n    else\n        return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n    this.isOpen = false;\n    this.$element = null;\n    this.$parentNode = parentNode;\n}\n\n(function() {\n    this.$init = function() {\n        this.$element = dom.createElement(\"div\");\n        this.$element.className = \"ace_tooltip\";\n        this.$element.style.display = \"none\";\n        this.$parentNode.appendChild(this.$element);\n        return this.$element;\n    };\n    this.getElement = function() {\n        return this.$element || this.$init();\n    };\n    this.setText = function(text) {\n        dom.setInnerText(this.getElement(), text);\n    };\n    this.setHtml = function(html) {\n        this.getElement().innerHTML = html;\n    };\n    this.setPosition = function(x, y) {\n        this.getElement().style.left = x + \"px\";\n        this.getElement().style.top = y + \"px\";\n    };\n    this.setClassName = function(className) {\n        dom.addCssClass(this.getElement(), className);\n    };\n    this.show = function(text, x, y) {\n        if (text != null)\n            this.setText(text);\n        if (x != null && y != null)\n            this.setPosition(x, y);\n        if (!this.isOpen) {\n            this.getElement().style.display = \"block\";\n            this.isOpen = true;\n        }\n    };\n\n    this.hide = function() {\n        if (this.isOpen) {\n            this.getElement().style.display = \"none\";\n            this.isOpen = false;\n        }\n    };\n    this.getHeight = function() {\n        return this.getElement().offsetHeight;\n    };\n    this.getWidth = function() {\n        return this.getElement().offsetWidth;\n    };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar event = acequire(\"../lib/event\");\nvar Tooltip = acequire(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var gutter = editor.renderer.$gutterLayer;\n    var tooltip = new GutterTooltip(editor.container);\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n        if (!editor.isFocused() || e.getButton() != 0)\n            return;\n        var gutterRegion = gutter.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\")\n            return;\n\n        var row = e.getDocumentPosition().row;\n        var selection = editor.session.selection;\n\n        if (e.getShiftKey())\n            selection.selectTo(row, 0);\n        else {\n            if (e.domEvent.detail == 2) {\n                editor.selectAll();\n                return e.preventDefault();\n            }\n            mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n        }\n        mouseHandler.setState(\"selectByLines\");\n        mouseHandler.captureMouse(e);\n        return e.preventDefault();\n    });\n\n\n    var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n    function showTooltip() {\n        var row = mouseEvent.getDocumentPosition().row;\n        var annotation = gutter.$annotations[row];\n        if (!annotation)\n            return hideTooltip();\n\n        var maxRow = editor.session.getLength();\n        if (row == maxRow) {\n            var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n            var pos = mouseEvent.$pos;\n            if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n                return hideTooltip();\n        }\n\n        if (tooltipAnnotation == annotation)\n            return;\n        tooltipAnnotation = annotation.text.join(\"<br/>\");\n\n        tooltip.setHtml(tooltipAnnotation);\n        tooltip.show();\n        editor._signal(\"showGutterTooltip\", tooltip);\n        editor.on(\"mousewheel\", hideTooltip);\n\n        if (mouseHandler.$tooltipFollowsMouse) {\n            moveTooltip(mouseEvent);\n        } else {\n            var gutterElement = mouseEvent.domEvent.target;\n            var rect = gutterElement.getBoundingClientRect();\n            var style = tooltip.getElement().style;\n            style.left = rect.right + \"px\";\n            style.top = rect.bottom + \"px\";\n        }\n    }\n\n    function hideTooltip() {\n        if (tooltipTimeout)\n            tooltipTimeout = clearTimeout(tooltipTimeout);\n        if (tooltipAnnotation) {\n            tooltip.hide();\n            tooltipAnnotation = null;\n            editor._signal(\"hideGutterTooltip\", tooltip);\n            editor.removeEventListener(\"mousewheel\", hideTooltip);\n        }\n    }\n\n    function moveTooltip(e) {\n        tooltip.setPosition(e.x, e.y);\n    }\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n        var target = e.domEvent.target || e.domEvent.srcElement;\n        if (dom.hasCssClass(target, \"ace_fold-widget\"))\n            return hideTooltip();\n\n        if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n            moveTooltip(e);\n\n        mouseEvent = e;\n        if (tooltipTimeout)\n            return;\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            if (mouseEvent && !mouseHandler.isMousePressed)\n                showTooltip();\n            else\n                hideTooltip();\n        }, 50);\n    });\n\n    event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n        mouseEvent = null;\n        if (!tooltipAnnotation || tooltipTimeout)\n            return;\n\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            hideTooltip();\n        }, 50);\n    });\n    \n    editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n    Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n    this.setPosition = function(x, y) {\n        var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n        var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n        var width = this.getWidth();\n        var height = this.getHeight();\n        x += 15;\n        y += 15;\n        if (x + width > windowWidth) {\n            x -= (x + width) - windowWidth;\n        }\n        if (y + height > windowHeight) {\n            y -= 20 + height;\n        }\n        Tooltip.prototype.setPosition.call(this, x, y);\n    };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n    this.domEvent = domEvent;\n    this.editor = editor;\n    \n    this.x = this.clientX = domEvent.clientX;\n    this.y = this.clientY = domEvent.clientY;\n\n    this.$pos = null;\n    this.$inSelection = null;\n    \n    this.propagationStopped = false;\n    this.defaultPrevented = false;\n};\n\n(function() {  \n    \n    this.stopPropagation = function() {\n        event.stopPropagation(this.domEvent);\n        this.propagationStopped = true;\n    };\n    \n    this.preventDefault = function() {\n        event.preventDefault(this.domEvent);\n        this.defaultPrevented = true;\n    };\n    \n    this.stop = function() {\n        this.stopPropagation();\n        this.preventDefault();\n    };\n    this.getDocumentPosition = function() {\n        if (this.$pos)\n            return this.$pos;\n        \n        this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n        return this.$pos;\n    };\n    this.inSelection = function() {\n        if (this.$inSelection !== null)\n            return this.$inSelection;\n            \n        var editor = this.editor;\n        \n\n        var selectionRange = editor.getSelectionRange();\n        if (selectionRange.isEmpty())\n            this.$inSelection = false;\n        else {\n            var pos = this.getDocumentPosition();\n            this.$inSelection = selectionRange.contains(pos.row, pos.column);\n        }\n\n        return this.$inSelection;\n    };\n    this.getButton = function() {\n        return event.getButton(this.domEvent);\n    };\n    this.getShiftKey = function() {\n        return this.domEvent.shiftKey;\n    };\n    \n    this.getAccelKey = useragent.isMac\n        ? function() { return this.domEvent.metaKey; }\n        : function() { return this.domEvent.ctrlKey; };\n    \n}).call(MouseEvent.prototype);\n\n});\n\nace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n    var editor = mouseHandler.editor;\n\n    var blankImage = dom.createElement(\"img\");\n    blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n    if (useragent.isOpera)\n        blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n    var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n     exports.forEach(function(x) {\n         mouseHandler[x] = this[x];\n    }, this);\n    editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n    var mouseTarget = editor.container;\n    var dragSelectionMarker, x, y;\n    var timerId, range;\n    var dragCursor, counter = 0;\n    var dragOperation;\n    var isInternal;\n    var autoScrollStartTime;\n    var cursorMovedTime;\n    var cursorPointOnCaretMoved;\n\n    this.onDragStart = function(e) {\n        if (this.cancelDrag || !mouseTarget.draggable) {\n            var self = this;\n            setTimeout(function(){\n                self.startSelect();\n                self.captureMouse(e);\n            }, 0);\n            return e.preventDefault();\n        }\n        range = editor.getSelectionRange();\n\n        var dataTransfer = e.dataTransfer;\n        dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n        if (useragent.isOpera) {\n            editor.container.appendChild(blankImage);\n            blankImage.scrollTop = 0;\n        }\n        dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n        if (useragent.isOpera) {\n            editor.container.removeChild(blankImage);\n        }\n        dataTransfer.clearData();\n        dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n        isInternal = true;\n        this.setState(\"drag\");\n    };\n\n    this.onDragEnd = function(e) {\n        mouseTarget.draggable = false;\n        isInternal = false;\n        this.setState(null);\n        if (!editor.getReadOnly()) {\n            var dropEffect = e.dataTransfer.dropEffect;\n            if (!dragOperation && dropEffect == \"move\")\n                editor.session.remove(editor.getSelectionRange());\n            editor.renderer.$cursorLayer.setBlinking(true);\n        }\n        this.editor.unsetStyle(\"ace_dragging\");\n        this.editor.renderer.setCursorStyle(\"\");\n    };\n\n    this.onDragEnter = function(e) {\n        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n            return;\n        x = e.clientX;\n        y = e.clientY;\n        if (!dragSelectionMarker)\n            addDragMarker();\n        counter++;\n        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n        return event.preventDefault(e);\n    };\n\n    this.onDragOver = function(e) {\n        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n            return;\n        x = e.clientX;\n        y = e.clientY;\n        if (!dragSelectionMarker) {\n            addDragMarker();\n            counter++;\n        }\n        if (onMouseMoveTimer !== null)\n            onMouseMoveTimer = null;\n\n        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n        return event.preventDefault(e);\n    };\n\n    this.onDragLeave = function(e) {\n        counter--;\n        if (counter <= 0 && dragSelectionMarker) {\n            clearDragMarker();\n            dragOperation = null;\n            return event.preventDefault(e);\n        }\n    };\n\n    this.onDrop = function(e) {\n        if (!dragCursor)\n            return;\n        var dataTransfer = e.dataTransfer;\n        if (isInternal) {\n            switch (dragOperation) {\n                case \"move\":\n                    if (range.contains(dragCursor.row, dragCursor.column)) {\n                        range = {\n                            start: dragCursor,\n                            end: dragCursor\n                        };\n                    } else {\n                        range = editor.moveText(range, dragCursor);\n                    }\n                    break;\n                case \"copy\":\n                    range = editor.moveText(range, dragCursor, true);\n                    break;\n            }\n        } else {\n            var dropData = dataTransfer.getData('Text');\n            range = {\n                start: dragCursor,\n                end: editor.session.insert(dragCursor, dropData)\n            };\n            editor.focus();\n            dragOperation = null;\n        }\n        clearDragMarker();\n        return event.preventDefault(e);\n    };\n\n    event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n    event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n    function scrollCursorIntoView(cursor, prevCursor) {\n        var now = Date.now();\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        var hMovement = !prevCursor || cursor.column != prevCursor.column;\n        if (!cursorMovedTime || vMovement || hMovement) {\n            editor.$blockScrolling += 1;\n            editor.moveCursorToPosition(cursor);\n            editor.$blockScrolling -= 1;\n            cursorMovedTime = now;\n            cursorPointOnCaretMoved = {x: x, y: y};\n        } else {\n            var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n            if (distance > SCROLL_CURSOR_HYSTERESIS) {\n                cursorMovedTime = null;\n            } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n                editor.renderer.scrollCursorIntoView();\n                cursorMovedTime = null;\n            }\n        }\n    }\n\n    function autoScroll(cursor, prevCursor) {\n        var now = Date.now();\n        var lineHeight = editor.renderer.layerConfig.lineHeight;\n        var characterWidth = editor.renderer.layerConfig.characterWidth;\n        var editorRect = editor.renderer.scroller.getBoundingClientRect();\n        var offsets = {\n           x: {\n               left: x - editorRect.left,\n               right: editorRect.right - x\n           },\n           y: {\n               top: y - editorRect.top,\n               bottom: editorRect.bottom - y\n           }\n        };\n        var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n        var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n        var scrollCursor = {row: cursor.row, column: cursor.column};\n        if (nearestXOffset / characterWidth <= 2) {\n            scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n        }\n        if (nearestYOffset / lineHeight <= 1) {\n            scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n        }\n        var vScroll = cursor.row != scrollCursor.row;\n        var hScroll = cursor.column != scrollCursor.column;\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        if (vScroll || (hScroll && !vMovement)) {\n            if (!autoScrollStartTime)\n                autoScrollStartTime = now;\n            else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n                editor.renderer.scrollCursorIntoView(scrollCursor);\n        } else {\n            autoScrollStartTime = null;\n        }\n    }\n\n    function onDragInterval() {\n        var prevCursor = dragCursor;\n        dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n        scrollCursorIntoView(dragCursor, prevCursor);\n        autoScroll(dragCursor, prevCursor);\n    }\n\n    function addDragMarker() {\n        range = editor.selection.toOrientedRange();\n        dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n        editor.clearSelection();\n        if (editor.isFocused())\n            editor.renderer.$cursorLayer.setBlinking(false);\n        clearInterval(timerId);\n        onDragInterval();\n        timerId = setInterval(onDragInterval, 20);\n        counter = 0;\n        event.addListener(document, \"mousemove\", onMouseMove);\n    }\n\n    function clearDragMarker() {\n        clearInterval(timerId);\n        editor.session.removeMarker(dragSelectionMarker);\n        dragSelectionMarker = null;\n        editor.$blockScrolling += 1;\n        editor.selection.fromOrientedRange(range);\n        editor.$blockScrolling -= 1;\n        if (editor.isFocused() && !isInternal)\n            editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n        range = null;\n        dragCursor = null;\n        counter = 0;\n        autoScrollStartTime = null;\n        cursorMovedTime = null;\n        event.removeListener(document, \"mousemove\", onMouseMove);\n    }\n    var onMouseMoveTimer = null;\n    function onMouseMove() {\n        if (onMouseMoveTimer == null) {\n            onMouseMoveTimer = setTimeout(function() {\n                if (onMouseMoveTimer != null && dragSelectionMarker)\n                    clearDragMarker();\n            }, 20);\n        }\n    }\n\n    function canAccept(dataTransfer) {\n        var types = dataTransfer.types;\n        return !types || Array.prototype.some.call(types, function(type) {\n            return type == 'text/plain' || type == 'Text';\n        });\n    }\n\n    function getDropEffect(e) {\n        var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n        var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n        var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n        var effectAllowed = \"uninitialized\";\n        try {\n            effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n        } catch (e) {}\n        var dropEffect = \"none\";\n\n        if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"copy\";\n        else if (moveAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"move\";\n        else if (copyAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"copy\";\n\n        return dropEffect;\n    }\n}\n\n(function() {\n\n    this.dragWait = function() {\n        var interval = Date.now() - this.mousedownEvent.time;\n        if (interval > this.editor.getDragDelay())\n            this.startDrag();\n    };\n\n    this.dragWaitEnd = function() {\n        var target = this.editor.container;\n        target.draggable = false;\n        this.startSelect(this.mousedownEvent.getDocumentPosition());\n        this.selectEnd();\n    };\n\n    this.dragReadyEnd = function(e) {\n        this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n        this.editor.unsetStyle(\"ace_dragging\");\n        this.editor.renderer.setCursorStyle(\"\");\n        this.dragWaitEnd();\n    };\n\n    this.startDrag = function(){\n        this.cancelDrag = false;\n        var editor = this.editor;\n        var target = editor.container;\n        target.draggable = true;\n        editor.renderer.$cursorLayer.setBlinking(false);\n        editor.setStyle(\"ace_dragging\");\n        var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n        editor.renderer.setCursorStyle(cursorStyle);\n        this.setState(\"dragReady\");\n    };\n\n    this.onMouseDrag = function(e) {\n        var target = this.editor.container;\n        if (useragent.isIE && this.state == \"dragReady\") {\n            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n            if (distance > 3)\n                target.dragDrop();\n        }\n        if (this.state === \"dragWait\") {\n            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n            if (distance > 0) {\n                target.draggable = false;\n                this.startSelect(this.mousedownEvent.getDocumentPosition());\n            }\n        }\n    };\n\n    this.onMouseDown = function(e) {\n        if (!this.$dragEnabled)\n            return;\n        this.mousedownEvent = e;\n        var editor = this.editor;\n\n        var inSelection = e.inSelection();\n        var button = e.getButton();\n        var clickCount = e.domEvent.detail || 1;\n        if (clickCount === 1 && button === 0 && inSelection) {\n            if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n                return;\n            this.mousedownEvent.time = Date.now();\n            var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n            if (\"unselectable\" in eventTarget)\n                eventTarget.unselectable = \"on\";\n            if (editor.getDragDelay()) {\n                if (useragent.isWebKit) {\n                    this.cancelDrag = true;\n                    var mouseTarget = editor.container;\n                    mouseTarget.draggable = true;\n                }\n                this.setState(\"dragWait\");\n            } else {\n                this.startDrag();\n            }\n            this.captureMouse(e, this.onMouseDrag.bind(this));\n            e.defaultPrevented = true;\n        }\n    };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"./dom\");\n\nexports.get = function (url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.onreadystatechange = function () {\n        if (xhr.readyState === 4) {\n            callback(xhr.responseText);\n        }\n    };\n    xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n    var head = dom.getDocumentHead();\n    var s = document.createElement('script');\n\n    s.src = path;\n    head.appendChild(s);\n\n    s.onload = s.onreadystatechange = function(_, isAbort) {\n        if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n            s = s.onload = s.onreadystatechange = null;\n            if (!isAbort)\n                callback();\n        }\n    };\n};\nexports.qualifyURL = function(url) {\n    var a = document.createElement('a');\n    a.href = url;\n    return a.href;\n}\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/lib/app_config\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"no use strict\";\n\nvar oop = acequire(\"./oop\");\nvar EventEmitter = acequire(\"./event_emitter\").EventEmitter;\n\nvar optionsProvider = {\n    setOptions: function(optList) {\n        Object.keys(optList).forEach(function(key) {\n            this.setOption(key, optList[key]);\n        }, this);\n    },\n    getOptions: function(optionNames) {\n        var result = {};\n        if (!optionNames) {\n            optionNames = Object.keys(this.$options);\n        } else if (!Array.isArray(optionNames)) {\n            result = optionNames;\n            optionNames = Object.keys(result);\n        }\n        optionNames.forEach(function(key) {\n            result[key] = this.getOption(key);\n        }, this);\n        return result;\n    },\n    setOption: function(name, value) {\n        if (this[\"$\" + name] === value)\n            return;\n        var opt = this.$options[name];\n        if (!opt) {\n            return warn('misspelled option \"' + name + '\"');\n        }\n        if (opt.forwardTo)\n            return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value);\n\n        if (!opt.handlesSet)\n            this[\"$\" + name] = value;\n        if (opt && opt.set)\n            opt.set.call(this, value);\n    },\n    getOption: function(name) {\n        var opt = this.$options[name];\n        if (!opt) {\n            return warn('misspelled option \"' + name + '\"');\n        }\n        if (opt.forwardTo)\n            return this[opt.forwardTo] && this[opt.forwardTo].getOption(name);\n        return opt && opt.get ? opt.get.call(this) : this[\"$\" + name];\n    }\n};\n\nfunction warn(message) {\n    if (typeof console != \"undefined\" && console.warn)\n        console.warn.apply(console, arguments);\n}\n\nfunction reportError(msg, data) {\n    var e = new Error(msg);\n    e.data = data;\n    if (typeof console == \"object\" && console.error)\n        console.error(e);\n    setTimeout(function() { throw e; });\n}\n\nvar AppConfig = function() {\n    this.$defaultOptions = {};\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n    this.defineOptions = function(obj, path, options) {\n        if (!obj.$options)\n            this.$defaultOptions[path] = obj.$options = {};\n\n        Object.keys(options).forEach(function(key) {\n            var opt = options[key];\n            if (typeof opt == \"string\")\n                opt = {forwardTo: opt};\n\n            opt.name || (opt.name = key);\n            obj.$options[opt.name] = opt;\n            if (\"initialValue\" in opt)\n                obj[\"$\" + opt.name] = opt.initialValue;\n        });\n        oop.implement(obj, optionsProvider);\n\n        return this;\n    };\n\n    this.resetOptions = function(obj) {\n        Object.keys(obj.$options).forEach(function(key) {\n            var opt = obj.$options[key];\n            if (\"value\" in opt)\n                obj.setOption(key, opt.value);\n        });\n    };\n\n    this.setDefaultValue = function(path, name, value) {\n        var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {});\n        if (opts[name]) {\n            if (opts.forwardTo)\n                this.setDefaultValue(opts.forwardTo, name, value);\n            else\n                opts[name].value = value;\n        }\n    };\n\n    this.setDefaultValues = function(path, optionHash) {\n        Object.keys(optionHash).forEach(function(key) {\n            this.setDefaultValue(path, key, optionHash[key]);\n        }, this);\n    };\n    \n    this.warn = warn;\n    this.reportError = reportError;\n    \n}).call(AppConfig.prototype);\n\nexports.AppConfig = AppConfig;\n\n});\n\nace.define(\"ace/config\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/app_config\"], function(acequire, exports, module) {\n\"no use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar net = acequire(\"./lib/net\");\nvar AppConfig = acequire(\"./lib/app_config\").AppConfig;\n\nmodule.exports = exports = new AppConfig();\n\nvar global = (function() {\n    return this || typeof window != \"undefined\" && window;\n})();\n\nvar options = {\n    packaged: false,\n    workerPath: null,\n    modePath: null,\n    themePath: null,\n    basePath: \"\",\n    suffix: \".js\",\n    $moduleUrls: {}\n};\n\nexports.get = function(key) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    return options[key];\n};\n\nexports.set = function(key, value) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    options[key] = value;\n};\n\nexports.all = function() {\n    return lang.copyObject(options);\n};\nexports.moduleUrl = function(name, component) {\n    if (options.$moduleUrls[name])\n        return options.$moduleUrls[name];\n\n    var parts = name.split(\"/\");\n    component = component || parts[parts.length - 2] || \"\";\n    var sep = component == \"snippets\" ? \"/\" : \"-\";\n    var base = parts[parts.length - 1];\n    if (component == \"worker\" && sep == \"-\") {\n        var re = new RegExp(\"^\" + component + \"[\\\\-_]|[\\\\-_]\" + component + \"$\", \"g\");\n        base = base.replace(re, \"\");\n    }\n\n    if ((!base || base == component) && parts.length > 1)\n        base = parts[parts.length - 2];\n    var path = options[component + \"Path\"];\n    if (path == null) {\n        path = options.basePath;\n    } else if (sep == \"/\") {\n        component = sep = \"\";\n    }\n    if (path && path.slice(-1) != \"/\")\n        path += \"/\";\n    return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n    return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n    var module, moduleType;\n    if (Array.isArray(moduleName)) {\n        moduleType = moduleName[0];\n        moduleName = moduleName[1];\n    }\n\n    try {\n        module = acequire(moduleName);\n    } catch (e) {}\n    if (module && !exports.$loading[moduleName])\n        return onLoad && onLoad(module);\n\n    if (!exports.$loading[moduleName])\n        exports.$loading[moduleName] = [];\n\n    exports.$loading[moduleName].push(onLoad);\n\n    if (exports.$loading[moduleName].length > 1)\n        return;\n\n    var afterLoad = function() {\n        acequire([moduleName], function(module) {\n            exports._emit(\"load.module\", {name: moduleName, module: module});\n            var listeners = exports.$loading[moduleName];\n            exports.$loading[moduleName] = null;\n            listeners.forEach(function(onLoad) {\n                onLoad && onLoad(module);\n            });\n        });\n    };\n\n    if (!exports.get(\"packaged\"))\n        return afterLoad();\n    net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\ninit(true);function init(packaged) {\n\n    if (!global || !global.document)\n        return;\n    \n    options.packaged = packaged || acequire.packaged || module.packaged || (global.define && define.packaged);\n\n    var scriptOptions = {};\n    var scriptUrl = \"\";\n    var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n    var currentDocument = currentScript && currentScript.ownerDocument || document;\n    \n    var scripts = currentDocument.getElementsByTagName(\"script\");\n    for (var i=0; i<scripts.length; i++) {\n        var script = scripts[i];\n\n        var src = script.src || script.getAttribute(\"src\");\n        if (!src)\n            continue;\n\n        var attributes = script.attributes;\n        for (var j=0, l=attributes.length; j < l; j++) {\n            var attr = attributes[j];\n            if (attr.name.indexOf(\"data-ace-\") === 0) {\n                scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, \"\"))] = attr.value;\n            }\n        }\n\n        var m = src.match(/^(.*)\\/ace(\\-\\w+)?\\.js(\\?|$)/);\n        if (m)\n            scriptUrl = m[1];\n    }\n\n    if (scriptUrl) {\n        scriptOptions.base = scriptOptions.base || scriptUrl;\n        scriptOptions.packaged = true;\n    }\n\n    scriptOptions.basePath = scriptOptions.base;\n    scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;\n    scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;\n    scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;\n    delete scriptOptions.base;\n\n    for (var key in scriptOptions)\n        if (typeof scriptOptions[key] !== \"undefined\")\n            exports.set(key, scriptOptions[key]);\n}\n\nexports.init = init;\n\nfunction deHyphenate(str) {\n    return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); });\n}\n\n});\n\nace.define(\"ace/mouse/mouse_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/mouse/default_handlers\",\"ace/mouse/default_gutter_handler\",\"ace/mouse/mouse_event\",\"ace/mouse/dragdrop_handler\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar DefaultHandlers = acequire(\"./default_handlers\").DefaultHandlers;\nvar DefaultGutterHandler = acequire(\"./default_gutter_handler\").GutterHandler;\nvar MouseEvent = acequire(\"./mouse_event\").MouseEvent;\nvar DragdropHandler = acequire(\"./dragdrop_handler\").DragdropHandler;\nvar config = acequire(\"../config\");\n\nvar MouseHandler = function(editor) {\n    var _self = this;\n    this.editor = editor;\n\n    new DefaultHandlers(this);\n    new DefaultGutterHandler(this);\n    new DragdropHandler(this);\n\n    var focusEditor = function(e) {\n        var windowBlurred = !document.hasFocus || !document.hasFocus()\n            || !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement())\n        if (windowBlurred)\n            window.focus();\n        editor.focus();\n    };\n\n    var mouseTarget = editor.renderer.getMouseEventTarget();\n    event.addListener(mouseTarget, \"click\", this.onMouseEvent.bind(this, \"click\"));\n    event.addListener(mouseTarget, \"mousemove\", this.onMouseMove.bind(this, \"mousemove\"));\n    event.addMultiMouseDownListener([\n        mouseTarget,\n        editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner,\n        editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner,\n        editor.textInput && editor.textInput.getElement()\n    ].filter(Boolean), [400, 300, 250], this, \"onMouseEvent\");\n    event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, \"mousewheel\"));\n    event.addTouchMoveListener(editor.container, this.onTouchMove.bind(this, \"touchmove\"));\n\n    var gutterEl = editor.renderer.$gutter;\n    event.addListener(gutterEl, \"mousedown\", this.onMouseEvent.bind(this, \"guttermousedown\"));\n    event.addListener(gutterEl, \"click\", this.onMouseEvent.bind(this, \"gutterclick\"));\n    event.addListener(gutterEl, \"dblclick\", this.onMouseEvent.bind(this, \"gutterdblclick\"));\n    event.addListener(gutterEl, \"mousemove\", this.onMouseEvent.bind(this, \"guttermousemove\"));\n\n    event.addListener(mouseTarget, \"mousedown\", focusEditor);\n    event.addListener(gutterEl, \"mousedown\", focusEditor);\n    if (useragent.isIE && editor.renderer.scrollBarV) {\n        event.addListener(editor.renderer.scrollBarV.element, \"mousedown\", focusEditor);\n        event.addListener(editor.renderer.scrollBarH.element, \"mousedown\", focusEditor);\n    }\n\n    editor.on(\"mousemove\", function(e){\n        if (_self.state || _self.$dragDelay || !_self.$dragEnabled)\n            return;\n\n        var character = editor.renderer.screenToTextCoordinates(e.x, e.y);\n        var range = editor.session.selection.getRange();\n        var renderer = editor.renderer;\n\n        if (!range.isEmpty() && range.insideStart(character.row, character.column)) {\n            renderer.setCursorStyle(\"default\");\n        } else {\n            renderer.setCursorStyle(\"\");\n        }\n    });\n};\n\n(function() {\n    this.onMouseEvent = function(name, e) {\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseMove = function(name, e) {\n        var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n        if (!listeners || !listeners.length)\n            return;\n\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseWheel = function(name, e) {\n        var mouseEvent = new MouseEvent(e, this.editor);\n        mouseEvent.speed = this.$scrollSpeed * 2;\n        mouseEvent.wheelX = e.wheelX;\n        mouseEvent.wheelY = e.wheelY;\n\n        this.editor._emit(name, mouseEvent);\n    };\n    \n    this.onTouchMove = function (name, e) {\n        var mouseEvent = new MouseEvent(e, this.editor);\n        mouseEvent.speed = 1;//this.$scrollSpeed * 2;\n        mouseEvent.wheelX = e.wheelX;\n        mouseEvent.wheelY = e.wheelY;\n        this.editor._emit(name, mouseEvent);\n    };\n\n    this.setState = function(state) {\n        this.state = state;\n    };\n\n    this.captureMouse = function(ev, mouseMoveHandler) {\n        this.x = ev.x;\n        this.y = ev.y;\n\n        this.isMousePressed = true;\n        var renderer = this.editor.renderer;\n        if (renderer.$keepTextAreaAtCursor)\n            renderer.$keepTextAreaAtCursor = null;\n\n        var self = this;\n        var onMouseMove = function(e) {\n            if (!e) return;\n            if (useragent.isWebKit && !e.which && self.releaseMouse)\n                return self.releaseMouse();\n\n            self.x = e.clientX;\n            self.y = e.clientY;\n            mouseMoveHandler && mouseMoveHandler(e);\n            self.mouseEvent = new MouseEvent(e, self.editor);\n            self.$mouseMoved = true;\n        };\n\n        var onCaptureEnd = function(e) {\n            clearInterval(timerId);\n            onCaptureInterval();\n            self[self.state + \"End\"] && self[self.state + \"End\"](e);\n            self.state = \"\";\n            if (renderer.$keepTextAreaAtCursor == null) {\n                renderer.$keepTextAreaAtCursor = true;\n                renderer.$moveTextAreaToCursor();\n            }\n            self.isMousePressed = false;\n            self.$onCaptureMouseMove = self.releaseMouse = null;\n            e && self.onMouseEvent(\"mouseup\", e);\n        };\n\n        var onCaptureInterval = function() {\n            self[self.state] && self[self.state]();\n            self.$mouseMoved = false;\n        };\n\n        if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n            return setTimeout(function() {onCaptureEnd(ev);});\n        }\n\n        self.$onCaptureMouseMove = onMouseMove;\n        self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n        var timerId = setInterval(onCaptureInterval, 20);\n    };\n    this.releaseMouse = null;\n    this.cancelContextMenu = function() {\n        var stop = function(e) {\n            if (e && e.domEvent && e.domEvent.type != \"contextmenu\")\n                return;\n            this.editor.off(\"nativecontextmenu\", stop);\n            if (e && e.domEvent)\n                event.stopEvent(e.domEvent);\n        }.bind(this);\n        setTimeout(stop, 10);\n        this.editor.on(\"nativecontextmenu\", stop);\n    };\n}).call(MouseHandler.prototype);\n\nconfig.defineOptions(MouseHandler.prototype, \"mouseHandler\", {\n    scrollSpeed: {initialValue: 2},\n    dragDelay: {initialValue: (useragent.isMac ? 150 : 0)},\n    dragEnabled: {initialValue: true},\n    focusTimout: {initialValue: 0},\n    tooltipFollowsMouse: {initialValue: true}\n});\n\n\nexports.MouseHandler = MouseHandler;\n});\n\nace.define(\"ace/mouse/fold_handler\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nfunction FoldHandler(editor) {\n\n    editor.on(\"click\", function(e) {\n        var position = e.getDocumentPosition();\n        var session = editor.session;\n        var fold = session.getFoldAt(position.row, position.column, 1);\n        if (fold) {\n            if (e.getAccelKey())\n                session.removeFold(fold);\n            else\n                session.expandFold(fold);\n\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            if (session.foldWidgets && session.foldWidgets[row])\n                editor.session.onFoldWidgetClick(row, e);\n            if (!editor.isFocused())\n                editor.focus();\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterdblclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            var data = session.getParentFoldRangeData(row, true);\n            var range = data.range || data.firstRange;\n\n            if (range) {\n                row = range.start.row;\n                var fold = session.getFoldAt(row, session.getLine(row).length, 1);\n\n                if (fold) {\n                    session.removeFold(fold);\n                } else {\n                    session.addFold(\"...\", range);\n                    editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});\n                }\n            }\n            e.stop();\n        }\n    });\n}\n\nexports.FoldHandler = FoldHandler;\n\n});\n\nace.define(\"ace/keyboard/keybinding\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/event\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keyUtil  = acequire(\"../lib/keys\");\nvar event = acequire(\"../lib/event\");\n\nvar KeyBinding = function(editor) {\n    this.$editor = editor;\n    this.$data = {editor: editor};\n    this.$handlers = [];\n    this.setDefaultHandler(editor.commands);\n};\n\n(function() {\n    this.setDefaultHandler = function(kb) {\n        this.removeKeyboardHandler(this.$defaultHandler);\n        this.$defaultHandler = kb;\n        this.addKeyboardHandler(kb, 0);\n    };\n\n    this.setKeyboardHandler = function(kb) {\n        var h = this.$handlers;\n        if (h[h.length - 1] == kb)\n            return;\n\n        while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)\n            this.removeKeyboardHandler(h[h.length - 1]);\n\n        this.addKeyboardHandler(kb, 1);\n    };\n\n    this.addKeyboardHandler = function(kb, pos) {\n        if (!kb)\n            return;\n        if (typeof kb == \"function\" && !kb.handleKeyboard)\n            kb.handleKeyboard = kb;\n        var i = this.$handlers.indexOf(kb);\n        if (i != -1)\n            this.$handlers.splice(i, 1);\n\n        if (pos == undefined)\n            this.$handlers.push(kb);\n        else\n            this.$handlers.splice(pos, 0, kb);\n\n        if (i == -1 && kb.attach)\n            kb.attach(this.$editor);\n    };\n\n    this.removeKeyboardHandler = function(kb) {\n        var i = this.$handlers.indexOf(kb);\n        if (i == -1)\n            return false;\n        this.$handlers.splice(i, 1);\n        kb.detach && kb.detach(this.$editor);\n        return true;\n    };\n\n    this.getKeyboardHandler = function() {\n        return this.$handlers[this.$handlers.length - 1];\n    };\n    \n    this.getStatusText = function() {\n        var data = this.$data;\n        var editor = data.editor;\n        return this.$handlers.map(function(h) {\n            return h.getStatusText && h.getStatusText(editor, data) || \"\";\n        }).filter(Boolean).join(\" \");\n    };\n\n    this.$callKeyboardHandlers = function(hashId, keyString, keyCode, e) {\n        var toExecute;\n        var success = false;\n        var commands = this.$editor.commands;\n\n        for (var i = this.$handlers.length; i--;) {\n            toExecute = this.$handlers[i].handleKeyboard(\n                this.$data, hashId, keyString, keyCode, e\n            );\n            if (!toExecute || !toExecute.command)\n                continue;\n            if (toExecute.command == \"null\") {\n                success = true;\n            } else {\n                success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);\n            }\n            if (success && e && hashId != -1 && \n                toExecute.passEvent != true && toExecute.command.passEvent != true\n            ) {\n                event.stopEvent(e);\n            }\n            if (success)\n                break;\n        }\n        \n        if (!success && hashId == -1) {\n            toExecute = {command: \"insertstring\"};\n            success = commands.exec(\"insertstring\", this.$editor, keyString);\n        }\n        \n        if (success && this.$editor._signal)\n            this.$editor._signal(\"keyboardActivity\", toExecute);\n        \n        return success;\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        var keyString = keyUtil.keyCodeToString(keyCode);\n        this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n    };\n\n    this.onTextInput = function(text) {\n        this.$callKeyboardHandlers(-1, text);\n    };\n\n}).call(KeyBinding.prototype);\n\nexports.KeyBinding = KeyBinding;\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            }\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Selection = function(session) {\n    this.session = session;\n    this.doc = session.getDocument();\n\n    this.clearSelection();\n    this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n    this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n    var self = this;\n    this.lead.on(\"change\", function(e) {\n        self._emit(\"changeCursor\");\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n        if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n            self.$desiredColumn = null;\n    });\n\n    this.selectionAnchor.on(\"change\", function() {\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n    });\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.isEmpty = function() {\n        return (this.$isEmpty || (\n            this.anchor.row == this.lead.row &&\n            this.anchor.column == this.lead.column\n        ));\n    };\n    this.isMultiLine = function() {\n        if (this.isEmpty()) {\n            return false;\n        }\n\n        return this.getRange().isMultiLine();\n    };\n    this.getCursor = function() {\n        return this.lead.getPosition();\n    };\n    this.setSelectionAnchor = function(row, column) {\n        this.anchor.setPosition(row, column);\n\n        if (this.$isEmpty) {\n            this.$isEmpty = false;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.getSelectionAnchor = function() {\n        if (this.$isEmpty)\n            return this.getSelectionLead();\n        else\n            return this.anchor.getPosition();\n    };\n    this.getSelectionLead = function() {\n        return this.lead.getPosition();\n    };\n    this.shiftSelection = function(columns) {\n        if (this.$isEmpty) {\n            this.moveCursorTo(this.lead.row, this.lead.column + columns);\n            return;\n        }\n\n        var anchor = this.getSelectionAnchor();\n        var lead = this.getSelectionLead();\n\n        var isBackwards = this.isBackwards();\n\n        if (!isBackwards || anchor.column !== 0)\n            this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n        if (isBackwards || lead.column !== 0) {\n            this.$moveSelection(function() {\n                this.moveCursorTo(lead.row, lead.column + columns);\n            });\n        }\n    };\n    this.isBackwards = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n        return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n    };\n    this.getRange = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n\n        if (this.isEmpty())\n            return Range.fromPoints(lead, lead);\n\n        if (this.isBackwards()) {\n            return Range.fromPoints(lead, anchor);\n        }\n        else {\n            return Range.fromPoints(anchor, lead);\n        }\n    };\n    this.clearSelection = function() {\n        if (!this.$isEmpty) {\n            this.$isEmpty = true;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.selectAll = function() {\n        var lastRow = this.doc.getLength() - 1;\n        this.setSelectionAnchor(0, 0);\n        this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n    };\n    this.setRange =\n    this.setSelectionRange = function(range, reverse) {\n        if (reverse) {\n            this.setSelectionAnchor(range.end.row, range.end.column);\n            this.selectTo(range.start.row, range.start.column);\n        } else {\n            this.setSelectionAnchor(range.start.row, range.start.column);\n            this.selectTo(range.end.row, range.end.column);\n        }\n        if (this.getRange().isEmpty())\n            this.$isEmpty = true;\n        this.$desiredColumn = null;\n    };\n\n    this.$moveSelection = function(mover) {\n        var lead = this.lead;\n        if (this.$isEmpty)\n            this.setSelectionAnchor(lead.row, lead.column);\n\n        mover.call(this);\n    };\n    this.selectTo = function(row, column) {\n        this.$moveSelection(function() {\n            this.moveCursorTo(row, column);\n        });\n    };\n    this.selectToPosition = function(pos) {\n        this.$moveSelection(function() {\n            this.moveCursorToPosition(pos);\n        });\n    };\n    this.moveTo = function(row, column) {\n        this.clearSelection();\n        this.moveCursorTo(row, column);\n    };\n    this.moveToPosition = function(pos) {\n        this.clearSelection();\n        this.moveCursorToPosition(pos);\n    };\n    this.selectUp = function() {\n        this.$moveSelection(this.moveCursorUp);\n    };\n    this.selectDown = function() {\n        this.$moveSelection(this.moveCursorDown);\n    };\n    this.selectRight = function() {\n        this.$moveSelection(this.moveCursorRight);\n    };\n    this.selectLeft = function() {\n        this.$moveSelection(this.moveCursorLeft);\n    };\n    this.selectLineStart = function() {\n        this.$moveSelection(this.moveCursorLineStart);\n    };\n    this.selectLineEnd = function() {\n        this.$moveSelection(this.moveCursorLineEnd);\n    };\n    this.selectFileEnd = function() {\n        this.$moveSelection(this.moveCursorFileEnd);\n    };\n    this.selectFileStart = function() {\n        this.$moveSelection(this.moveCursorFileStart);\n    };\n    this.selectWordRight = function() {\n        this.$moveSelection(this.moveCursorWordRight);\n    };\n    this.selectWordLeft = function() {\n        this.$moveSelection(this.moveCursorWordLeft);\n    };\n    this.getWordRange = function(row, column) {\n        if (typeof column == \"undefined\") {\n            var cursor = row || this.lead;\n            row = cursor.row;\n            column = cursor.column;\n        }\n        return this.session.getWordRange(row, column);\n    };\n    this.selectWord = function() {\n        this.setSelectionRange(this.getWordRange());\n    };\n    this.selectAWord = function() {\n        var cursor = this.getCursor();\n        var range = this.session.getAWordRange(cursor.row, cursor.column);\n        this.setSelectionRange(range);\n    };\n\n    this.getLineRange = function(row, excludeLastChar) {\n        var rowStart = typeof row == \"number\" ? row : this.lead.row;\n        var rowEnd;\n\n        var foldLine = this.session.getFoldLine(rowStart);\n        if (foldLine) {\n            rowStart = foldLine.start.row;\n            rowEnd = foldLine.end.row;\n        } else {\n            rowEnd = rowStart;\n        }\n        if (excludeLastChar === true)\n            return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n        else\n            return new Range(rowStart, 0, rowEnd + 1, 0);\n    };\n    this.selectLine = function() {\n        this.setSelectionRange(this.getLineRange());\n    };\n    this.moveCursorUp = function() {\n        this.moveCursorBy(-1, 0);\n    };\n    this.moveCursorDown = function() {\n        this.moveCursorBy(1, 0);\n    };\n    this.moveCursorLeft = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n        } else if (cursor.column === 0) {\n            if (cursor.row > 0) {\n                this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, -tabSize);\n            else\n                this.moveCursorBy(0, -1);\n        }\n    };\n    this.moveCursorRight = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n        }\n        else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n            if (this.lead.row < this.doc.getLength() - 1) {\n                this.moveCursorTo(this.lead.row + 1, 0);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            var cursor = this.lead;\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, tabSize);\n            else\n                this.moveCursorBy(0, 1);\n        }\n    };\n    this.moveCursorLineStart = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var screenRow = this.session.documentToScreenRow(row, column);\n        var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n        var beforeCursor = this.session.getDisplayLine(\n            row, null, firstColumnPosition.row,\n            firstColumnPosition.column\n        );\n\n        var leadingSpace = beforeCursor.match(/^\\s*/);\n        if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n            firstColumnPosition.column += leadingSpace[0].length;\n        this.moveCursorToPosition(firstColumnPosition);\n    };\n    this.moveCursorLineEnd = function() {\n        var lead = this.lead;\n        var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n        if (this.lead.column == lineEnd.column) {\n            var line = this.session.getLine(lineEnd.row);\n            if (lineEnd.column == line.length) {\n                var textEnd = line.search(/\\s+$/);\n                if (textEnd > 0)\n                    lineEnd.column = textEnd;\n            }\n        }\n\n        this.moveCursorTo(lineEnd.row, lineEnd.column);\n    };\n    this.moveCursorFileEnd = function() {\n        var row = this.doc.getLength() - 1;\n        var column = this.doc.getLine(row).length;\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorFileStart = function() {\n        this.moveCursorTo(0, 0);\n    };\n    this.moveCursorLongWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n            return;\n        }\n        if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n            column += this.session.nonTokenRe.lastIndex;\n            this.session.nonTokenRe.lastIndex = 0;\n            rightOfCursor = line.substring(column);\n        }\n        if (column >= line.length) {\n            this.moveCursorTo(row, line.length);\n            this.moveCursorRight();\n            if (row < this.doc.getLength() - 1)\n                this.moveCursorWordRight();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            column += this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorLongWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n            return;\n        }\n\n        var str = this.session.getFoldStringAt(row, column, -1);\n        if (str == null) {\n            str = this.doc.getLine(row).substring(0, column);\n        }\n\n        var leftOfCursor = lang.stringReverse(str);\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n            column -= this.session.nonTokenRe.lastIndex;\n            leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n            this.session.nonTokenRe.lastIndex = 0;\n        }\n        if (column <= 0) {\n            this.moveCursorTo(row, 0);\n            this.moveCursorLeft();\n            if (row > 0)\n                this.moveCursorWordLeft();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(leftOfCursor)) {\n            column -= this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n\n    this.$shortWordEndIndex = function(rightOfCursor) {\n        var match, index = 0, ch;\n        var whitespaceRe = /\\s/;\n        var tokenRe = this.session.tokenRe;\n\n        tokenRe.lastIndex = 0;\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            index = this.session.tokenRe.lastIndex;\n        } else {\n            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                index ++;\n\n            if (index < 1) {\n                tokenRe.lastIndex = 0;\n                 while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n                    tokenRe.lastIndex = 0;\n                    index ++;\n                    if (whitespaceRe.test(ch)) {\n                        if (index > 2) {\n                            index--;\n                            break;\n                        } else {\n                            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                                index ++;\n                            if (index > 2)\n                                break;\n                        }\n                    }\n                }\n            }\n        }\n        tokenRe.lastIndex = 0;\n\n        return index;\n    };\n\n    this.moveCursorShortWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold)\n            return this.moveCursorTo(fold.end.row, fold.end.column);\n\n        if (column == line.length) {\n            var l = this.doc.getLength();\n            do {\n                row++;\n                rightOfCursor = this.doc.getLine(row);\n            } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n            if (!/^\\s+/.test(rightOfCursor))\n                rightOfCursor = \"\";\n            column = 0;\n        }\n\n        var index = this.$shortWordEndIndex(rightOfCursor);\n\n        this.moveCursorTo(row, column + index);\n    };\n\n    this.moveCursorShortWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1))\n            return this.moveCursorTo(fold.start.row, fold.start.column);\n\n        var line = this.session.getLine(row).substring(0, column);\n        if (column === 0) {\n            do {\n                row--;\n                line = this.doc.getLine(row);\n            } while (row > 0 && /^\\s*$/.test(line));\n\n            column = line.length;\n            if (!/\\s+$/.test(line))\n                line = \"\";\n        }\n\n        var leftOfCursor = lang.stringReverse(line);\n        var index = this.$shortWordEndIndex(leftOfCursor);\n\n        return this.moveCursorTo(row, column - index);\n    };\n\n    this.moveCursorWordRight = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordRight();\n        else\n            this.moveCursorShortWordRight();\n    };\n\n    this.moveCursorWordLeft = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordLeft();\n        else\n            this.moveCursorShortWordLeft();\n    };\n    this.moveCursorBy = function(rows, chars) {\n        var screenPos = this.session.documentToScreenPosition(\n            this.lead.row,\n            this.lead.column\n        );\n\n        if (chars === 0) {\n            if (this.$desiredColumn)\n                screenPos.column = this.$desiredColumn;\n            else\n                this.$desiredColumn = screenPos.column;\n        }\n\n        var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);\n        \n        if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n            if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\n                if (docPos.row > 0 || rows > 0)\n                    docPos.row++;\n            }\n        }\n        this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n    };\n    this.moveCursorToPosition = function(position) {\n        this.moveCursorTo(position.row, position.column);\n    };\n    this.moveCursorTo = function(row, column, keepDesiredColumn) {\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            row = fold.start.row;\n            column = fold.start.column;\n        }\n\n        this.$keepDesiredColumnOnChange = true;\n        this.lead.setPosition(row, column);\n        this.$keepDesiredColumnOnChange = false;\n\n        if (!keepDesiredColumn)\n            this.$desiredColumn = null;\n    };\n    this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n        var pos = this.session.screenToDocumentPosition(row, column);\n        this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n    };\n    this.detach = function() {\n        this.lead.detach();\n        this.anchor.detach();\n        this.session = this.doc = null;\n    };\n\n    this.fromOrientedRange = function(range) {\n        this.setSelectionRange(range, range.cursor == range.start);\n        this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n    };\n\n    this.toOrientedRange = function(range) {\n        var r = this.getRange();\n        if (range) {\n            range.start.column = r.start.column;\n            range.start.row = r.start.row;\n            range.end.column = r.end.column;\n            range.end.row = r.end.row;\n        } else {\n            range = r;\n        }\n\n        range.cursor = this.isBackwards() ? range.start : range.end;\n        range.desiredColumn = this.$desiredColumn;\n        return range;\n    };\n    this.getRangeOfMovements = function(func) {\n        var start = this.getCursor();\n        try {\n            func(this);\n            var end = this.getCursor();\n            return Range.fromPoints(start,end);\n        } catch(e) {\n            return Range.fromPoints(start,start);\n        } finally {\n            this.moveCursorToPosition(start);\n        }\n    };\n\n    this.toJSON = function() {\n        if (this.rangeCount) {\n            var data = this.ranges.map(function(r) {\n                var r1 = r.clone();\n                r1.isBackwards = r.cursor == r.start;\n                return r1;\n            });\n        } else {\n            var data = this.getRange();\n            data.isBackwards = this.isBackwards();\n        }\n        return data;\n    };\n\n    this.fromJSON = function(data) {\n        if (data.start == undefined) {\n            if (this.rangeList) {\n                this.toSingleRange(data[0]);\n                for (var i = data.length; i--; ) {\n                    var r = Range.fromPoints(data[i].start, data[i].end);\n                    if (data[i].isBackwards)\n                        r.cursor = r.start;\n                    this.addRange(r, true);\n                }\n                return;\n            } else\n                data = data[0];\n        }\n        if (this.rangeList)\n            this.toSingleRange(data);\n        this.setSelectionRange(data, data.isBackwards);\n    };\n\n    this.isEqual = function(data) {\n        if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n            return false;\n        if (!data.length || !this.ranges)\n            return this.getRange().isEqual(data);\n\n        for (var i = this.ranges.length; i--; ) {\n            if (!this.ranges[i].isEqual(data[i]))\n                return false;\n        }\n        return true;\n    };\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar config = acequire(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\nvar Tokenizer = function(rules) {\n    this.states = rules;\n\n    this.regExps = {};\n    this.matchMappings = {};\n    for (var key in this.states) {\n        var state = this.states[key];\n        var ruleRegExps = [];\n        var matchTotal = 0;\n        var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n        var flag = \"g\";\n\n        var splitterRurles = [];\n        for (var i = 0; i < state.length; i++) {\n            var rule = state[i];\n            if (rule.defaultToken)\n                mapping.defaultToken = rule.defaultToken;\n            if (rule.caseInsensitive)\n                flag = \"gi\";\n            if (rule.regex == null)\n                continue;\n\n            if (rule.regex instanceof RegExp)\n                rule.regex = rule.regex.toString().slice(1, -1);\n            var adjustedregex = rule.regex;\n            var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n            if (Array.isArray(rule.token)) {\n                if (rule.token.length == 1 || matchcount == 1) {\n                    rule.token = rule.token[0];\n                } else if (matchcount - 1 != rule.token.length) {\n                    this.reportError(\"number of classes and regexp groups doesn't match\", { \n                        rule: rule,\n                        groupCount: matchcount - 1\n                    });\n                    rule.token = rule.token[0];\n                } else {\n                    rule.tokenArray = rule.token;\n                    rule.token = null;\n                    rule.onMatch = this.$arrayTokens;\n                }\n            } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n                if (matchcount > 1)\n                    rule.onMatch = this.$applyToken;\n                else\n                    rule.onMatch = rule.token;\n            }\n\n            if (matchcount > 1) {\n                if (/\\\\\\d/.test(rule.regex)) {\n                    adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n                        return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n                    });\n                } else {\n                    matchcount = 1;\n                    adjustedregex = this.removeCapturingGroups(rule.regex);\n                }\n                if (!rule.splitRegex && typeof rule.token != \"string\")\n                    splitterRurles.push(rule); // flag will be known only at the very end\n            }\n\n            mapping[matchTotal] = i;\n            matchTotal += matchcount;\n\n            ruleRegExps.push(adjustedregex);\n            if (!rule.onMatch)\n                rule.onMatch = null;\n        }\n        \n        if (!ruleRegExps.length) {\n            mapping[0] = 0;\n            ruleRegExps.push(\"$\");\n        }\n        \n        splitterRurles.forEach(function(rule) {\n            rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n        }, this);\n\n        this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n    }\n};\n\n(function() {\n    this.$setMaxTokenCount = function(m) {\n        MAX_TOKEN_COUNT = m | 0;\n    };\n    \n    this.$applyToken = function(str) {\n        var values = this.splitRegex.exec(str).slice(1);\n        var types = this.token.apply(this, values);\n        if (typeof types === \"string\")\n            return [{type: types, value: str}];\n\n        var tokens = [];\n        for (var i = 0, l = types.length; i < l; i++) {\n            if (values[i])\n                tokens[tokens.length] = {\n                    type: types[i],\n                    value: values[i]\n                };\n        }\n        return tokens;\n    };\n\n    this.$arrayTokens = function(str) {\n        if (!str)\n            return [];\n        var values = this.splitRegex.exec(str);\n        if (!values)\n            return \"text\";\n        var tokens = [];\n        var types = this.tokenArray;\n        for (var i = 0, l = types.length; i < l; i++) {\n            if (values[i + 1])\n                tokens[tokens.length] = {\n                    type: types[i],\n                    value: values[i + 1]\n                };\n        }\n        return tokens;\n    };\n\n    this.removeCapturingGroups = function(src) {\n        var r = src.replace(\n            /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n            function(x, y) {return y ? \"(?:\" : x;}\n        );\n        return r;\n    };\n\n    this.createSplitterRegexp = function(src, flag) {\n        if (src.indexOf(\"(?=\") != -1) {\n            var stack = 0;\n            var inChClass = false;\n            var lastCapture = {};\n            src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n                m, esc, parenOpen, parenClose, square, index\n            ) {\n                if (inChClass) {\n                    inChClass = square != \"]\";\n                } else if (square) {\n                    inChClass = true;\n                } else if (parenClose) {\n                    if (stack == lastCapture.stack) {\n                        lastCapture.end = index+1;\n                        lastCapture.stack = -1;\n                    }\n                    stack--;\n                } else if (parenOpen) {\n                    stack++;\n                    if (parenOpen.length != 1) {\n                        lastCapture.stack = stack\n                        lastCapture.start = index;\n                    }\n                }\n                return m;\n            });\n\n            if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n                src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n        }\n        if (src.charAt(0) != \"^\") src = \"^\" + src;\n        if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n        \n        return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n    };\n    this.getLineTokens = function(line, startState) {\n        if (startState && typeof startState != \"string\") {\n            var stack = startState.slice(0);\n            startState = stack[0];\n            if (startState === \"#tmp\") {\n                stack.shift()\n                startState = stack.shift()\n            }\n        } else\n            var stack = [];\n\n        var currentState = startState || \"start\";\n        var state = this.states[currentState];\n        if (!state) {\n            currentState = \"start\";\n            state = this.states[currentState];\n        }\n        var mapping = this.matchMappings[currentState];\n        var re = this.regExps[currentState];\n        re.lastIndex = 0;\n\n        var match, tokens = [];\n        var lastIndex = 0;\n        var matchAttempts = 0;\n\n        var token = {type: null, value: \"\"};\n\n        while (match = re.exec(line)) {\n            var type = mapping.defaultToken;\n            var rule = null;\n            var value = match[0];\n            var index = re.lastIndex;\n\n            if (index - value.length > lastIndex) {\n                var skipped = line.substring(lastIndex, index - value.length);\n                if (token.type == type) {\n                    token.value += skipped;\n                } else {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {type: type, value: skipped};\n                }\n            }\n\n            for (var i = 0; i < match.length-2; i++) {\n                if (match[i + 1] === undefined)\n                    continue;\n\n                rule = state[mapping[i]];\n\n                if (rule.onMatch)\n                    type = rule.onMatch(value, currentState, stack);\n                else\n                    type = rule.token;\n\n                if (rule.next) {\n                    if (typeof rule.next == \"string\") {\n                        currentState = rule.next;\n                    } else {\n                        currentState = rule.next(currentState, stack);\n                    }\n                    \n                    state = this.states[currentState];\n                    if (!state) {\n                        this.reportError(\"state doesn't exist\", currentState);\n                        currentState = \"start\";\n                        state = this.states[currentState];\n                    }\n                    mapping = this.matchMappings[currentState];\n                    lastIndex = index;\n                    re = this.regExps[currentState];\n                    re.lastIndex = index;\n                }\n                break;\n            }\n\n            if (value) {\n                if (typeof type === \"string\") {\n                    if ((!rule || rule.merge !== false) && token.type === type) {\n                        token.value += value;\n                    } else {\n                        if (token.type)\n                            tokens.push(token);\n                        token = {type: type, value: value};\n                    }\n                } else if (type) {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {type: null, value: \"\"};\n                    for (var i = 0; i < type.length; i++)\n                        tokens.push(type[i]);\n                }\n            }\n\n            if (lastIndex == line.length)\n                break;\n\n            lastIndex = index;\n\n            if (matchAttempts++ > MAX_TOKEN_COUNT) {\n                if (matchAttempts > 2 * line.length) {\n                    this.reportError(\"infinite loop with in ace tokenizer\", {\n                        startState: startState,\n                        line: line\n                    });\n                }\n                while (lastIndex < line.length) {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {\n                        value: line.substring(lastIndex, lastIndex += 2000),\n                        type: \"overflow\"\n                    };\n                }\n                currentState = \"start\";\n                stack = [];\n                break;\n            }\n        }\n\n        if (token.type)\n            tokens.push(token);\n        \n        if (stack.length > 1) {\n            if (stack[0] !== currentState)\n                stack.unshift(\"#tmp\", currentState);\n        }\n        return {\n            tokens : tokens,\n            state : stack.length ? stack : currentState\n        };\n    };\n    \n    this.reportError = config.reportError;\n    \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"empty_line\",\n            regex : '^$'\n        }, {\n            defaultToken : \"text\"\n        }]\n    };\n};\n\n(function() {\n\n    this.addRules = function(rules, prefix) {\n        if (!prefix) {\n            for (var key in rules)\n                this.$rules[key] = rules[key];\n            return;\n        }\n        for (var key in rules) {\n            var state = rules[key];\n            for (var i = 0; i < state.length; i++) {\n                var rule = state[i];\n                if (rule.next || rule.onMatch) {\n                    if (typeof rule.next == \"string\") {\n                        if (rule.next.indexOf(prefix) !== 0)\n                            rule.next = prefix + rule.next;\n                    }\n                    if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n                        rule.nextState = prefix + rule.nextState;\n                }\n            }\n            this.$rules[prefix + key] = state;\n        }\n    };\n\n    this.getRules = function() {\n        return this.$rules;\n    };\n\n    this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n        var embedRules = typeof HighlightRules == \"function\"\n            ? new HighlightRules().getRules()\n            : HighlightRules;\n        if (states) {\n            for (var i = 0; i < states.length; i++)\n                states[i] = prefix + states[i];\n        } else {\n            states = [];\n            for (var key in embedRules)\n                states.push(prefix + key);\n        }\n\n        this.addRules(embedRules, prefix);\n\n        if (escapeRules) {\n            var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n            for (var i = 0; i < states.length; i++)\n                addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n        }\n\n        if (!this.$embeds)\n            this.$embeds = [];\n        this.$embeds.push(prefix);\n    };\n\n    this.getEmbeds = function() {\n        return this.$embeds;\n    };\n\n    var pushState = function(currentState, stack) {\n        if (currentState != \"start\" || stack.length)\n            stack.unshift(this.nextState, currentState);\n        return this.nextState;\n    };\n    var popState = function(currentState, stack) {\n        stack.shift();\n        return stack.shift() || \"start\";\n    };\n\n    this.normalizeRules = function() {\n        var id = 0;\n        var rules = this.$rules;\n        function processState(key) {\n            var state = rules[key];\n            state.processed = true;\n            for (var i = 0; i < state.length; i++) {\n                var rule = state[i];\n                var toInsert = null;\n                if (Array.isArray(rule)) {\n                    toInsert = rule;\n                    rule = {};\n                }\n                if (!rule.regex && rule.start) {\n                    rule.regex = rule.start;\n                    if (!rule.next)\n                        rule.next = [];\n                    rule.next.push({\n                        defaultToken: rule.token\n                    }, {\n                        token: rule.token + \".end\",\n                        regex: rule.end || rule.start,\n                        next: \"pop\"\n                    });\n                    rule.token = rule.token + \".start\";\n                    rule.push = true;\n                }\n                var next = rule.next || rule.push;\n                if (next && Array.isArray(next)) {\n                    var stateName = rule.stateName;\n                    if (!stateName)  {\n                        stateName = rule.token;\n                        if (typeof stateName != \"string\")\n                            stateName = stateName[0] || \"\";\n                        if (rules[stateName])\n                            stateName += id++;\n                    }\n                    rules[stateName] = next;\n                    rule.next = stateName;\n                    processState(stateName);\n                } else if (next == \"pop\") {\n                    rule.next = popState;\n                }\n\n                if (rule.push) {\n                    rule.nextState = rule.next || rule.push;\n                    rule.next = pushState;\n                    delete rule.push;\n                }\n\n                if (rule.rules) {\n                    for (var r in rule.rules) {\n                        if (rules[r]) {\n                            if (rules[r].push)\n                                rules[r].push.apply(rules[r], rule.rules[r]);\n                        } else {\n                            rules[r] = rule.rules[r];\n                        }\n                    }\n                }\n                var includeName = typeof rule == \"string\"\n                    ? rule\n                    : typeof rule.include == \"string\"\n                    ? rule.include\n                    : \"\";\n                if (includeName) {\n                    toInsert = rules[includeName];\n                }\n\n                if (toInsert) {\n                    var args = [i, 1].concat(toInsert);\n                    if (rule.noEscape)\n                        args = args.filter(function(x) {return !x.next;});\n                    state.splice.apply(state, args);\n                    i--;\n                }\n                \n                if (rule.keywordMap) {\n                    rule.token = this.createKeywordMapper(\n                        rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n                    );\n                    delete rule.defaultToken;\n                }\n            }\n        }\n        Object.keys(rules).forEach(processState, this);\n    };\n\n    this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n        var keywords = Object.create(null);\n        Object.keys(map).forEach(function(className) {\n            var a = map[className];\n            if (ignoreCase)\n                a = a.toLowerCase();\n            var list = a.split(splitChar || \"|\");\n            for (var i = list.length; i--; )\n                keywords[list[i]] = className;\n        });\n        if (Object.getPrototypeOf(keywords)) {\n            keywords.__proto__ = null;\n        }\n        this.$keywordList = Object.keys(keywords);\n        map = null;\n        return ignoreCase\n            ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n            : function(value) {return keywords[value] || defaultToken };\n    };\n\n    this.getKeywords = function() {\n        return this.$keywords;\n    };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Behaviour = function() {\n   this.$behaviours = {};\n};\n\n(function () {\n\n    this.add = function (name, action, callback) {\n        switch (undefined) {\n          case this.$behaviours:\n              this.$behaviours = {};\n          case this.$behaviours[name]:\n              this.$behaviours[name] = {};\n        }\n        this.$behaviours[name][action] = callback;\n    }\n    \n    this.addBehaviours = function (behaviours) {\n        for (var key in behaviours) {\n            for (var action in behaviours[key]) {\n                this.add(key, action, behaviours[key][action]);\n            }\n        }\n    }\n    \n    this.remove = function (name) {\n        if (this.$behaviours && this.$behaviours[name]) {\n            delete this.$behaviours[name];\n        }\n    }\n    \n    this.inherit = function (mode, filter) {\n        if (typeof mode === \"function\") {\n            var behaviours = new mode().getBehaviours(filter);\n        } else {\n            var behaviours = mode.getBehaviours(filter);\n        }\n        this.addBehaviours(behaviours);\n    }\n    \n    this.getBehaviours = function (filter) {\n        if (!filter) {\n            return this.$behaviours;\n        } else {\n            var ret = {}\n            for (var i = 0; i < filter.length; i++) {\n                if (this.$behaviours[filter[i]]) {\n                    ret[filter[i]] = this.$behaviours[filter[i]];\n                }\n            }\n            return ret;\n        }\n    }\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar TokenIterator = function(session, initialRow, initialColumn) {\n    this.$session = session;\n    this.$row = initialRow;\n    this.$rowTokens = session.getTokens(initialRow);\n\n    var token = session.getTokenAt(initialRow, initialColumn);\n    this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n    this.stepBackward = function() {\n        this.$tokenIndex -= 1;\n        \n        while (this.$tokenIndex < 0) {\n            this.$row -= 1;\n            if (this.$row < 0) {\n                this.$row = 0;\n                return null;\n            }\n                \n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = this.$rowTokens.length - 1;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };   \n    this.stepForward = function() {\n        this.$tokenIndex += 1;\n        var rowCount;\n        while (this.$tokenIndex >= this.$rowTokens.length) {\n            this.$row += 1;\n            if (!rowCount)\n                rowCount = this.$session.getLength();\n            if (this.$row >= rowCount) {\n                this.$row = rowCount - 1;\n                return null;\n            }\n\n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = 0;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentToken = function () {\n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentTokenRow = function () {\n        return this.$row;\n    };     \n    this.getCurrentTokenColumn = function() {\n        var rowTokens = this.$rowTokens;\n        var tokenIndex = this.$tokenIndex;\n        var column = rowTokens[tokenIndex].start;\n        if (column !== undefined)\n            return column;\n            \n        column = 0;\n        while (tokenIndex > 0) {\n            tokenIndex -= 1;\n            column += rowTokens[tokenIndex].value.length;\n        }\n        \n        return column;  \n    };\n    this.getCurrentTokenPosition = function() {\n        return {row: this.$row, column: this.getCurrentTokenColumn()};\n    };\n            \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../../lib/oop\");\nvar Behaviour = acequire(\"../behaviour\").Behaviour;\nvar TokenIterator = acequire(\"../../token_iterator\").TokenIterator;\nvar lang = acequire(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar getWrapped = function(selection, selected, opening, closing) {\n    var rowDiff = selection.end.row - selection.start.row;\n    return {\n        text: opening + selected + closing,\n        selection: [\n                0,\n                selection.start.column + 1,\n                rowDiff,\n                selection.end.column + (rowDiff ? 0 : 1)\n            ]\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return getWrapped(selection, selected, '{', '}');\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return getWrapped(selection, selected, '(', ')');\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return getWrapped(selection, selected, '[', ']');\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1)\n                return;\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return getWrapped(selection, selected, quote, quote);\n            } else if (!selected) {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n\n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n\n                var stringBefore = token && /string|escape/.test(token.type);\n                var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n\n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                    if (pair && /string\\.end/.test(rightToken.type))\n                        pair = false;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings\n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n\nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.packages = {};\n\naddUnicodePackage({\n    L:  \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n    Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n    Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n    Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n    Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    M:  \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n    Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n    Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n    Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n    N:  \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n    No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n    P:  \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n    Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n    Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n    Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n    Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n    Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n    Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n    Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n    S:  \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n    Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n    Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n    Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n    So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n    Z:  \"002000A01680180E2000-200A20282029202F205F3000\",\n    Zs: \"002000A01680180E2000-200A202F205F3000\",\n    Zl: \"2028\",\n    Zp: \"2029\",\n    C:  \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n    Cc: \"0000-001F007F-009F\",\n    Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n    Co: \"E000-F8FF\",\n    Cs: \"D800-DFFF\",\n    Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n    var codePoint = /\\w{4}/g;\n    for (var name in pack)\n        exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n}\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Tokenizer = acequire(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\nvar unicode = acequire(\"../unicode\");\nvar lang = acequire(\"../lib/lang\");\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = TextHighlightRules;\n};\n\n(function() {\n    this.$defaultBehaviour = new CstyleBehaviour();\n\n    this.tokenRe = new RegExp(\"^[\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n    );\n\n    this.nonTokenRe = new RegExp(\"^(?:[^\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n    );\n\n    this.getTokenizer = function() {\n        if (!this.$tokenizer) {\n            this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\n            this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n        }\n        return this.$tokenizer;\n    };\n\n    this.lineCommentStart = \"\";\n    this.blockComment = \"\";\n\n    this.toggleCommentLines = function(state, session, startRow, endRow) {\n        var doc = session.doc;\n\n        var ignoreBlankLines = true;\n        var shouldRemove = true;\n        var minIndent = Infinity;\n        var tabSize = session.getTabSize();\n        var insertAtTabStop = false;\n\n        if (!this.lineCommentStart) {\n            if (!this.blockComment)\n                return false;\n            var lineCommentStart = this.blockComment.start;\n            var lineCommentEnd = this.blockComment.end;\n            var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n            var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n            var comment = function(line, i) {\n                if (testRemove(line, i))\n                    return;\n                if (!ignoreBlankLines || /\\S/.test(line)) {\n                    doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n                    doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n                }\n            };\n\n            var uncomment = function(line, i) {\n                var m;\n                if (m = line.match(regexpEnd))\n                    doc.removeInLine(i, line.length - m[0].length, line.length);\n                if (m = line.match(regexpStart))\n                    doc.removeInLine(i, m[1].length, m[0].length);\n            };\n\n            var testRemove = function(line, row) {\n                if (regexpStart.test(line))\n                    return true;\n                var tokens = session.getTokens(row);\n                for (var i = 0; i < tokens.length; i++) {\n                    if (tokens[i].type === \"comment\")\n                        return true;\n                }\n            };\n        } else {\n            if (Array.isArray(this.lineCommentStart)) {\n                var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n                var lineCommentStart = this.lineCommentStart[0];\n            } else {\n                var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n                var lineCommentStart = this.lineCommentStart;\n            }\n            regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n            \n            insertAtTabStop = session.getUseSoftTabs();\n\n            var uncomment = function(line, i) {\n                var m = line.match(regexpStart);\n                if (!m) return;\n                var start = m[1].length, end = m[0].length;\n                if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n                    end--;\n                doc.removeInLine(i, start, end);\n            };\n            var commentWithSpace = lineCommentStart + \" \";\n            var comment = function(line, i) {\n                if (!ignoreBlankLines || /\\S/.test(line)) {\n                    if (shouldInsertSpace(line, minIndent, minIndent))\n                        doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n                    else\n                        doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n                }\n            };\n            var testRemove = function(line, i) {\n                return regexpStart.test(line);\n            };\n            \n            var shouldInsertSpace = function(line, before, after) {\n                var spaces = 0;\n                while (before-- && line.charAt(before) == \" \")\n                    spaces++;\n                if (spaces % tabSize != 0)\n                    return false;\n                var spaces = 0;\n                while (line.charAt(after++) == \" \")\n                    spaces++;\n                if (tabSize > 2)\n                    return spaces % tabSize != tabSize - 1;\n                else\n                    return spaces % tabSize == 0;\n                return true;\n            };\n        }\n\n        function iter(fun) {\n            for (var i = startRow; i <= endRow; i++)\n                fun(doc.getLine(i), i);\n        }\n\n\n        var minEmptyLength = Infinity;\n        iter(function(line, i) {\n            var indent = line.search(/\\S/);\n            if (indent !== -1) {\n                if (indent < minIndent)\n                    minIndent = indent;\n                if (shouldRemove && !testRemove(line, i))\n                    shouldRemove = false;\n            } else if (minEmptyLength > line.length) {\n                minEmptyLength = line.length;\n            }\n        });\n\n        if (minIndent == Infinity) {\n            minIndent = minEmptyLength;\n            ignoreBlankLines = false;\n            shouldRemove = false;\n        }\n\n        if (insertAtTabStop && minIndent % tabSize != 0)\n            minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n        iter(shouldRemove ? uncomment : comment);\n    };\n\n    this.toggleBlockComment = function(state, session, range, cursor) {\n        var comment = this.blockComment;\n        if (!comment)\n            return;\n        if (!comment.start && comment[0])\n            comment = comment[0];\n\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        var token = iterator.getCurrentToken();\n\n        var sel = session.selection;\n        var initialRange = session.selection.toOrientedRange();\n        var startRow, colDiff;\n\n        if (token && /comment/.test(token.type)) {\n            var startRange, endRange;\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.start);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    startRange = new Range(row, column, row, column + comment.start.length);\n                    break;\n                }\n                token = iterator.stepBackward();\n            }\n\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.end);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    endRange = new Range(row, column, row, column + comment.end.length);\n                    break;\n                }\n                token = iterator.stepForward();\n            }\n            if (endRange)\n                session.remove(endRange);\n            if (startRange) {\n                session.remove(startRange);\n                startRow = startRange.start.row;\n                colDiff = -comment.start.length;\n            }\n        } else {\n            colDiff = comment.start.length;\n            startRow = range.start.row;\n            session.insert(range.end, comment.end);\n            session.insert(range.start, comment.start);\n        }\n        if (initialRange.start.row == startRow)\n            initialRange.start.column += colDiff;\n        if (initialRange.end.row == startRow)\n            initialRange.end.column += colDiff;\n        session.selection.fromOrientedRange(initialRange);\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.createModeDelegates = function (mapping) {\n        this.$embeds = [];\n        this.$modes = {};\n        for (var i in mapping) {\n            if (mapping[i]) {\n                this.$embeds.push(i);\n                this.$modes[i] = new mapping[i]();\n            }\n        }\n\n        var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n            \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\n        for (var i = 0; i < delegations.length; i++) {\n            (function(scope) {\n              var functionName = delegations[i];\n              var defaultHandler = scope[functionName];\n              scope[delegations[i]] = function() {\n                  return this.$delegator(functionName, arguments, defaultHandler);\n              };\n            }(this));\n        }\n    };\n\n    this.$delegator = function(method, args, defaultHandler) {\n        var state = args[0];\n        if (typeof state != \"string\")\n            state = state[0];\n        for (var i = 0; i < this.$embeds.length; i++) {\n            if (!this.$modes[this.$embeds[i]]) continue;\n\n            var split = state.split(this.$embeds[i]);\n            if (!split[0] && split[1]) {\n                args[0] = split[1];\n                var mode = this.$modes[this.$embeds[i]];\n                return mode[method].apply(mode, args);\n            }\n        }\n        var ret = defaultHandler.apply(this, args);\n        return defaultHandler ? ret : undefined;\n    };\n\n    this.transformAction = function(state, action, editor, session, param) {\n        if (this.$behaviour) {\n            var behaviours = this.$behaviour.getBehaviours();\n            for (var key in behaviours) {\n                if (behaviours[key][action]) {\n                    var ret = behaviours[key][action].apply(this, arguments);\n                    if (ret) {\n                        return ret;\n                    }\n                }\n            }\n        }\n    };\n    \n    this.getKeywords = function(append) {\n        if (!this.completionKeywords) {\n            var rules = this.$tokenizer.rules;\n            var completionKeywords = [];\n            for (var rule in rules) {\n                var ruleItr = rules[rule];\n                for (var r = 0, l = ruleItr.length; r < l; r++) {\n                    if (typeof ruleItr[r].token === \"string\") {\n                        if (/keyword|support|storage/.test(ruleItr[r].token))\n                            completionKeywords.push(ruleItr[r].regex);\n                    }\n                    else if (typeof ruleItr[r].token === \"object\") {\n                        for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) {    \n                            if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n                                var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n                                completionKeywords.push(rule.substr(1, rule.length - 2));\n                            }\n                        }\n                    }\n                }\n            }\n            this.completionKeywords = completionKeywords;\n        }\n        if (!append)\n            return this.$keywordList;\n        return completionKeywords.concat(this.$keywordList || []);\n    };\n    \n    this.$createKeywordList = function() {\n        if (!this.$highlightRules)\n            this.getTokenizer();\n        return this.$keywordList = this.$highlightRules.$keywordList || [];\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var keywords = this.$keywordList || this.$createKeywordList();\n        return keywords.map(function(word) {\n            return {\n                name: word,\n                value: word,\n                score: 0,\n                meta: \"keyword\"\n            };\n        });\n    };\n\n    this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n    console.log(\"Invalid Delta:\", delta);\n    throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n    return position.row    >= 0 && position.row    <  docLines.length &&\n           position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n    if (delta.action != \"insert\" && delta.action != \"remove\")\n        throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n    if (!(delta.lines instanceof Array))\n        throwDeltaError(delta, \"delta.lines must be an Array\");\n    if (!delta.start || !delta.end)\n       throwDeltaError(delta, \"delta.start/end must be an present\");\n    var start = delta.start;\n    if (!positionInDocument(docLines, delta.start))\n        throwDeltaError(delta, \"delta.start must be contained in document\");\n    var end = delta.end;\n    if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n        throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n    var numRangeRows = end.row - start.row;\n    var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n    if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n        throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n    \n    var row = delta.start.row;\n    var startColumn = delta.start.column;\n    var line = docLines[row] || \"\";\n    switch (delta.action) {\n        case \"insert\":\n            var lines = delta.lines;\n            if (lines.length === 1) {\n                docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n            } else {\n                var args = [row, 1].concat(delta.lines);\n                docLines.splice.apply(docLines, args);\n                docLines[row] = line.substring(0, startColumn) + docLines[row];\n                docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n            }\n            break;\n        case \"remove\":\n            var endColumn = delta.end.column;\n            var endRow = delta.end.row;\n            if (row === endRow) {\n                docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n            } else {\n                docLines.splice(\n                    row, endRow - row + 1,\n                    line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n                );\n            }\n            break;\n    }\n}\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(delta) {\n        if (delta.start.row == delta.end.row && delta.start.row != this.row)\n            return;\n\n        if (delta.start.row > this.row)\n            return;\n            \n        var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n        this.setPosition(point.row, point.column, true);\n    };\n    \n    function $pointsInOrder(point1, point2, equalPointsInOrder) {\n        var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n        return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n    }\n            \n    function $getTransformedPoint(delta, point, moveIfEqual) {\n        var deltaIsInsert = delta.action == \"insert\";\n        var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row    - delta.start.row);\n        var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n        var deltaStart = delta.start;\n        var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n        if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n            return {\n                row: point.row,\n                column: point.column\n            };\n        }\n        if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n            return {\n                row: point.row + deltaRowShift,\n                column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n            };\n        }\n        \n        return {\n            row: deltaStart.row,\n            column: deltaStart.column\n        };\n    }\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar applyDelta = acequire(\"./apply_delta\").applyDelta;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Anchor = acequire(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n    this.$lines = [\"\"];\n    if (textOrLines.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(textOrLines)) {\n        this.insertMergedLines({row: 0, column: 0}, textOrLines);\n    } else {\n        this.insert({row: 0, column:0}, textOrLines);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength() - 1;\n        this.remove(new Range(0, 0, len, this.getLine(len).length));\n        this.insert({row: 0, column: 0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0) {\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    } else {\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n    }\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        return this.getLinesForRange(range).join(this.getNewLineCharacter());\n    };\n    this.getLinesForRange = function(range) {\n        var lines;\n        if (range.start.row === range.end.row) {\n            lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n        } else {\n            lines = this.getLines(range.start.row, range.end.row);\n            lines[0] = (lines[0] || \"\").substring(range.start.column);\n            var l = lines.length - 1;\n            if (range.end.row - range.start.row == l)\n                lines[l] = lines[l].substring(0, range.end.column);\n        }\n        return lines;\n    };\n    this.insertLines = function(row, lines) {\n        console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n        return this.insertFullLines(row, lines);\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n        return this.removeFullLines(firstRow, lastRow);\n    };\n    this.insertNewLine = function(position) {\n        console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n        return this.insertMergedLines(position, [\"\", \"\"]);\n    };\n    this.insert = function(position, text) {\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n        \n        return this.insertMergedLines(position, this.$split(text));\n    };\n    this.insertInLine = function(position, text) {\n        var start = this.clippedPos(position.row, position.column);\n        var end = this.pos(position.row, position.column + text.length);\n        \n        this.applyDelta({\n            start: start,\n            end: end,\n            action: \"insert\",\n            lines: [text]\n        }, true);\n        \n        return this.clonePos(end);\n    };\n    \n    this.clippedPos = function(row, column) {\n        var length = this.getLength();\n        if (row === undefined) {\n            row = length;\n        } else if (row < 0) {\n            row = 0;\n        } else if (row >= length) {\n            row = length - 1;\n            column = undefined;\n        }\n        var line = this.getLine(row);\n        if (column == undefined)\n            column = line.length;\n        column = Math.min(Math.max(column, 0), line.length);\n        return {row: row, column: column};\n    };\n    \n    this.clonePos = function(pos) {\n        return {row: pos.row, column: pos.column};\n    };\n    \n    this.pos = function(row, column) {\n        return {row: row, column: column};\n    };\n    \n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length - 1).length;\n        } else {\n            position.row = Math.max(0, position.row);\n            position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n        }\n        return position;\n    };\n    this.insertFullLines = function(row, lines) {\n        row = Math.min(Math.max(row, 0), this.getLength());\n        var column = 0;\n        if (row < this.getLength()) {\n            lines = lines.concat([\"\"]);\n            column = 0;\n        } else {\n            lines = [\"\"].concat(lines);\n            row--;\n            column = this.$lines[row].length;\n        }\n        this.insertMergedLines({row: row, column: column}, lines);\n    };    \n    this.insertMergedLines = function(position, lines) {\n        var start = this.clippedPos(position.row, position.column);\n        var end = {\n            row: start.row + lines.length - 1,\n            column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n        };\n        \n        this.applyDelta({\n            start: start,\n            end: end,\n            action: \"insert\",\n            lines: lines\n        });\n        \n        return this.clonePos(end);\n    };\n    this.remove = function(range) {\n        var start = this.clippedPos(range.start.row, range.start.column);\n        var end = this.clippedPos(range.end.row, range.end.column);\n        this.applyDelta({\n            start: start,\n            end: end,\n            action: \"remove\",\n            lines: this.getLinesForRange({start: start, end: end})\n        });\n        return this.clonePos(start);\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        var start = this.clippedPos(row, startColumn);\n        var end = this.clippedPos(row, endColumn);\n        \n        this.applyDelta({\n            start: start,\n            end: end,\n            action: \"remove\",\n            lines: this.getLinesForRange({start: start, end: end})\n        }, true);\n        \n        return this.clonePos(start);\n    };\n    this.removeFullLines = function(firstRow, lastRow) {\n        firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n        lastRow  = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n        var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n        var deleteLastNewLine  = lastRow  < this.getLength() - 1;\n        var startRow = ( deleteFirstNewLine ? firstRow - 1                  : firstRow                    );\n        var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0                           );\n        var endRow   = ( deleteLastNewLine  ? lastRow + 1                   : lastRow                     );\n        var endCol   = ( deleteLastNewLine  ? 0                             : this.getLine(endRow).length ); \n        var range = new Range(startRow, startCol, endRow, endCol);\n        var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n        \n        this.applyDelta({\n            start: range.start,\n            end: range.end,\n            action: \"remove\",\n            lines: this.getLinesForRange(range)\n        });\n        return deletedLines;\n    };\n    this.removeNewLine = function(row) {\n        if (row < this.getLength() - 1 && row >= 0) {\n            this.applyDelta({\n                start: this.pos(row, this.getLine(row).length),\n                end: this.pos(row + 1, 0),\n                action: \"remove\",\n                lines: [\"\", \"\"]\n            });\n        }\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length === 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        var end;\n        if (text) {\n            end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n        \n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            this.applyDelta(deltas[i]);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            this.revertDelta(deltas[i]);\n        }\n    };\n    this.applyDelta = function(delta, doNotValidate) {\n        var isInsert = delta.action == \"insert\";\n        if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n            : !Range.comparePoints(delta.start, delta.end)) {\n            return;\n        }\n        \n        if (isInsert && delta.lines.length > 20000)\n            this.$splitAndapplyLargeDelta(delta, 20000);\n        applyDelta(this.$lines, delta, doNotValidate);\n        this._signal(\"change\", delta);\n    };\n    \n    this.$splitAndapplyLargeDelta = function(delta, MAX) {\n        var lines = delta.lines;\n        var l = lines.length;\n        var row = delta.start.row; \n        var column = delta.start.column;\n        var from = 0, to = 0;\n        do {\n            from = to;\n            to += MAX - 1;\n            var chunk = lines.slice(from, to);\n            if (to > l) {\n                delta.lines = chunk;\n                delta.start.row = row + from;\n                delta.start.column = column;\n                break;\n            }\n            chunk.push(\"\");\n            this.applyDelta({\n                start: this.pos(row + from, column),\n                end: this.pos(row + to, column = 0),\n                action: delta.action,\n                lines: chunk\n            }, true);\n        } while(true);\n    };\n    this.revertDelta = function(delta) {\n        this.applyDelta({\n            start: this.clonePos(delta.start),\n            end: this.clonePos(delta.end),\n            action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n            lines: delta.lines.slice()\n        });\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n    this.running = false;\n    this.lines = [];\n    this.states = [];\n    this.currentLine = 0;\n    this.tokenizer = tokenizer;\n\n    var self = this;\n\n    this.$worker = function() {\n        if (!self.running) { return; }\n\n        var workerStart = new Date();\n        var currentLine = self.currentLine;\n        var endLine = -1;\n        var doc = self.doc;\n\n        var startLine = currentLine;\n        while (self.lines[currentLine])\n            currentLine++;\n        \n        var len = doc.getLength();\n        var processedLines = 0;\n        self.running = false;\n        while (currentLine < len) {\n            self.$tokenizeRow(currentLine);\n            endLine = currentLine;\n            do {\n                currentLine++;\n            } while (self.lines[currentLine]);\n            processedLines ++;\n            if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) {                \n                self.running = setTimeout(self.$worker, 20);\n                break;\n            }\n        }\n        self.currentLine = currentLine;\n        \n        if (startLine <= endLine)\n            self.fireUpdateEvent(startLine, endLine);\n    };\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n    this.setTokenizer = function(tokenizer) {\n        this.tokenizer = tokenizer;\n        this.lines = [];\n        this.states = [];\n\n        this.start(0);\n    };\n    this.setDocument = function(doc) {\n        this.doc = doc;\n        this.lines = [];\n        this.states = [];\n\n        this.stop();\n    };\n    this.fireUpdateEvent = function(firstRow, lastRow) {\n        var data = {\n            first: firstRow,\n            last: lastRow\n        };\n        this._signal(\"update\", {data: data});\n    };\n    this.start = function(startRow) {\n        this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n        this.lines.splice(this.currentLine, this.lines.length);\n        this.states.splice(this.currentLine, this.states.length);\n\n        this.stop();\n        this.running = setTimeout(this.$worker, 700);\n    };\n    \n    this.scheduleStart = function() {\n        if (!this.running)\n            this.running = setTimeout(this.$worker, 700);\n    }\n\n    this.$updateOnChange = function(delta) {\n        var startRow = delta.start.row;\n        var len = delta.end.row - startRow;\n\n        if (len === 0) {\n            this.lines[startRow] = null;\n        } else if (delta.action == \"remove\") {\n            this.lines.splice(startRow, len + 1, null);\n            this.states.splice(startRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(startRow, 1);\n            this.lines.splice.apply(this.lines, args);\n            this.states.splice.apply(this.states, args);\n        }\n\n        this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n        this.stop();\n    };\n    this.stop = function() {\n        if (this.running)\n            clearTimeout(this.running);\n        this.running = false;\n    };\n    this.getTokens = function(row) {\n        return this.lines[row] || this.$tokenizeRow(row);\n    };\n    this.getState = function(row) {\n        if (this.currentLine == row)\n            this.$tokenizeRow(row);\n        return this.states[row] || \"start\";\n    };\n\n    this.$tokenizeRow = function(row) {\n        var line = this.doc.getLine(row);\n        var state = this.states[row - 1];\n\n        var data = this.tokenizer.getLineTokens(line, state, row);\n\n        if (this.states[row] + \"\" !== data.state + \"\") {\n            this.states[row] = data.state;\n            this.lines[row + 1] = null;\n            if (this.currentLine > row + 1)\n                this.currentLine = row + 1;\n        } else if (this.currentLine == row) {\n            this.currentLine = row + 1;\n        }\n\n        return this.lines[row] = data.tokens;\n    };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n    this.setRegexp(regExp);\n    this.clazz = clazz;\n    this.type = type || \"text\";\n};\n\n(function() {\n    this.MAX_RANGES = 500;\n    \n    this.setRegexp = function(regExp) {\n        if (this.regExp+\"\" == regExp+\"\")\n            return;\n        this.regExp = regExp;\n        this.cache = [];\n    };\n\n    this.update = function(html, markerLayer, session, config) {\n        if (!this.regExp)\n            return;\n        var start = config.firstRow, end = config.lastRow;\n\n        for (var i = start; i <= end; i++) {\n            var ranges = this.cache[i];\n            if (ranges == null) {\n                ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n                if (ranges.length > this.MAX_RANGES)\n                    ranges = ranges.slice(0, this.MAX_RANGES);\n                ranges = ranges.map(function(match) {\n                    return new Range(i, match.offset, i, match.offset + match.length);\n                });\n                this.cache[i] = ranges.length ? ranges : \"\";\n            }\n\n            for (var j = ranges.length; j --; ) {\n                markerLayer.drawSingleLineMarker(\n                    html, ranges[j].toScreenRange(session), this.clazz, config);\n            }\n        }\n    };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n    this.foldData = foldData;\n    if (Array.isArray(folds)) {\n        this.folds = folds;\n    } else {\n        folds = this.folds = [ folds ];\n    }\n\n    var last = folds[folds.length - 1];\n    this.range = new Range(folds[0].start.row, folds[0].start.column,\n                           last.end.row, last.end.column);\n    this.start = this.range.start;\n    this.end   = this.range.end;\n\n    this.folds.forEach(function(fold) {\n        fold.setFoldLine(this);\n    }, this);\n}\n\n(function() {\n    this.shiftRow = function(shift) {\n        this.start.row += shift;\n        this.end.row += shift;\n        this.folds.forEach(function(fold) {\n            fold.start.row += shift;\n            fold.end.row += shift;\n        });\n    };\n\n    this.addFold = function(fold) {\n        if (fold.sameRow) {\n            if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n                throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n            }\n            this.folds.push(fold);\n            this.folds.sort(function(a, b) {\n                return -a.range.compareEnd(b.start.row, b.start.column);\n            });\n            if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n                this.end.row = fold.end.row;\n                this.end.column =  fold.end.column;\n            } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n                this.start.row = fold.start.row;\n                this.start.column = fold.start.column;\n            }\n        } else if (fold.start.row == this.end.row) {\n            this.folds.push(fold);\n            this.end.row = fold.end.row;\n            this.end.column = fold.end.column;\n        } else if (fold.end.row == this.start.row) {\n            this.folds.unshift(fold);\n            this.start.row = fold.start.row;\n            this.start.column = fold.start.column;\n        } else {\n            throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n        }\n        fold.foldLine = this;\n    };\n\n    this.containsRow = function(row) {\n        return row >= this.start.row && row <= this.end.row;\n    };\n\n    this.walk = function(callback, endRow, endColumn) {\n        var lastEnd = 0,\n            folds = this.folds,\n            fold,\n            cmp, stop, isNewRow = true;\n\n        if (endRow == null) {\n            endRow = this.end.row;\n            endColumn = this.end.column;\n        }\n\n        for (var i = 0; i < folds.length; i++) {\n            fold = folds[i];\n\n            cmp = fold.range.compareStart(endRow, endColumn);\n            if (cmp == -1) {\n                callback(null, endRow, endColumn, lastEnd, isNewRow);\n                return;\n            }\n\n            stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n            stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n            if (stop || cmp === 0) {\n                return;\n            }\n            isNewRow = !fold.sameRow;\n            lastEnd = fold.end.column;\n        }\n        callback(null, endRow, endColumn, lastEnd, isNewRow);\n    };\n\n    this.getNextFoldTo = function(row, column) {\n        var fold, cmp;\n        for (var i = 0; i < this.folds.length; i++) {\n            fold = this.folds[i];\n            cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                return {\n                    fold: fold,\n                    kind: \"after\"\n                };\n            } else if (cmp === 0) {\n                return {\n                    fold: fold,\n                    kind: \"inside\"\n                };\n            }\n        }\n        return null;\n    };\n\n    this.addRemoveChars = function(row, column, len) {\n        var ret = this.getNextFoldTo(row, column),\n            fold, folds;\n        if (ret) {\n            fold = ret.fold;\n            if (ret.kind == \"inside\"\n                && fold.start.column != column\n                && fold.start.row != row)\n            {\n                window.console && window.console.log(row, column, fold);\n            } else if (fold.start.row == row) {\n                folds = this.folds;\n                var i = folds.indexOf(fold);\n                if (i === 0) {\n                    this.start.column += len;\n                }\n                for (i; i < folds.length; i++) {\n                    fold = folds[i];\n                    fold.start.column += len;\n                    if (!fold.sameRow) {\n                        return;\n                    }\n                    fold.end.column += len;\n                }\n                this.end.column += len;\n            }\n        }\n    };\n\n    this.split = function(row, column) {\n        var pos = this.getNextFoldTo(row, column);\n        \n        if (!pos || pos.kind == \"inside\")\n            return null;\n            \n        var fold = pos.fold;\n        var folds = this.folds;\n        var foldData = this.foldData;\n        \n        var i = folds.indexOf(fold);\n        var foldBefore = folds[i - 1];\n        this.end.row = foldBefore.end.row;\n        this.end.column = foldBefore.end.column;\n        folds = folds.splice(i, folds.length - i);\n\n        var newFoldLine = new FoldLine(foldData, folds);\n        foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n        return newFoldLine;\n    };\n\n    this.merge = function(foldLineNext) {\n        var folds = foldLineNext.folds;\n        for (var i = 0; i < folds.length; i++) {\n            this.addFold(folds[i]);\n        }\n        var foldData = this.foldData;\n        foldData.splice(foldData.indexOf(foldLineNext), 1);\n    };\n\n    this.toString = function() {\n        var ret = [this.range.toString() + \": [\" ];\n\n        this.folds.forEach(function(fold) {\n            ret.push(\"  \" + fold.toString());\n        });\n        ret.push(\"]\");\n        return ret.join(\"\\n\");\n    };\n\n    this.idxToPosition = function(idx) {\n        var lastFoldEndColumn = 0;\n\n        for (var i = 0; i < this.folds.length; i++) {\n            var fold = this.folds[i];\n\n            idx -= fold.start.column - lastFoldEndColumn;\n            if (idx < 0) {\n                return {\n                    row: fold.start.row,\n                    column: fold.start.column + idx\n                };\n            }\n\n            idx -= fold.placeholder.length;\n            if (idx < 0) {\n                return fold.start;\n            }\n\n            lastFoldEndColumn = fold.end.column;\n        }\n\n        return {\n            row: this.end.row,\n            column: this.end.column + idx\n        };\n    };\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar Range = acequire(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n    this.ranges = [];\n};\n\n(function() {\n    this.comparePoints = comparePoints;\n\n    this.pointIndex = function(pos, excludeEdges, startIndex) {\n        var list = this.ranges;\n\n        for (var i = startIndex || 0; i < list.length; i++) {\n            var range = list[i];\n            var cmpEnd = comparePoints(pos, range.end);\n            if (cmpEnd > 0)\n                continue;\n            var cmpStart = comparePoints(pos, range.start);\n            if (cmpEnd === 0)\n                return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n            if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n                return i;\n\n            return -i-1;\n        }\n        return -i - 1;\n    };\n\n    this.add = function(range) {\n        var excludeEdges = !range.isEmpty();\n        var startIndex = this.pointIndex(range.start, excludeEdges);\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n\n        var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n        else\n            endIndex++;\n        return this.ranges.splice(startIndex, endIndex - startIndex, range);\n    };\n\n    this.addList = function(list) {\n        var removed = [];\n        for (var i = list.length; i--; ) {\n            removed.push.apply(removed, this.add(list[i]));\n        }\n        return removed;\n    };\n\n    this.substractPoint = function(pos) {\n        var i = this.pointIndex(pos);\n\n        if (i >= 0)\n            return this.ranges.splice(i, 1);\n    };\n    this.merge = function() {\n        var removed = [];\n        var list = this.ranges;\n        \n        list = list.sort(function(a, b) {\n            return comparePoints(a.start, b.start);\n        });\n        \n        var next = list[0], range;\n        for (var i = 1; i < list.length; i++) {\n            range = next;\n            next = list[i];\n            var cmp = comparePoints(range.end, next.start);\n            if (cmp < 0)\n                continue;\n\n            if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n                continue;\n\n            if (comparePoints(range.end, next.end) < 0) {\n                range.end.row = next.end.row;\n                range.end.column = next.end.column;\n            }\n\n            list.splice(i, 1);\n            removed.push(next);\n            next = range;\n            i--;\n        }\n        \n        this.ranges = list;\n\n        return removed;\n    };\n\n    this.contains = function(row, column) {\n        return this.pointIndex({row: row, column: column}) >= 0;\n    };\n\n    this.containsPoint = function(pos) {\n        return this.pointIndex(pos) >= 0;\n    };\n\n    this.rangeAtPoint = function(pos) {\n        var i = this.pointIndex(pos);\n        if (i >= 0)\n            return this.ranges[i];\n    };\n\n\n    this.clipRows = function(startRow, endRow) {\n        var list = this.ranges;\n        if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n            return [];\n\n        var startIndex = this.pointIndex({row: startRow, column: 0});\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n        var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n\n        var clipped = [];\n        for (var i = startIndex; i < endIndex; i++) {\n            clipped.push(list[i]);\n        }\n        return clipped;\n    };\n\n    this.removeAll = function() {\n        return this.ranges.splice(0, this.ranges.length);\n    };\n\n    this.attach = function(session) {\n        if (this.session)\n            this.detach();\n\n        this.session = session;\n        this.onChange = this.$onChange.bind(this);\n\n        this.session.on('change', this.onChange);\n    };\n\n    this.detach = function() {\n        if (!this.session)\n            return;\n        this.session.removeListener('change', this.onChange);\n        this.session = null;\n    };\n\n    this.$onChange = function(delta) {\n        if (delta.action == \"insert\"){\n            var start = delta.start;\n            var end = delta.end;\n        } else {\n            var end = delta.start;\n            var start = delta.end;\n        }\n        var startRow = start.row;\n        var endRow = end.row;\n        var lineDif = endRow - startRow;\n\n        var colDiff = -start.column + end.column;\n        var ranges = this.ranges;\n\n        for (var i = 0, n = ranges.length; i < n; i++) {\n            var r = ranges[i];\n            if (r.end.row < startRow)\n                continue;\n            if (r.start.row > startRow)\n                break;\n\n            if (r.start.row == startRow && r.start.column >= start.column ) {\n                if (r.start.column == start.column && this.$insertRight) {\n                } else {\n                    r.start.column += colDiff;\n                    r.start.row += lineDif;\n                }\n            }\n            if (r.end.row == startRow && r.end.column >= start.column) {\n                if (r.end.column == start.column && this.$insertRight) {\n                    continue;\n                }\n                if (r.end.column == start.column && colDiff > 0 && i < n - 1) {                \n                    if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n                        r.end.column -= colDiff;\n                }\n                r.end.column += colDiff;\n                r.end.row += lineDif;\n            }\n        }\n\n        if (lineDif != 0 && i < n) {\n            for (; i < n; i++) {\n                var r = ranges[i];\n                r.start.row += lineDif;\n                r.end.row += lineDif;\n            }\n        }\n    };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar RangeList = acequire(\"../range_list\").RangeList;\nvar oop = acequire(\"../lib/oop\")\nvar Fold = exports.Fold = function(range, placeholder) {\n    this.foldLine = null;\n    this.placeholder = placeholder;\n    this.range = range;\n    this.start = range.start;\n    this.end = range.end;\n\n    this.sameRow = range.start.row == range.end.row;\n    this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n    this.toString = function() {\n        return '\"' + this.placeholder + '\" ' + this.range.toString();\n    };\n\n    this.setFoldLine = function(foldLine) {\n        this.foldLine = foldLine;\n        this.subFolds.forEach(function(fold) {\n            fold.setFoldLine(foldLine);\n        });\n    };\n\n    this.clone = function() {\n        var range = this.range.clone();\n        var fold = new Fold(range, this.placeholder);\n        this.subFolds.forEach(function(subFold) {\n            fold.subFolds.push(subFold.clone());\n        });\n        fold.collapseChildren = this.collapseChildren;\n        return fold;\n    };\n\n    this.addSubFold = function(fold) {\n        if (this.range.isEqual(fold))\n            return;\n\n        if (!this.range.containsRange(fold))\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n        consumeRange(fold, this.start);\n\n        var row = fold.start.row, column = fold.start.column;\n        for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n            cmp = this.subFolds[i].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterStart = this.subFolds[i];\n\n        if (cmp == 0)\n            return afterStart.addSubFold(fold);\n        var row = fold.range.end.row, column = fold.range.end.column;\n        for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n            cmp = this.subFolds[j].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterEnd = this.subFolds[j];\n\n        if (cmp == 0)\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n        var consumedFolds = this.subFolds.splice(i, j - i, fold);\n        fold.setFoldLine(this.foldLine);\n\n        return fold;\n    };\n    \n    this.restoreRange = function(range) {\n        return restoreRange(range, this.start);\n    };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n    point.row -= anchor.row;\n    if (point.row == 0)\n        point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n    consumePoint(range.start, anchor);\n    consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n    if (point.row == 0)\n        point.column += anchor.column;\n    point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n    restorePoint(range.start, anchor);\n    restorePoint(range.end, anchor);\n}\n\n});\n\nace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar FoldLine = acequire(\"./fold_line\").FoldLine;\nvar Fold = acequire(\"./fold\").Fold;\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n    this.getFoldAt = function(row, column, side) {\n        var foldLine = this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var folds = foldLine.folds;\n        for (var i = 0; i < folds.length; i++) {\n            var fold = folds[i];\n            if (fold.range.contains(row, column)) {\n                if (side == 1 && fold.range.isEnd(row, column)) {\n                    continue;\n                } else if (side == -1 && fold.range.isStart(row, column)) {\n                    continue;\n                }\n                return fold;\n            }\n        }\n    };\n    this.getFoldsInRange = function(range) {\n        var start = range.start;\n        var end = range.end;\n        var foldLines = this.$foldData;\n        var foundFolds = [];\n\n        start.column += 1;\n        end.column -= 1;\n\n        for (var i = 0; i < foldLines.length; i++) {\n            var cmp = foldLines[i].range.compareRange(range);\n            if (cmp == 2) {\n                continue;\n            }\n            else if (cmp == -2) {\n                break;\n            }\n\n            var folds = foldLines[i].folds;\n            for (var j = 0; j < folds.length; j++) {\n                var fold = folds[j];\n                cmp = fold.range.compareRange(range);\n                if (cmp == -2) {\n                    break;\n                } else if (cmp == 2) {\n                    continue;\n                } else\n                if (cmp == 42) {\n                    break;\n                }\n                foundFolds.push(fold);\n            }\n        }\n        start.column -= 1;\n        end.column += 1;\n\n        return foundFolds;\n    };\n\n    this.getFoldsInRangeList = function(ranges) {\n        if (Array.isArray(ranges)) {\n            var folds = [];\n            ranges.forEach(function(range) {\n                folds = folds.concat(this.getFoldsInRange(range));\n            }, this);\n        } else {\n            var folds = this.getFoldsInRange(ranges);\n        }\n        return folds;\n    };\n    this.getAllFolds = function() {\n        var folds = [];\n        var foldLines = this.$foldData;\n        \n        for (var i = 0; i < foldLines.length; i++)\n            for (var j = 0; j < foldLines[i].folds.length; j++)\n                folds.push(foldLines[i].folds[j]);\n\n        return folds;\n    };\n    this.getFoldStringAt = function(row, column, trim, foldLine) {\n        foldLine = foldLine || this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var lastFold = {\n            end: { column: 0 }\n        };\n        var str, fold;\n        for (var i = 0; i < foldLine.folds.length; i++) {\n            fold = foldLine.folds[i];\n            var cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                str = this\n                    .getLine(fold.start.row)\n                    .substring(lastFold.end.column, fold.start.column);\n                break;\n            }\n            else if (cmp === 0) {\n                return null;\n            }\n            lastFold = fold;\n        }\n        if (!str)\n            str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n        if (trim == -1)\n            return str.substring(0, column - lastFold.end.column);\n        else if (trim == 1)\n            return str.substring(column - lastFold.end.column);\n        else\n            return str;\n    };\n\n    this.getFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n                return foldLine;\n            } else if (foldLine.end.row > docRow) {\n                return null;\n            }\n        }\n        return null;\n    };\n    this.getNextFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.end.row >= docRow) {\n                return foldLine;\n            }\n        }\n        return null;\n    };\n\n    this.getFoldedRowCount = function(first, last) {\n        var foldData = this.$foldData, rowCount = last-first+1;\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i],\n                end = foldLine.end.row,\n                start = foldLine.start.row;\n            if (end >= last) {\n                if (start < last) {\n                    if (start >= first)\n                        rowCount -= last-start;\n                    else\n                        rowCount = 0; // in one fold\n                }\n                break;\n            } else if (end >= first){\n                if (start >= first) // fold inside range\n                    rowCount -=  end-start;\n                else\n                    rowCount -=  end-first+1;\n            }\n        }\n        return rowCount;\n    };\n\n    this.$addFoldLine = function(foldLine) {\n        this.$foldData.push(foldLine);\n        this.$foldData.sort(function(a, b) {\n            return a.start.row - b.start.row;\n        });\n        return foldLine;\n    };\n    this.addFold = function(placeholder, range) {\n        var foldData = this.$foldData;\n        var added = false;\n        var fold;\n        \n        if (placeholder instanceof Fold)\n            fold = placeholder;\n        else {\n            fold = new Fold(range, placeholder);\n            fold.collapseChildren = range.collapseChildren;\n        }\n        this.$clipRangeToDocument(fold.range);\n\n        var startRow = fold.start.row;\n        var startColumn = fold.start.column;\n        var endRow = fold.end.row;\n        var endColumn = fold.end.column;\n        if (!(startRow < endRow || \n            startRow == endRow && startColumn <= endColumn - 2))\n            throw new Error(\"The range has to be at least 2 characters width\");\n\n        var startFold = this.getFoldAt(startRow, startColumn, 1);\n        var endFold = this.getFoldAt(endRow, endColumn, -1);\n        if (startFold && endFold == startFold)\n            return startFold.addSubFold(fold);\n\n        if (startFold && !startFold.range.isStart(startRow, startColumn))\n            this.removeFold(startFold);\n        \n        if (endFold && !endFold.range.isEnd(endRow, endColumn))\n            this.removeFold(endFold);\n        var folds = this.getFoldsInRange(fold.range);\n        if (folds.length > 0) {\n            this.removeFolds(folds);\n            folds.forEach(function(subFold) {\n                fold.addSubFold(subFold);\n            });\n        }\n\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (endRow == foldLine.start.row) {\n                foldLine.addFold(fold);\n                added = true;\n                break;\n            } else if (startRow == foldLine.end.row) {\n                foldLine.addFold(fold);\n                added = true;\n                if (!fold.sameRow) {\n                    var foldLineNext = foldData[i + 1];\n                    if (foldLineNext && foldLineNext.start.row == endRow) {\n                        foldLine.merge(foldLineNext);\n                        break;\n                    }\n                }\n                break;\n            } else if (endRow <= foldLine.start.row) {\n                break;\n            }\n        }\n\n        if (!added)\n            foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n        if (this.$useWrapMode)\n            this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n        else\n            this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n        this.$modified = true;\n        this._signal(\"changeFold\", { data: fold, action: \"add\" });\n\n        return fold;\n    };\n\n    this.addFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.addFold(fold);\n        }, this);\n    };\n\n    this.removeFold = function(fold) {\n        var foldLine = fold.foldLine;\n        var startRow = foldLine.start.row;\n        var endRow = foldLine.end.row;\n\n        var foldLines = this.$foldData;\n        var folds = foldLine.folds;\n        if (folds.length == 1) {\n            foldLines.splice(foldLines.indexOf(foldLine), 1);\n        } else\n        if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n            folds.pop();\n            foldLine.end.row = folds[folds.length - 1].end.row;\n            foldLine.end.column = folds[folds.length - 1].end.column;\n        } else\n        if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n            folds.shift();\n            foldLine.start.row = folds[0].start.row;\n            foldLine.start.column = folds[0].start.column;\n        } else\n        if (fold.sameRow) {\n            folds.splice(folds.indexOf(fold), 1);\n        } else\n        {\n            var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n            folds = newFoldLine.folds;\n            folds.shift();\n            newFoldLine.start.row = folds[0].start.row;\n            newFoldLine.start.column = folds[0].start.column;\n        }\n\n        if (!this.$updating) {\n            if (this.$useWrapMode)\n                this.$updateWrapData(startRow, endRow);\n            else\n                this.$updateRowLengthCache(startRow, endRow);\n        }\n        this.$modified = true;\n        this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n    };\n\n    this.removeFolds = function(folds) {\n        var cloneFolds = [];\n        for (var i = 0; i < folds.length; i++) {\n            cloneFolds.push(folds[i]);\n        }\n\n        cloneFolds.forEach(function(fold) {\n            this.removeFold(fold);\n        }, this);\n        this.$modified = true;\n    };\n\n    this.expandFold = function(fold) {\n        this.removeFold(fold);\n        fold.subFolds.forEach(function(subFold) {\n            fold.restoreRange(subFold);\n            this.addFold(subFold);\n        }, this);\n        if (fold.collapseChildren > 0) {\n            this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n        }\n        fold.subFolds = [];\n    };\n\n    this.expandFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.expandFold(fold);\n        }, this);\n    };\n\n    this.unfold = function(location, expandInner) {\n        var range, folds;\n        if (location == null) {\n            range = new Range(0, 0, this.getLength(), 0);\n            expandInner = true;\n        } else if (typeof location == \"number\")\n            range = new Range(location, 0, location, this.getLine(location).length);\n        else if (\"row\" in location)\n            range = Range.fromPoints(location, location);\n        else\n            range = location;\n        \n        folds = this.getFoldsInRangeList(range);\n        if (expandInner) {\n            this.removeFolds(folds);\n        } else {\n            var subFolds = folds;\n            while (subFolds.length) {\n                this.expandFolds(subFolds);\n                subFolds = this.getFoldsInRangeList(range);\n            }\n        }\n        if (folds.length)\n            return folds;\n    };\n    this.isRowFolded = function(docRow, startFoldRow) {\n        return !!this.getFoldLine(docRow, startFoldRow);\n    };\n\n    this.getRowFoldEnd = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.end.row : docRow;\n    };\n\n    this.getRowFoldStart = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.start.row : docRow;\n    };\n\n    this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n        if (startRow == null)\n            startRow = foldLine.start.row;\n        if (startColumn == null)\n            startColumn = 0;\n        if (endRow == null)\n            endRow = foldLine.end.row;\n        if (endColumn == null)\n            endColumn = this.getLine(endRow).length;\n        var doc = this.doc;\n        var textLine = \"\";\n\n        foldLine.walk(function(placeholder, row, column, lastColumn) {\n            if (row < startRow)\n                return;\n            if (row == startRow) {\n                if (column < startColumn)\n                    return;\n                lastColumn = Math.max(startColumn, lastColumn);\n            }\n\n            if (placeholder != null) {\n                textLine += placeholder;\n            } else {\n                textLine += doc.getLine(row).substring(lastColumn, column);\n            }\n        }, endRow, endColumn);\n        return textLine;\n    };\n\n    this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n        var foldLine = this.getFoldLine(row);\n\n        if (!foldLine) {\n            var line;\n            line = this.doc.getLine(row);\n            return line.substring(startColumn || 0, endColumn || line.length);\n        } else {\n            return this.getFoldDisplayLine(\n                foldLine, row, endColumn, startRow, startColumn);\n        }\n    };\n\n    this.$cloneFoldData = function() {\n        var fd = [];\n        fd = this.$foldData.map(function(foldLine) {\n            var folds = foldLine.folds.map(function(fold) {\n                return fold.clone();\n            });\n            return new FoldLine(fd, folds);\n        });\n\n        return fd;\n    };\n\n    this.toggleFold = function(tryToUnfold) {\n        var selection = this.selection;\n        var range = selection.getRange();\n        var fold;\n        var bracketPos;\n\n        if (range.isEmpty()) {\n            var cursor = range.start;\n            fold = this.getFoldAt(cursor.row, cursor.column);\n\n            if (fold) {\n                this.expandFold(fold);\n                return;\n            } else if (bracketPos = this.findMatchingBracket(cursor)) {\n                if (range.comparePoint(bracketPos) == 1) {\n                    range.end = bracketPos;\n                } else {\n                    range.start = bracketPos;\n                    range.start.column++;\n                    range.end.column--;\n                }\n            } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n                if (range.comparePoint(bracketPos) == 1)\n                    range.end = bracketPos;\n                else\n                    range.start = bracketPos;\n\n                range.start.column++;\n            } else {\n                range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n            }\n        } else {\n            var folds = this.getFoldsInRange(range);\n            if (tryToUnfold && folds.length) {\n                this.expandFolds(folds);\n                return;\n            } else if (folds.length == 1 ) {\n                fold = folds[0];\n            }\n        }\n\n        if (!fold)\n            fold = this.getFoldAt(range.start.row, range.start.column);\n\n        if (fold && fold.range.toString() == range.toString()) {\n            this.expandFold(fold);\n            return;\n        }\n\n        var placeholder = \"...\";\n        if (!range.isMultiLine()) {\n            placeholder = this.getTextRange(range);\n            if (placeholder.length < 4)\n                return;\n            placeholder = placeholder.trim().substring(0, 2) + \"..\";\n        }\n\n        this.addFold(placeholder, range);\n    };\n\n    this.getCommentFoldRange = function(row, column, dir) {\n        var iterator = new TokenIterator(this, row, column);\n        var token = iterator.getCurrentToken();\n        if (token && /^comment|string/.test(token.type)) {\n            var range = new Range();\n            var re = new RegExp(token.type.replace(/\\..*/, \"\\\\.\"));\n            if (dir != 1) {\n                do {\n                    token = iterator.stepBackward();\n                } while (token && re.test(token.type));\n                iterator.stepForward();\n            }\n            \n            range.start.row = iterator.getCurrentTokenRow();\n            range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n            iterator = new TokenIterator(this, row, column);\n            \n            if (dir != -1) {\n                do {\n                    token = iterator.stepForward();\n                } while (token && re.test(token.type));\n                token = iterator.stepBackward();\n            } else\n                token = iterator.getCurrentToken();\n\n            range.end.row = iterator.getCurrentTokenRow();\n            range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n            return range;\n        }\n    };\n\n    this.foldAll = function(startRow, endRow, depth) {\n        if (depth == undefined)\n            depth = 100000; // JSON.stringify doesn't hanle Infinity\n        var foldWidgets = this.foldWidgets;\n        if (!foldWidgets)\n            return; // mode doesn't support folding\n        endRow = endRow || this.getLength();\n        startRow = startRow || 0;\n        for (var row = startRow; row < endRow; row++) {\n            if (foldWidgets[row] == null)\n                foldWidgets[row] = this.getFoldWidget(row);\n            if (foldWidgets[row] != \"start\")\n                continue;\n\n            var range = this.getFoldWidgetRange(row);\n            if (range && range.isMultiLine()\n                && range.end.row <= endRow\n                && range.start.row >= startRow\n            ) {\n                row = range.end.row;\n                try {\n                    var fold = this.addFold(\"...\", range);\n                    if (fold)\n                        fold.collapseChildren = depth;\n                } catch(e) {}\n            }\n        }\n    };\n    this.$foldStyles = {\n        \"manual\": 1,\n        \"markbegin\": 1,\n        \"markbeginend\": 1\n    };\n    this.$foldStyle = \"markbegin\";\n    this.setFoldStyle = function(style) {\n        if (!this.$foldStyles[style])\n            throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n        \n        if (this.$foldStyle == style)\n            return;\n\n        this.$foldStyle = style;\n        \n        if (style == \"manual\")\n            this.unfold();\n        var mode = this.$foldMode;\n        this.$setFolding(null);\n        this.$setFolding(mode);\n    };\n\n    this.$setFolding = function(foldMode) {\n        if (this.$foldMode == foldMode)\n            return;\n            \n        this.$foldMode = foldMode;\n        \n        this.off('change', this.$updateFoldWidgets);\n        this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n        this._signal(\"changeAnnotation\");\n        \n        if (!foldMode || this.$foldStyle == \"manual\") {\n            this.foldWidgets = null;\n            return;\n        }\n        \n        this.foldWidgets = [];\n        this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n        this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n        \n        this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n        this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n        this.on('change', this.$updateFoldWidgets);\n        this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n    };\n\n    this.getParentFoldRangeData = function (row, ignoreCurrent) {\n        var fw = this.foldWidgets;\n        if (!fw || (ignoreCurrent && fw[row]))\n            return {};\n\n        var i = row - 1, firstRange;\n        while (i >= 0) {\n            var c = fw[i];\n            if (c == null)\n                c = fw[i] = this.getFoldWidget(i);\n\n            if (c == \"start\") {\n                var range = this.getFoldWidgetRange(i);\n                if (!firstRange)\n                    firstRange = range;\n                if (range && range.end.row >= row)\n                    break;\n            }\n            i--;\n        }\n\n        return {\n            range: i !== -1 && range,\n            firstRange: firstRange\n        };\n    };\n\n    this.onFoldWidgetClick = function(row, e) {\n        e = e.domEvent;\n        var options = {\n            children: e.shiftKey,\n            all: e.ctrlKey || e.metaKey,\n            siblings: e.altKey\n        };\n        \n        var range = this.$toggleFoldWidget(row, options);\n        if (!range) {\n            var el = (e.target || e.srcElement);\n            if (el && /ace_fold-widget/.test(el.className))\n                el.className += \" ace_invalid\";\n        }\n    };\n    \n    this.$toggleFoldWidget = function(row, options) {\n        if (!this.getFoldWidget)\n            return;\n        var type = this.getFoldWidget(row);\n        var line = this.getLine(row);\n\n        var dir = type === \"end\" ? -1 : 1;\n        var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n        if (fold) {\n            if (options.children || options.all)\n                this.removeFold(fold);\n            else\n                this.expandFold(fold);\n            return fold;\n        }\n\n        var range = this.getFoldWidgetRange(row, true);\n        if (range && !range.isMultiLine()) {\n            fold = this.getFoldAt(range.start.row, range.start.column, 1);\n            if (fold && range.isEqual(fold.range)) {\n                this.removeFold(fold);\n                return fold;\n            }\n        }\n        \n        if (options.siblings) {\n            var data = this.getParentFoldRangeData(row);\n            if (data.range) {\n                var startRow = data.range.start.row + 1;\n                var endRow = data.range.end.row;\n            }\n            this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n        } else if (options.children) {\n            endRow = range ? range.end.row : this.getLength();\n            this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n        } else if (range) {\n            if (options.all) \n                range.collapseChildren = 10000;\n            this.addFold(\"...\", range);\n        }\n        \n        return range;\n    };\n    \n    \n    \n    this.toggleFoldWidget = function(toggleParent) {\n        var row = this.selection.getCursor().row;\n        row = this.getRowFoldStart(row);\n        var range = this.$toggleFoldWidget(row, {});\n        \n        if (range)\n            return;\n        var data = this.getParentFoldRangeData(row, true);\n        range = data.range || data.firstRange;\n        \n        if (range) {\n            row = range.start.row;\n            var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n            if (fold) {\n                this.removeFold(fold);\n            } else {\n                this.addFold(\"...\", range);\n            }\n        }\n    };\n\n    this.updateFoldWidgets = function(delta) {\n        var firstRow = delta.start.row;\n        var len = delta.end.row - firstRow;\n\n        if (len === 0) {\n            this.foldWidgets[firstRow] = null;\n        } else if (delta.action == 'remove') {\n            this.foldWidgets.splice(firstRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(firstRow, 1);\n            this.foldWidgets.splice.apply(this.foldWidgets, args);\n        }\n    };\n    this.tokenizerUpdateFoldWidgets = function(e) {\n        var rows = e.data;\n        if (rows.first != rows.last) {\n            if (this.foldWidgets.length > rows.first)\n                this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n        }\n    };\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n    this.findMatchingBracket = function(position, chr) {\n        if (position.column == 0) return null;\n\n        var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n        if (charBeforeCursor == \"\") return null;\n\n        var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match)\n            return null;\n\n        if (match[1])\n            return this.$findClosingBracket(match[1], position);\n        else\n            return this.$findOpeningBracket(match[2], position);\n    };\n    \n    this.getBracketRange = function(pos) {\n        var line = this.getLine(pos.row);\n        var before = true, range;\n\n        var chr = line.charAt(pos.column-1);\n        var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match) {\n            chr = line.charAt(pos.column);\n            pos = {row: pos.row, column: pos.column + 1};\n            match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n            before = false;\n        }\n        if (!match)\n            return null;\n\n        if (match[1]) {\n            var bracketPos = this.$findClosingBracket(match[1], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(pos, bracketPos);\n            if (!before) {\n                range.end.column++;\n                range.start.column--;\n            }\n            range.cursor = range.end;\n        } else {\n            var bracketPos = this.$findOpeningBracket(match[2], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(bracketPos, pos);\n            if (!before) {\n                range.start.column++;\n                range.end.column--;\n            }\n            range.cursor = range.start;\n        }\n        \n        return range;\n    };\n\n    this.$brackets = {\n        \")\": \"(\",\n        \"(\": \")\",\n        \"]\": \"[\",\n        \"[\": \"]\",\n        \"{\": \"}\",\n        \"}\": \"{\"\n    };\n\n    this.$findOpeningBracket = function(bracket, position, typeRe) {\n        var openBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n        \n         if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n                    .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n                + \")+\"\n            );\n        }\n        var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n        var value = token.value;\n        \n        while (true) {\n        \n            while (valueIndex >= 0) {\n                var chr = value.charAt(valueIndex);\n                if (chr == openBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex -= 1;\n            }\n            do {\n                token = iterator.stepBackward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n                \n            value = token.value;\n            valueIndex = value.length - 1;\n        }\n        \n        return null;\n    };\n\n    this.$findClosingBracket = function(bracket, position, typeRe) {\n        var closingBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n\n        if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n                    .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n                + \")+\"\n            );\n        }\n        var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n        while (true) {\n\n            var value = token.value;\n            var valueLength = value.length;\n            while (valueIndex < valueLength) {\n                var chr = value.charAt(valueIndex);\n                if (chr == closingBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex += 1;\n            }\n            do {\n                token = iterator.stepForward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n\n            valueIndex = 0;\n        }\n        \n        return null;\n    };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar config = acequire(\"./config\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Selection = acequire(\"./selection\").Selection;\nvar TextMode = acequire(\"./mode/text\").Mode;\nvar Range = acequire(\"./range\").Range;\nvar Document = acequire(\"./document\").Document;\nvar BackgroundTokenizer = acequire(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = acequire(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n    this.$breakpoints = [];\n    this.$decorations = [];\n    this.$frontMarkers = {};\n    this.$backMarkers = {};\n    this.$markerId = 1;\n    this.$undoSelect = true;\n\n    this.$foldData = [];\n    this.id = \"session\" + (++EditSession.$uid);\n    this.$foldData.toString = function() {\n        return this.join(\"\\n\");\n    };\n    this.on(\"changeFold\", this.onChangeFold.bind(this));\n    this.$onChange = this.onChange.bind(this);\n\n    if (typeof text != \"object\" || !text.getLine)\n        text = new Document(text);\n\n    this.setDocument(text);\n    this.selection = new Selection(this);\n\n    config.resetOptions(this);\n    this.setMode(mode);\n    config._signal(\"session\", this);\n};\n\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setDocument = function(doc) {\n        if (this.doc)\n            this.doc.removeListener(\"change\", this.$onChange);\n\n        this.doc = doc;\n        doc.on(\"change\", this.$onChange);\n\n        if (this.bgTokenizer)\n            this.bgTokenizer.setDocument(this.getDocument());\n\n        this.resetCaches();\n    };\n    this.getDocument = function() {\n        return this.doc;\n    };\n    this.$resetRowCache = function(docRow) {\n        if (!docRow) {\n            this.$docRowCache = [];\n            this.$screenRowCache = [];\n            return;\n        }\n        var l = this.$docRowCache.length;\n        var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n        if (l > i) {\n            this.$docRowCache.splice(i, l);\n            this.$screenRowCache.splice(i, l);\n        }\n    };\n\n    this.$getRowCacheIndex = function(cacheArray, val) {\n        var low = 0;\n        var hi = cacheArray.length - 1;\n\n        while (low <= hi) {\n            var mid = (low + hi) >> 1;\n            var c = cacheArray[mid];\n\n            if (val > c)\n                low = mid + 1;\n            else if (val < c)\n                hi = mid - 1;\n            else\n                return mid;\n        }\n\n        return low -1;\n    };\n\n    this.resetCaches = function() {\n        this.$modified = true;\n        this.$wrapData = [];\n        this.$rowLengthCache = [];\n        this.$resetRowCache(0);\n        if (this.bgTokenizer)\n            this.bgTokenizer.start(0);\n    };\n\n    this.onChangeFold = function(e) {\n        var fold = e.data;\n        this.$resetRowCache(fold.start.row);\n    };\n\n    this.onChange = function(delta) {\n        this.$modified = true;\n\n        this.$resetRowCache(delta.start.row);\n\n        var removedFolds = this.$updateInternalDataOnChange(delta);\n        if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n            this.$deltasDoc.push(delta);\n            if (removedFolds && removedFolds.length != 0) {\n                this.$deltasFold.push({\n                    action: \"removeFolds\",\n                    folds:  removedFolds\n                });\n            }\n\n            this.$informUndoManager.schedule();\n        }\n\n        this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n        this._signal(\"change\", delta);\n    };\n    this.setValue = function(text) {\n        this.doc.setValue(text);\n        this.selection.moveTo(0, 0);\n\n        this.$resetRowCache(0);\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n        this.setUndoManager(this.$undoManager);\n        this.getUndoManager().reset();\n    };\n    this.getValue =\n    this.toString = function() {\n        return this.doc.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.getState = function(row) {\n        return this.bgTokenizer.getState(row);\n    };\n    this.getTokens = function(row) {\n        return this.bgTokenizer.getTokens(row);\n    };\n    this.getTokenAt = function(row, column) {\n        var tokens = this.bgTokenizer.getTokens(row);\n        var token, c = 0;\n        if (column == null) {\n            i = tokens.length - 1;\n            c = this.getLine(row).length;\n        } else {\n            for (var i = 0; i < tokens.length; i++) {\n                c += tokens[i].value.length;\n                if (c >= column)\n                    break;\n            }\n        }\n        token = tokens[i];\n        if (!token)\n            return null;\n        token.index = i;\n        token.start = c - token.value.length;\n        return token;\n    };\n    this.setUndoManager = function(undoManager) {\n        this.$undoManager = undoManager;\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n\n        if (this.$informUndoManager)\n            this.$informUndoManager.cancel();\n\n        if (undoManager) {\n            var self = this;\n\n            this.$syncInformUndoManager = function() {\n                self.$informUndoManager.cancel();\n\n                if (self.$deltasFold.length) {\n                    self.$deltas.push({\n                        group: \"fold\",\n                        deltas: self.$deltasFold\n                    });\n                    self.$deltasFold = [];\n                }\n\n                if (self.$deltasDoc.length) {\n                    self.$deltas.push({\n                        group: \"doc\",\n                        deltas: self.$deltasDoc\n                    });\n                    self.$deltasDoc = [];\n                }\n\n                if (self.$deltas.length > 0) {\n                    undoManager.execute({\n                        action: \"aceupdate\",\n                        args: [self.$deltas, self],\n                        merge: self.mergeUndoDeltas\n                    });\n                }\n                self.mergeUndoDeltas = false;\n                self.$deltas = [];\n            };\n            this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n        }\n    };\n    this.markUndoGroup = function() {\n        if (this.$syncInformUndoManager)\n            this.$syncInformUndoManager();\n    };\n    \n    this.$defaultUndoManager = {\n        undo: function() {},\n        redo: function() {},\n        reset: function() {}\n    };\n    this.getUndoManager = function() {\n        return this.$undoManager || this.$defaultUndoManager;\n    };\n    this.getTabString = function() {\n        if (this.getUseSoftTabs()) {\n            return lang.stringRepeat(\" \", this.getTabSize());\n        } else {\n            return \"\\t\";\n        }\n    };\n    this.setUseSoftTabs = function(val) {\n        this.setOption(\"useSoftTabs\", val);\n    };\n    this.getUseSoftTabs = function() {\n        return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n    };\n    this.setTabSize = function(tabSize) {\n        this.setOption(\"tabSize\", tabSize);\n    };\n    this.getTabSize = function() {\n        return this.$tabSize;\n    };\n    this.isTabStop = function(position) {\n        return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n    };\n\n    this.$overwrite = false;\n    this.setOverwrite = function(overwrite) {\n        this.setOption(\"overwrite\", overwrite);\n    };\n    this.getOverwrite = function() {\n        return this.$overwrite;\n    };\n    this.toggleOverwrite = function() {\n        this.setOverwrite(!this.$overwrite);\n    };\n    this.addGutterDecoration = function(row, className) {\n        if (!this.$decorations[row])\n            this.$decorations[row] = \"\";\n        this.$decorations[row] += \" \" + className;\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.removeGutterDecoration = function(row, className) {\n        this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.getBreakpoints = function() {\n        return this.$breakpoints;\n    };\n    this.setBreakpoints = function(rows) {\n        this.$breakpoints = [];\n        for (var i=0; i<rows.length; i++) {\n            this.$breakpoints[rows[i]] = \"ace_breakpoint\";\n        }\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoints = function() {\n        this.$breakpoints = [];\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.setBreakpoint = function(row, className) {\n        if (className === undefined)\n            className = \"ace_breakpoint\";\n        if (className)\n            this.$breakpoints[row] = className;\n        else\n            delete this.$breakpoints[row];\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoint = function(row) {\n        delete this.$breakpoints[row];\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.addMarker = function(range, clazz, type, inFront) {\n        var id = this.$markerId++;\n\n        var marker = {\n            range : range,\n            type : type || \"line\",\n            renderer: typeof type == \"function\" ? type : null,\n            clazz : clazz,\n            inFront: !!inFront,\n            id: id\n        };\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._signal(\"changeFrontMarker\");\n        } else {\n            this.$backMarkers[id] = marker;\n            this._signal(\"changeBackMarker\");\n        }\n\n        return id;\n    };\n    this.addDynamicMarker = function(marker, inFront) {\n        if (!marker.update)\n            return;\n        var id = this.$markerId++;\n        marker.id = id;\n        marker.inFront = !!inFront;\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._signal(\"changeFrontMarker\");\n        } else {\n            this.$backMarkers[id] = marker;\n            this._signal(\"changeBackMarker\");\n        }\n\n        return marker;\n    };\n    this.removeMarker = function(markerId) {\n        var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];\n        if (!marker)\n            return;\n\n        var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;\n        if (marker) {\n            delete (markers[markerId]);\n            this._signal(marker.inFront ? \"changeFrontMarker\" : \"changeBackMarker\");\n        }\n    };\n    this.getMarkers = function(inFront) {\n        return inFront ? this.$frontMarkers : this.$backMarkers;\n    };\n\n    this.highlight = function(re) {\n        if (!this.$searchHighlight) {\n            var highlight = new SearchHighlight(null, \"ace_selected-word\", \"text\");\n            this.$searchHighlight = this.addDynamicMarker(highlight);\n        }\n        this.$searchHighlight.setRegexp(re);\n    };\n    this.highlightLines = function(startRow, endRow, clazz, inFront) {\n        if (typeof endRow != \"number\") {\n            clazz = endRow;\n            endRow = startRow;\n        }\n        if (!clazz)\n            clazz = \"ace_step\";\n\n        var range = new Range(startRow, 0, endRow, Infinity);\n        range.id = this.addMarker(range, clazz, \"fullLine\", inFront);\n        return range;\n    };\n    this.setAnnotations = function(annotations) {\n        this.$annotations = annotations;\n        this._signal(\"changeAnnotation\", {});\n    };\n    this.getAnnotations = function() {\n        return this.$annotations || [];\n    };\n    this.clearAnnotations = function() {\n        this.setAnnotations([]);\n    };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r?\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getWordRange = function(row, column) {\n        var line = this.getLine(row);\n\n        var inToken = false;\n        if (column > 0)\n            inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n        if (!inToken)\n            inToken = !!line.charAt(column).match(this.tokenRe);\n\n        if (inToken)\n            var re = this.tokenRe;\n        else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n            var re = /\\s/;\n        else\n            var re = this.nonTokenRe;\n\n        var start = column;\n        if (start > 0) {\n            do {\n                start--;\n            }\n            while (start >= 0 && line.charAt(start).match(re));\n            start++;\n        }\n\n        var end = column;\n        while (end < line.length && line.charAt(end).match(re)) {\n            end++;\n        }\n\n        return new Range(row, start, row, end);\n    };\n    this.getAWordRange = function(row, column) {\n        var wordRange = this.getWordRange(row, column);\n        var line = this.getLine(wordRange.end.row);\n\n        while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n            wordRange.end.column += 1;\n        }\n        return wordRange;\n    };\n    this.setNewLineMode = function(newLineMode) {\n        this.doc.setNewLineMode(newLineMode);\n    };\n    this.getNewLineMode = function() {\n        return this.doc.getNewLineMode();\n    };\n    this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n    this.getUseWorker = function() { return this.$useWorker; };\n    this.onReloadTokenizer = function(e) {\n        var rows = e.data;\n        this.bgTokenizer.start(rows.first);\n        this._signal(\"tokenizerUpdate\", e);\n    };\n\n    this.$modes = {};\n    this.$mode = null;\n    this.$modeId = null;\n    this.setMode = function(mode, cb) {\n        if (mode && typeof mode === \"object\") {\n            if (mode.getTokenizer)\n                return this.$onChangeMode(mode);\n            var options = mode;\n            var path = options.path;\n        } else {\n            path = mode || \"ace/mode/text\";\n        }\n        if (!this.$modes[\"ace/mode/text\"])\n            this.$modes[\"ace/mode/text\"] = new TextMode();\n\n        if (this.$modes[path] && !options) {\n            this.$onChangeMode(this.$modes[path]);\n            cb && cb();\n            return;\n        }\n        this.$modeId = path;\n        config.loadModule([\"mode\", path], function(m) {\n            if (this.$modeId !== path)\n                return cb && cb();\n            if (this.$modes[path] && !options) {\n                this.$onChangeMode(this.$modes[path]);\n            } else if (m && m.Mode) {\n                m = new m.Mode(options);\n                if (!options) {\n                    this.$modes[path] = m;\n                    m.$id = path;\n                }\n                this.$onChangeMode(m);\n            }\n            cb && cb();\n        }.bind(this));\n        if (!this.$mode)\n            this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n    };\n\n    this.$onChangeMode = function(mode, $isPlaceholder) {\n        if (!$isPlaceholder)\n            this.$modeId = mode.$id;\n        if (this.$mode === mode) \n            return;\n\n        this.$mode = mode;\n\n        this.$stopWorker();\n\n        if (this.$useWorker)\n            this.$startWorker();\n\n        var tokenizer = mode.getTokenizer();\n\n        if(tokenizer.addEventListener !== undefined) {\n            var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n            tokenizer.addEventListener(\"update\", onReloadTokenizer);\n        }\n\n        if (!this.bgTokenizer) {\n            this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n            var _self = this;\n            this.bgTokenizer.addEventListener(\"update\", function(e) {\n                _self._signal(\"tokenizerUpdate\", e);\n            });\n        } else {\n            this.bgTokenizer.setTokenizer(tokenizer);\n        }\n\n        this.bgTokenizer.setDocument(this.getDocument());\n\n        this.tokenRe = mode.tokenRe;\n        this.nonTokenRe = mode.nonTokenRe;\n\n        \n        if (!$isPlaceholder) {\n            if (mode.attachToSession)\n                mode.attachToSession(this);\n            this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n            this.$setFolding(mode.foldingRules);\n            this.bgTokenizer.start(0);\n            this._emit(\"changeMode\");\n        }\n    };\n\n    this.$stopWorker = function() {\n        if (this.$worker) {\n            this.$worker.terminate();\n            this.$worker = null;\n        }\n    };\n\n    this.$startWorker = function() {\n        try {\n            this.$worker = this.$mode.createWorker(this);\n        } catch (e) {\n            config.warn(\"Could not load worker\", e);\n            this.$worker = null;\n        }\n    };\n    this.getMode = function() {\n        return this.$mode;\n    };\n\n    this.$scrollTop = 0;\n    this.setScrollTop = function(scrollTop) {\n        if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n            return;\n\n        this.$scrollTop = scrollTop;\n        this._signal(\"changeScrollTop\", scrollTop);\n    };\n    this.getScrollTop = function() {\n        return this.$scrollTop;\n    };\n\n    this.$scrollLeft = 0;\n    this.setScrollLeft = function(scrollLeft) {\n        if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n            return;\n\n        this.$scrollLeft = scrollLeft;\n        this._signal(\"changeScrollLeft\", scrollLeft);\n    };\n    this.getScrollLeft = function() {\n        return this.$scrollLeft;\n    };\n    this.getScreenWidth = function() {\n        this.$computeWidth();\n        if (this.lineWidgets) \n            return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n        return this.screenWidth;\n    };\n    \n    this.getLineWidgetMaxWidth = function() {\n        if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n        var width = 0;\n        this.lineWidgets.forEach(function(w) {\n            if (w && w.screenWidth > width)\n                width = w.screenWidth;\n        });\n        return this.lineWidgetWidth = width;\n    };\n\n    this.$computeWidth = function(force) {\n        if (this.$modified || force) {\n            this.$modified = false;\n\n            if (this.$useWrapMode)\n                return this.screenWidth = this.$wrapLimit;\n\n            var lines = this.doc.getAllLines();\n            var cache = this.$rowLengthCache;\n            var longestScreenLine = 0;\n            var foldIndex = 0;\n            var foldLine = this.$foldData[foldIndex];\n            var foldStart = foldLine ? foldLine.start.row : Infinity;\n            var len = lines.length;\n\n            for (var i = 0; i < len; i++) {\n                if (i > foldStart) {\n                    i = foldLine.end.row + 1;\n                    if (i >= len)\n                        break;\n                    foldLine = this.$foldData[foldIndex++];\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n\n                if (cache[i] == null)\n                    cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n                if (cache[i] > longestScreenLine)\n                    longestScreenLine = cache[i];\n            }\n            this.screenWidth = longestScreenLine;\n        }\n    };\n    this.getLine = function(row) {\n        return this.doc.getLine(row);\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.doc.getLines(firstRow, lastRow);\n    };\n    this.getLength = function() {\n        return this.doc.getLength();\n    };\n    this.getTextRange = function(range) {\n        return this.doc.getTextRange(range || this.selection.getRange());\n    };\n    this.insert = function(position, text) {\n        return this.doc.insert(position, text);\n    };\n    this.remove = function(range) {\n        return this.doc.remove(range);\n    };\n    this.removeFullLines = function(firstRow, lastRow){\n        return this.doc.removeFullLines(firstRow, lastRow);\n    };\n    this.undoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = deltas.length - 1; i != -1; i--) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.revertDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n            } else {\n                delta.deltas.forEach(function(foldDelta) {\n                    this.addFolds(foldDelta.folds);\n                }, this);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.redoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = 0; i < deltas.length; i++) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.applyDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.setUndoSelect = function(enable) {\n        this.$undoSelect = enable;\n    };\n\n    this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n        function isInsert(delta) {\n            return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n        }\n\n        var delta = deltas[0];\n        var range, point;\n        var lastDeltaIsInsert = false;\n        if (isInsert(delta)) {\n            range = Range.fromPoints(delta.start, delta.end);\n            lastDeltaIsInsert = true;\n        } else {\n            range = Range.fromPoints(delta.start, delta.start);\n            lastDeltaIsInsert = false;\n        }\n\n        for (var i = 1; i < deltas.length; i++) {\n            delta = deltas[i];\n            if (isInsert(delta)) {\n                point = delta.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range.setStart(point);\n                }\n                point = delta.end;\n                if (range.compare(point.row, point.column) == 1) {\n                    range.setEnd(point);\n                }\n                lastDeltaIsInsert = true;\n            } else {\n                point = delta.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range = Range.fromPoints(delta.start, delta.start);\n                }\n                lastDeltaIsInsert = false;\n            }\n        }\n        if (lastUndoRange != null) {\n            if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n                lastUndoRange.start.column += range.end.column - range.start.column;\n                lastUndoRange.end.column += range.end.column - range.start.column;\n            }\n\n            var cmp = lastUndoRange.compareRange(range);\n            if (cmp == 1) {\n                range.setStart(lastUndoRange.start);\n            } else if (cmp == -1) {\n                range.setEnd(lastUndoRange.end);\n            }\n        }\n\n        return range;\n    };\n    this.replace = function(range, text) {\n        return this.doc.replace(range, text);\n    };\n    this.moveText = function(fromRange, toPosition, copy) {\n        var text = this.getTextRange(fromRange);\n        var folds = this.getFoldsInRange(fromRange);\n\n        var toRange = Range.fromPoints(toPosition, toPosition);\n        if (!copy) {\n            this.remove(fromRange);\n            var rowDiff = fromRange.start.row - fromRange.end.row;\n            var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n            if (collDiff) {\n                if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n                    toRange.start.column += collDiff;\n                if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n                    toRange.end.column += collDiff;\n            }\n            if (rowDiff && toRange.start.row >= fromRange.end.row) {\n                toRange.start.row += rowDiff;\n                toRange.end.row += rowDiff;\n            }\n        }\n\n        toRange.end = this.insert(toRange.start, text);\n        if (folds.length) {\n            var oldStart = fromRange.start;\n            var newStart = toRange.start;\n            var rowDiff = newStart.row - oldStart.row;\n            var collDiff = newStart.column - oldStart.column;\n            this.addFolds(folds.map(function(x) {\n                x = x.clone();\n                if (x.start.row == oldStart.row)\n                    x.start.column += collDiff;\n                if (x.end.row == oldStart.row)\n                    x.end.column += collDiff;\n                x.start.row += rowDiff;\n                x.end.row += rowDiff;\n                return x;\n            }));\n        }\n\n        return toRange;\n    };\n    this.indentRows = function(startRow, endRow, indentString) {\n        indentString = indentString.replace(/\\t/g, this.getTabString());\n        for (var row=startRow; row<=endRow; row++)\n            this.doc.insertInLine({row: row, column: 0}, indentString);\n    };\n    this.outdentRows = function (range) {\n        var rowRange = range.collapseRows();\n        var deleteRange = new Range(0, 0, 0, 0);\n        var size = this.getTabSize();\n\n        for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n            var line = this.getLine(i);\n\n            deleteRange.start.row = i;\n            deleteRange.end.row = i;\n            for (var j = 0; j < size; ++j)\n                if (line.charAt(j) != ' ')\n                    break;\n            if (j < size && line.charAt(j) == '\\t') {\n                deleteRange.start.column = j;\n                deleteRange.end.column = j + 1;\n            } else {\n                deleteRange.start.column = 0;\n                deleteRange.end.column = j;\n            }\n            this.remove(deleteRange);\n        }\n    };\n\n    this.$moveLines = function(firstRow, lastRow, dir) {\n        firstRow = this.getRowFoldStart(firstRow);\n        lastRow = this.getRowFoldEnd(lastRow);\n        if (dir < 0) {\n            var row = this.getRowFoldStart(firstRow + dir);\n            if (row < 0) return 0;\n            var diff = row-firstRow;\n        } else if (dir > 0) {\n            var row = this.getRowFoldEnd(lastRow + dir);\n            if (row > this.doc.getLength()-1) return 0;\n            var diff = row-lastRow;\n        } else {\n            firstRow = this.$clipRowToDocument(firstRow);\n            lastRow = this.$clipRowToDocument(lastRow);\n            var diff = lastRow - firstRow + 1;\n        }\n\n        var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n        var folds = this.getFoldsInRange(range).map(function(x){\n            x = x.clone();\n            x.start.row += diff;\n            x.end.row += diff;\n            return x;\n        });\n        \n        var lines = dir == 0\n            ? this.doc.getLines(firstRow, lastRow)\n            : this.doc.removeFullLines(firstRow, lastRow);\n        this.doc.insertFullLines(firstRow+diff, lines);\n        folds.length && this.addFolds(folds);\n        return diff;\n    };\n    this.moveLinesUp = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, -1);\n    };\n    this.moveLinesDown = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, 1);\n    };\n    this.duplicateLines = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, 0);\n    };\n\n\n    this.$clipRowToDocument = function(row) {\n        return Math.max(0, Math.min(row, this.doc.getLength()-1));\n    };\n\n    this.$clipColumnToRow = function(row, column) {\n        if (column < 0)\n            return 0;\n        return Math.min(this.doc.getLine(row).length, column);\n    };\n\n\n    this.$clipPositionToDocument = function(row, column) {\n        column = Math.max(0, column);\n\n        if (row < 0) {\n            row = 0;\n            column = 0;\n        } else {\n            var len = this.doc.getLength();\n            if (row >= len) {\n                row = len - 1;\n                column = this.doc.getLine(len-1).length;\n            } else {\n                column = Math.min(this.doc.getLine(row).length, column);\n            }\n        }\n\n        return {\n            row: row,\n            column: column\n        };\n    };\n\n    this.$clipRangeToDocument = function(range) {\n        if (range.start.row < 0) {\n            range.start.row = 0;\n            range.start.column = 0;\n        } else {\n            range.start.column = this.$clipColumnToRow(\n                range.start.row,\n                range.start.column\n            );\n        }\n\n        var len = this.doc.getLength() - 1;\n        if (range.end.row > len) {\n            range.end.row = len;\n            range.end.column = this.doc.getLine(len).length;\n        } else {\n            range.end.column = this.$clipColumnToRow(\n                range.end.row,\n                range.end.column\n            );\n        }\n        return range;\n    };\n    this.$wrapLimit = 80;\n    this.$useWrapMode = false;\n    this.$wrapLimitRange = {\n        min : null,\n        max : null\n    };\n    this.setUseWrapMode = function(useWrapMode) {\n        if (useWrapMode != this.$useWrapMode) {\n            this.$useWrapMode = useWrapMode;\n            this.$modified = true;\n            this.$resetRowCache(0);\n            if (useWrapMode) {\n                var len = this.getLength();\n                this.$wrapData = Array(len);\n                this.$updateWrapData(0, len - 1);\n            }\n\n            this._signal(\"changeWrapMode\");\n        }\n    };\n    this.getUseWrapMode = function() {\n        return this.$useWrapMode;\n    };\n    this.setWrapLimitRange = function(min, max) {\n        if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n            this.$wrapLimitRange = { min: min, max: max };\n            this.$modified = true;\n            if (this.$useWrapMode)\n                this._signal(\"changeWrapMode\");\n        }\n    };\n    this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n        var limits = this.$wrapLimitRange;\n        if (limits.max < 0)\n            limits = {min: $printMargin, max: $printMargin};\n        var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n        if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n            this.$wrapLimit = wrapLimit;\n            this.$modified = true;\n            if (this.$useWrapMode) {\n                this.$updateWrapData(0, this.getLength() - 1);\n                this.$resetRowCache(0);\n                this._signal(\"changeWrapLimit\");\n            }\n            return true;\n        }\n        return false;\n    };\n\n    this.$constrainWrapLimit = function(wrapLimit, min, max) {\n        if (min)\n            wrapLimit = Math.max(min, wrapLimit);\n\n        if (max)\n            wrapLimit = Math.min(max, wrapLimit);\n\n        return wrapLimit;\n    };\n    this.getWrapLimit = function() {\n        return this.$wrapLimit;\n    };\n    this.setWrapLimit = function (limit) {\n        this.setWrapLimitRange(limit, limit);\n    };\n    this.getWrapLimitRange = function() {\n        return {\n            min : this.$wrapLimitRange.min,\n            max : this.$wrapLimitRange.max\n        };\n    };\n\n    this.$updateInternalDataOnChange = function(delta) {\n        var useWrapMode = this.$useWrapMode;\n        var action = delta.action;\n        var start = delta.start;\n        var end = delta.end;\n        var firstRow = start.row;\n        var lastRow = end.row;\n        var len = lastRow - firstRow;\n        var removedFolds = null;\n        \n        this.$updating = true;\n        if (len != 0) {\n            if (action === \"remove\") {\n                this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n                var foldLines = this.$foldData;\n                removedFolds = this.getFoldsInRange(delta);\n                this.removeFolds(removedFolds);\n\n                var foldLine = this.getFoldLine(end.row);\n                var idx = 0;\n                if (foldLine) {\n                    foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n                    foldLine.shiftRow(-len);\n\n                    var foldLineBefore = this.getFoldLine(firstRow);\n                    if (foldLineBefore && foldLineBefore !== foldLine) {\n                        foldLineBefore.merge(foldLine);\n                        foldLine = foldLineBefore;\n                    }\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= end.row) {\n                        foldLine.shiftRow(-len);\n                    }\n                }\n\n                lastRow = firstRow;\n            } else {\n                var args = Array(len);\n                args.unshift(firstRow, 0);\n                var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache\n                arr.splice.apply(arr, args);\n                var foldLines = this.$foldData;\n                var foldLine = this.getFoldLine(firstRow);\n                var idx = 0;\n                if (foldLine) {\n                    var cmp = foldLine.range.compareInside(start.row, start.column);\n                    if (cmp == 0) {\n                        foldLine = foldLine.split(start.row, start.column);\n                        if (foldLine) {\n                            foldLine.shiftRow(len);\n                            foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n                        }\n                    } else\n                    if (cmp == -1) {\n                        foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n                        foldLine.shiftRow(len);\n                    }\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= firstRow) {\n                        foldLine.shiftRow(len);\n                    }\n                }\n            }\n        } else {\n            len = Math.abs(delta.start.column - delta.end.column);\n            if (action === \"remove\") {\n                removedFolds = this.getFoldsInRange(delta);\n                this.removeFolds(removedFolds);\n\n                len = -len;\n            }\n            var foldLine = this.getFoldLine(firstRow);\n            if (foldLine) {\n                foldLine.addRemoveChars(firstRow, start.column, len);\n            }\n        }\n\n        if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n            console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n        }\n        this.$updating = false;\n\n        if (useWrapMode)\n            this.$updateWrapData(firstRow, lastRow);\n        else\n            this.$updateRowLengthCache(firstRow, lastRow);\n\n        return removedFolds;\n    };\n\n    this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n        this.$rowLengthCache[firstRow] = null;\n        this.$rowLengthCache[lastRow] = null;\n    };\n\n    this.$updateWrapData = function(firstRow, lastRow) {\n        var lines = this.doc.getAllLines();\n        var tabSize = this.getTabSize();\n        var wrapData = this.$wrapData;\n        var wrapLimit = this.$wrapLimit;\n        var tokens;\n        var foldLine;\n\n        var row = firstRow;\n        lastRow = Math.min(lastRow, lines.length - 1);\n        while (row <= lastRow) {\n            foldLine = this.getFoldLine(row, foldLine);\n            if (!foldLine) {\n                tokens = this.$getDisplayTokens(lines[row]);\n                wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row ++;\n            } else {\n                tokens = [];\n                foldLine.walk(function(placeholder, row, column, lastColumn) {\n                        var walkTokens;\n                        if (placeholder != null) {\n                            walkTokens = this.$getDisplayTokens(\n                                            placeholder, tokens.length);\n                            walkTokens[0] = PLACEHOLDER_START;\n                            for (var i = 1; i < walkTokens.length; i++) {\n                                walkTokens[i] = PLACEHOLDER_BODY;\n                            }\n                        } else {\n                            walkTokens = this.$getDisplayTokens(\n                                lines[row].substring(lastColumn, column),\n                                tokens.length);\n                        }\n                        tokens = tokens.concat(walkTokens);\n                    }.bind(this),\n                    foldLine.end.row,\n                    lines[foldLine.end.row].length + 1\n                );\n\n                wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row = foldLine.end.row + 1;\n            }\n        }\n    };\n    var CHAR = 1,\n        CHAR_EXT = 2,\n        PLACEHOLDER_START = 3,\n        PLACEHOLDER_BODY =  4,\n        PUNCTUATION = 9,\n        SPACE = 10,\n        TAB = 11,\n        TAB_SPACE = 12;\n\n\n    this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {\n        if (tokens.length == 0) {\n            return [];\n        }\n\n        var splits = [];\n        var displayLength = tokens.length;\n        var lastSplit = 0, lastDocSplit = 0;\n\n        var isCode = this.$wrapAsCode;\n\n        var indentedSoftWrap = this.$indentedSoftWrap;\n        var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n            || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n        function getWrapIndent() {\n            var indentation = 0;\n            if (maxIndent === 0)\n                return indentation;\n            if (indentedSoftWrap) {\n                for (var i = 0; i < tokens.length; i++) {\n                    var token = tokens[i];\n                    if (token == SPACE)\n                        indentation += 1;\n                    else if (token == TAB)\n                        indentation += tabSize;\n                    else if (token == TAB_SPACE)\n                        continue;\n                    else\n                        break;\n                }\n            }\n            if (isCode && indentedSoftWrap !== false)\n                indentation += tabSize;\n            return Math.min(indentation, maxIndent);\n        }\n        function addSplit(screenPos) {\n            var displayed = tokens.slice(lastSplit, screenPos);\n            var len = displayed.length;\n            displayed.join(\"\")\n                .replace(/12/g, function() {\n                    len -= 1;\n                })\n                .replace(/2/g, function() {\n                    len -= 1;\n                });\n\n            if (!splits.length) {\n                indent = getWrapIndent();\n                splits.indent = indent;\n            }\n            lastDocSplit += len;\n            splits.push(lastDocSplit);\n            lastSplit = screenPos;\n        }\n        var indent = 0;\n        while (displayLength - lastSplit > wrapLimit - indent) {\n            var split = lastSplit + wrapLimit - indent;\n            if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n                addSplit(split);\n                continue;\n            }\n            if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n                for (split; split != lastSplit - 1; split--) {\n                    if (tokens[split] == PLACEHOLDER_START) {\n                        break;\n                    }\n                }\n                if (split > lastSplit) {\n                    addSplit(split);\n                    continue;\n                }\n                split = lastSplit + wrapLimit;\n                for (split; split < tokens.length; split++) {\n                    if (tokens[split] != PLACEHOLDER_BODY) {\n                        break;\n                    }\n                }\n                if (split == tokens.length) {\n                    break;  // Breaks the while-loop.\n                }\n                addSplit(split);\n                continue;\n            }\n            var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);\n            while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n                split --;\n            }\n            if (isCode) {\n                while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n                    split --;\n                }\n                while (split > minSplit && tokens[split] == PUNCTUATION) {\n                    split --;\n                }\n            } else {\n                while (split > minSplit && tokens[split] < SPACE) {\n                    split --;\n                }\n            }\n            if (split > minSplit) {\n                addSplit(++split);\n                continue;\n            }\n            split = lastSplit + wrapLimit;\n            if (tokens[split] == CHAR_EXT)\n                split--;\n            addSplit(split - indent);\n        }\n        return splits;\n    };\n    this.$getDisplayTokens = function(str, offset) {\n        var arr = [];\n        var tabSize;\n        offset = offset || 0;\n\n        for (var i = 0; i < str.length; i++) {\n            var c = str.charCodeAt(i);\n            if (c == 9) {\n                tabSize = this.getScreenTabSize(arr.length + offset);\n                arr.push(TAB);\n                for (var n = 1; n < tabSize; n++) {\n                    arr.push(TAB_SPACE);\n                }\n            }\n            else if (c == 32) {\n                arr.push(SPACE);\n            } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n                arr.push(PUNCTUATION);\n            }\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                arr.push(CHAR, CHAR_EXT);\n            } else {\n                arr.push(CHAR);\n            }\n        }\n        return arr;\n    };\n    this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n        if (maxScreenColumn == 0)\n            return [0, 0];\n        if (maxScreenColumn == null)\n            maxScreenColumn = Infinity;\n        screenColumn = screenColumn || 0;\n\n        var c, column;\n        for (column = 0; column < str.length; column++) {\n            c = str.charCodeAt(column);\n            if (c == 9) {\n                screenColumn += this.getScreenTabSize(screenColumn);\n            }\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                screenColumn += 2;\n            } else {\n                screenColumn += 1;\n            }\n            if (screenColumn > maxScreenColumn) {\n                break;\n            }\n        }\n\n        return [screenColumn, column];\n    };\n\n    this.lineWidgets = null;\n    this.getRowLength = function(row) {\n        if (this.lineWidgets)\n            var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n        else \n            h = 0\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1 + h;\n        } else {\n            return this.$wrapData[row].length + 1 + h;\n        }\n    };\n    this.getRowLineCount = function(row) {\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1;\n        } else {\n            return this.$wrapData[row].length + 1;\n        }\n    };\n\n    this.getRowWrapIndent = function(screenRow) {\n        if (this.$useWrapMode) {\n            var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n            var splits = this.$wrapData[pos.row];\n            return splits.length && splits[0] < pos.column ? splits.indent : 0;\n        } else {\n            return 0;\n        }\n    }\n    this.getScreenLastRowColumn = function(screenRow) {\n        var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n        return this.documentToScreenColumn(pos.row, pos.column);\n    };\n    this.getDocumentLastRowColumn = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.getScreenLastRowColumn(screenRow);\n    };\n    this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n    };\n    this.getRowSplitData = function(row) {\n        if (!this.$useWrapMode) {\n            return undefined;\n        } else {\n            return this.$wrapData[row];\n        }\n    };\n    this.getScreenTabSize = function(screenColumn) {\n        return this.$tabSize - screenColumn % this.$tabSize;\n    };\n\n\n    this.screenToDocumentRow = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).row;\n    };\n\n\n    this.screenToDocumentColumn = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).column;\n    };\n    this.screenToDocumentPosition = function(screenRow, screenColumn) {\n        if (screenRow < 0)\n            return {row: 0, column: 0};\n\n        var line;\n        var docRow = 0;\n        var docColumn = 0;\n        var column;\n        var row = 0;\n        var rowLength = 0;\n\n        var rowCache = this.$screenRowCache;\n        var i = this.$getRowCacheIndex(rowCache, screenRow);\n        var l = rowCache.length;\n        if (l && i >= 0) {\n            var row = rowCache[i];\n            var docRow = this.$docRowCache[i];\n            var doCache = screenRow > rowCache[l - 1];\n        } else {\n            var doCache = !l;\n        }\n\n        var maxRow = this.getLength() - 1;\n        var foldLine = this.getNextFoldLine(docRow);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (row <= screenRow) {\n            rowLength = this.getRowLength(docRow);\n            if (row + rowLength > screenRow || docRow >= maxRow) {\n                break;\n            } else {\n                row += rowLength;\n                docRow++;\n                if (docRow > foldStart) {\n                    docRow = foldLine.end.row+1;\n                    foldLine = this.getNextFoldLine(docRow, foldLine);\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n            }\n\n            if (doCache) {\n                this.$docRowCache.push(docRow);\n                this.$screenRowCache.push(row);\n            }\n        }\n\n        if (foldLine && foldLine.start.row <= docRow) {\n            line = this.getFoldDisplayLine(foldLine);\n            docRow = foldLine.start.row;\n        } else if (row + rowLength <= screenRow || docRow > maxRow) {\n            return {\n                row: maxRow,\n                column: this.getLine(maxRow).length\n            };\n        } else {\n            line = this.getLine(docRow);\n            foldLine = null;\n        }\n        var wrapIndent = 0;\n        if (this.$useWrapMode) {\n            var splits = this.$wrapData[docRow];\n            if (splits) {\n                var splitIndex = Math.floor(screenRow - row);\n                column = splits[splitIndex];\n                if(splitIndex > 0 && splits.length) {\n                    wrapIndent = splits.indent;\n                    docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n                    line = line.substring(docColumn);\n                }\n            }\n        }\n\n        docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];\n        if (this.$useWrapMode && docColumn >= column)\n            docColumn = column - 1;\n\n        if (foldLine)\n            return foldLine.idxToPosition(docColumn);\n\n        return {row: docRow, column: docColumn};\n    };\n    this.documentToScreenPosition = function(docRow, docColumn) {\n        if (typeof docColumn === \"undefined\")\n            var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n        else\n            pos = this.$clipPositionToDocument(docRow, docColumn);\n\n        docRow = pos.row;\n        docColumn = pos.column;\n\n        var screenRow = 0;\n        var foldStartRow = null;\n        var fold = null;\n        fold = this.getFoldAt(docRow, docColumn, 1);\n        if (fold) {\n            docRow = fold.start.row;\n            docColumn = fold.start.column;\n        }\n\n        var rowEnd, row = 0;\n\n\n        var rowCache = this.$docRowCache;\n        var i = this.$getRowCacheIndex(rowCache, docRow);\n        var l = rowCache.length;\n        if (l && i >= 0) {\n            var row = rowCache[i];\n            var screenRow = this.$screenRowCache[i];\n            var doCache = docRow > rowCache[l - 1];\n        } else {\n            var doCache = !l;\n        }\n\n        var foldLine = this.getNextFoldLine(row);\n        var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n        while (row < docRow) {\n            if (row >= foldStart) {\n                rowEnd = foldLine.end.row + 1;\n                if (rowEnd > docRow)\n                    break;\n                foldLine = this.getNextFoldLine(rowEnd, foldLine);\n                foldStart = foldLine ?foldLine.start.row :Infinity;\n            }\n            else {\n                rowEnd = row + 1;\n            }\n\n            screenRow += this.getRowLength(row);\n            row = rowEnd;\n\n            if (doCache) {\n                this.$docRowCache.push(row);\n                this.$screenRowCache.push(screenRow);\n            }\n        }\n        var textLine = \"\";\n        if (foldLine && row >= foldStart) {\n            textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n            foldStartRow = foldLine.start.row;\n        } else {\n            textLine = this.getLine(docRow).substring(0, docColumn);\n            foldStartRow = docRow;\n        }\n        var wrapIndent = 0;\n        if (this.$useWrapMode) {\n            var wrapRow = this.$wrapData[foldStartRow];\n            if (wrapRow) {\n                var screenRowOffset = 0;\n                while (textLine.length >= wrapRow[screenRowOffset]) {\n                    screenRow ++;\n                    screenRowOffset++;\n                }\n                textLine = textLine.substring(\n                    wrapRow[screenRowOffset - 1] || 0, textLine.length\n                );\n                wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n            }\n        }\n\n        return {\n            row: screenRow,\n            column: wrapIndent + this.$getStringScreenWidth(textLine)[0]\n        };\n    };\n    this.documentToScreenColumn = function(row, docColumn) {\n        return this.documentToScreenPosition(row, docColumn).column;\n    };\n    this.documentToScreenRow = function(docRow, docColumn) {\n        return this.documentToScreenPosition(docRow, docColumn).row;\n    };\n    this.getScreenLength = function() {\n        var screenRows = 0;\n        var fold = null;\n        if (!this.$useWrapMode) {\n            screenRows = this.getLength();\n            var foldData = this.$foldData;\n            for (var i = 0; i < foldData.length; i++) {\n                fold = foldData[i];\n                screenRows -= fold.end.row - fold.start.row;\n            }\n        } else {\n            var lastRow = this.$wrapData.length;\n            var row = 0, i = 0;\n            var fold = this.$foldData[i++];\n            var foldStart = fold ? fold.start.row :Infinity;\n\n            while (row < lastRow) {\n                var splits = this.$wrapData[row];\n                screenRows += splits ? splits.length + 1 : 1;\n                row ++;\n                if (row > foldStart) {\n                    row = fold.end.row+1;\n                    fold = this.$foldData[i++];\n                    foldStart = fold ?fold.start.row :Infinity;\n                }\n            }\n        }\n        if (this.lineWidgets)\n            screenRows += this.$getWidgetScreenLength();\n\n        return screenRows;\n    };\n    this.$setFontMetrics = function(fm) {\n        if (!this.$enableVarChar) return;\n        this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n            if (maxScreenColumn === 0)\n                return [0, 0];\n            if (!maxScreenColumn)\n                maxScreenColumn = Infinity;\n            screenColumn = screenColumn || 0;\n            \n            var c, column;\n            for (column = 0; column < str.length; column++) {\n                c = str.charAt(column);\n                if (c === \"\\t\") {\n                    screenColumn += this.getScreenTabSize(screenColumn);\n                } else {\n                    screenColumn += fm.getCharacterWidth(c);\n                }\n                if (screenColumn > maxScreenColumn) {\n                    break;\n                }\n            }\n            \n            return [screenColumn, column];\n        };\n    };\n    \n    this.destroy = function() {\n        if (this.bgTokenizer) {\n            this.bgTokenizer.setDocument(null);\n            this.bgTokenizer = null;\n        }\n        this.$stopWorker();\n    };\n    function isFullWidth(c) {\n        if (c < 0x1100)\n            return false;\n        return c >= 0x1100 && c <= 0x115F ||\n               c >= 0x11A3 && c <= 0x11A7 ||\n               c >= 0x11FA && c <= 0x11FF ||\n               c >= 0x2329 && c <= 0x232A ||\n               c >= 0x2E80 && c <= 0x2E99 ||\n               c >= 0x2E9B && c <= 0x2EF3 ||\n               c >= 0x2F00 && c <= 0x2FD5 ||\n               c >= 0x2FF0 && c <= 0x2FFB ||\n               c >= 0x3000 && c <= 0x303E ||\n               c >= 0x3041 && c <= 0x3096 ||\n               c >= 0x3099 && c <= 0x30FF ||\n               c >= 0x3105 && c <= 0x312D ||\n               c >= 0x3131 && c <= 0x318E ||\n               c >= 0x3190 && c <= 0x31BA ||\n               c >= 0x31C0 && c <= 0x31E3 ||\n               c >= 0x31F0 && c <= 0x321E ||\n               c >= 0x3220 && c <= 0x3247 ||\n               c >= 0x3250 && c <= 0x32FE ||\n               c >= 0x3300 && c <= 0x4DBF ||\n               c >= 0x4E00 && c <= 0xA48C ||\n               c >= 0xA490 && c <= 0xA4C6 ||\n               c >= 0xA960 && c <= 0xA97C ||\n               c >= 0xAC00 && c <= 0xD7A3 ||\n               c >= 0xD7B0 && c <= 0xD7C6 ||\n               c >= 0xD7CB && c <= 0xD7FB ||\n               c >= 0xF900 && c <= 0xFAFF ||\n               c >= 0xFE10 && c <= 0xFE19 ||\n               c >= 0xFE30 && c <= 0xFE52 ||\n               c >= 0xFE54 && c <= 0xFE66 ||\n               c >= 0xFE68 && c <= 0xFE6B ||\n               c >= 0xFF01 && c <= 0xFF60 ||\n               c >= 0xFFE0 && c <= 0xFFE6;\n    }\n\n}).call(EditSession.prototype);\n\nacequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nacequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n    wrap: {\n        set: function(value) {\n            if (!value || value == \"off\")\n                value = false;\n            else if (value == \"free\")\n                value = true;\n            else if (value == \"printMargin\")\n                value = -1;\n            else if (typeof value == \"string\")\n                value = parseInt(value, 10) || false;\n\n            if (this.$wrap == value)\n                return;\n            this.$wrap = value;\n            if (!value) {\n                this.setUseWrapMode(false);\n            } else {\n                var col = typeof value == \"number\" ? value : null;\n                this.setWrapLimitRange(col, col);\n                this.setUseWrapMode(true);\n            }\n        },\n        get: function() {\n            if (this.getUseWrapMode()) {\n                if (this.$wrap == -1)\n                    return \"printMargin\";\n                if (!this.getWrapLimitRange().min)\n                    return \"free\";\n                return this.$wrap;\n            }\n            return \"off\";\n        },\n        handlesSet: true\n    },    \n    wrapMethod: {\n        set: function(val) {\n            val = val == \"auto\"\n                ? this.$mode.type != \"text\"\n                : val != \"text\";\n            if (val != this.$wrapAsCode) {\n                this.$wrapAsCode = val;\n                if (this.$useWrapMode) {\n                    this.$modified = true;\n                    this.$resetRowCache(0);\n                    this.$updateWrapData(0, this.getLength() - 1);\n                }\n            }\n        },\n        initialValue: \"auto\"\n    },\n    indentedSoftWrap: { initialValue: true },\n    firstLineNumber: {\n        set: function() {this._signal(\"changeBreakpoint\");},\n        initialValue: 1\n    },\n    useWorker: {\n        set: function(useWorker) {\n            this.$useWorker = useWorker;\n\n            this.$stopWorker();\n            if (useWorker)\n                this.$startWorker();\n        },\n        initialValue: true\n    },\n    useSoftTabs: {initialValue: true},\n    tabSize: {\n        set: function(tabSize) {\n            if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n            this.$modified = true;\n            this.$rowLengthCache = [];\n            this.$tabSize = tabSize;\n            this._signal(\"changeTabSize\");\n        },\n        initialValue: 4,\n        handlesSet: true\n    },\n    overwrite: {\n        set: function(val) {this._signal(\"changeOverwrite\");},\n        initialValue: false\n    },\n    newLineMode: {\n        set: function(val) {this.doc.setNewLineMode(val)},\n        get: function() {return this.doc.getNewLineMode()},\n        handlesSet: true\n    },\n    mode: {\n        set: function(val) { this.setMode(val) },\n        get: function() { return this.$modeId }\n    }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar Search = function() {\n    this.$options = {};\n};\n\n(function() {\n    this.set = function(options) {\n        oop.mixin(this.$options, options);\n        return this;\n    };\n    this.getOptions = function() {\n        return lang.copyObject(this.$options);\n    };\n    this.setOptions = function(options) {\n        this.$options = options;\n    };\n    this.find = function(session) {\n        var options = this.$options;\n        var iterator = this.$matchIterator(session, options);\n        if (!iterator)\n            return false;\n\n        var firstRange = null;\n        iterator.forEach(function(range, row, offset) {\n            if (!range.start) {\n                var column = range.offset + (offset || 0);\n                firstRange = new Range(row, column, row, column + range.length);\n                if (!range.length && options.start && options.start.start\n                    && options.skipCurrent != false && firstRange.isEqual(options.start)\n                ) {\n                    firstRange = null;\n                    return false;\n                }\n            } else\n                firstRange = range;\n            return true;\n        });\n\n        return firstRange;\n    };\n    this.findAll = function(session) {\n        var options = this.$options;\n        if (!options.needle)\n            return [];\n        this.$assembleRegExp(options);\n\n        var range = options.range;\n        var lines = range\n            ? session.getLines(range.start.row, range.end.row)\n            : session.doc.getAllLines();\n\n        var ranges = [];\n        var re = options.re;\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var maxRow = lines.length - len;\n            var prevRange;\n            outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n                for (var j = 0; j < len; j++)\n                    if (lines[row + j].search(re[j]) == -1)\n                        continue outer;\n                \n                var startLine = lines[row];\n                var line = lines[row + len - 1];\n                var startIndex = startLine.length - startLine.match(re[0])[0].length;\n                var endIndex = line.match(re[len - 1])[0].length;\n                \n                if (prevRange && prevRange.end.row === row &&\n                    prevRange.end.column > startIndex\n                ) {\n                    continue;\n                }\n                ranges.push(prevRange = new Range(\n                    row, startIndex, row + len - 1, endIndex\n                ));\n                if (len > 2)\n                    row = row + len - 2;\n            }\n        } else {\n            for (var i = 0; i < lines.length; i++) {\n                var matches = lang.getMatchOffsets(lines[i], re);\n                for (var j = 0; j < matches.length; j++) {\n                    var match = matches[j];\n                    ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n                }\n            }\n        }\n\n        if (range) {\n            var startColumn = range.start.column;\n            var endColumn = range.start.column;\n            var i = 0, j = ranges.length - 1;\n            while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n                i++;\n\n            while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n                j--;\n            \n            ranges = ranges.slice(i, j + 1);\n            for (i = 0, j = ranges.length; i < j; i++) {\n                ranges[i].start.row += range.start.row;\n                ranges[i].end.row += range.start.row;\n            }\n        }\n\n        return ranges;\n    };\n    this.replace = function(input, replacement) {\n        var options = this.$options;\n\n        var re = this.$assembleRegExp(options);\n        if (options.$isMultiLine)\n            return replacement;\n\n        if (!re)\n            return;\n\n        var match = re.exec(input);\n        if (!match || match[0].length != input.length)\n            return null;\n        \n        replacement = input.replace(re, replacement);\n        if (options.preserveCase) {\n            replacement = replacement.split(\"\");\n            for (var i = Math.min(input.length, input.length); i--; ) {\n                var ch = input[i];\n                if (ch && ch.toLowerCase() != ch)\n                    replacement[i] = replacement[i].toUpperCase();\n                else\n                    replacement[i] = replacement[i].toLowerCase();\n            }\n            replacement = replacement.join(\"\");\n        }\n        \n        return replacement;\n    };\n\n    this.$matchIterator = function(session, options) {\n        var re = this.$assembleRegExp(options);\n        if (!re)\n            return false;\n\n        var callback;\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var matchIterator = function(line, row, offset) {\n                var startIndex = line.search(re[0]);\n                if (startIndex == -1)\n                    return;\n                for (var i = 1; i < len; i++) {\n                    line = session.getLine(row + i);\n                    if (line.search(re[i]) == -1)\n                        return;\n                }\n\n                var endIndex = line.match(re[len - 1])[0].length;\n\n                var range = new Range(row, startIndex, row + len - 1, endIndex);\n                if (re.offset == 1) {\n                    range.start.row--;\n                    range.start.column = Number.MAX_VALUE;\n                } else if (offset)\n                    range.start.column += offset;\n\n                if (callback(range))\n                    return true;\n            };\n        } else if (options.backwards) {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = matches.length-1; i >= 0; i--)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        } else {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = 0; i < matches.length; i++)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        }\n        \n        var lineIterator = this.$lineIterator(session, options);\n\n        return {\n            forEach: function(_callback) {\n                callback = _callback;\n                lineIterator.forEach(matchIterator);\n            }\n        };\n    };\n\n    this.$assembleRegExp = function(options, $disableFakeMultiline) {\n        if (options.needle instanceof RegExp)\n            return options.re = options.needle;\n\n        var needle = options.needle;\n\n        if (!options.needle)\n            return options.re = false;\n\n        if (!options.regExp)\n            needle = lang.escapeRegExp(needle);\n\n        if (options.wholeWord)\n            needle = addWordBoundary(needle, options);\n\n        var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\n        options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n        if (options.$isMultiLine)\n            return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n        try {\n            var re = new RegExp(needle, modifier);\n        } catch(e) {\n            re = false;\n        }\n        return options.re = re;\n    };\n\n    this.$assembleMultilineRegExp = function(needle, modifier) {\n        var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n        var re = [];\n        for (var i = 0; i < parts.length; i++) try {\n            re.push(new RegExp(parts[i], modifier));\n        } catch(e) {\n            return false;\n        }\n        if (parts[0] == \"\") {\n            re.shift();\n            re.offset = 1;\n        } else {\n            re.offset = 0;\n        }\n        return re;\n    };\n\n    this.$lineIterator = function(session, options) {\n        var backwards = options.backwards == true;\n        var skipCurrent = options.skipCurrent != false;\n\n        var range = options.range;\n        var start = options.start;\n        if (!start)\n            start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n         \n        if (start.start)\n            start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n        var firstRow = range ? range.start.row : 0;\n        var lastRow = range ? range.end.row : session.getLength() - 1;\n\n        var forEach = backwards ? function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substring(0, start.column);\n                if (callback(line, row))\n                    return;\n\n                for (row--; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap == false)\n                    return;\n\n                for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n            } : function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substr(start.column);\n                if (callback(line, row, start.column))\n                    return;\n\n                for (row = row+1; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap == false)\n                    return;\n\n                for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n            };\n        \n        return {forEach: forEach};\n    };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n    function wordBoundary(c) {\n        if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n        return \"\";\n    }\n    return wordBoundary(needle[0]) + needle\n        + wordBoundary(needle[needle.length - 1]);\n}\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keyUtil = acequire(\"../lib/keys\");\nvar useragent = acequire(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n    this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n    this.commands = {};\n    this.commandKeyBinding = {};\n    this.addCommands(config);\n    this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n    HashHandler.call(this, config, platform);\n    this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n    \n\n    this.addCommand = function(command) {\n        if (this.commands[command.name])\n            this.removeCommand(command);\n\n        this.commands[command.name] = command;\n\n        if (command.bindKey)\n            this._buildKeyHash(command);\n    };\n\n    this.removeCommand = function(command, keepCommand) {\n        var name = command && (typeof command === 'string' ? command : command.name);\n        command = this.commands[name];\n        if (!keepCommand)\n            delete this.commands[name];\n        var ckb = this.commandKeyBinding;\n        for (var keyId in ckb) {\n            var cmdGroup = ckb[keyId];\n            if (cmdGroup == command) {\n                delete ckb[keyId];\n            } else if (Array.isArray(cmdGroup)) {\n                var i = cmdGroup.indexOf(command);\n                if (i != -1) {\n                    cmdGroup.splice(i, 1);\n                    if (cmdGroup.length == 1)\n                        ckb[keyId] = cmdGroup[0];\n                }\n            }\n        }\n    };\n\n    this.bindKey = function(key, command, position) {\n        if (typeof key == \"object\" && key) {\n            if (position == undefined)\n                position = key.position;\n            key = key[this.platform];\n        }\n        if (!key)\n            return;\n        if (typeof command == \"function\")\n            return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n        \n        key.split(\"|\").forEach(function(keyPart) {\n            var chain = \"\";\n            if (keyPart.indexOf(\" \") != -1) {\n                var parts = keyPart.split(/\\s+/);\n                keyPart = parts.pop();\n                parts.forEach(function(keyPart) {\n                    var binding = this.parseKeys(keyPart);\n                    var id = KEY_MODS[binding.hashId] + binding.key;\n                    chain += (chain ? \" \" : \"\") + id;\n                    this._addCommandToBinding(chain, \"chainKeys\");\n                }, this);\n                chain += \" \";\n            }\n            var binding = this.parseKeys(keyPart);\n            var id = KEY_MODS[binding.hashId] + binding.key;\n            this._addCommandToBinding(chain + id, command, position);\n        }, this);\n    };\n    \n    function getPosition(command) {\n        return typeof command == \"object\" && command.bindKey\n            && command.bindKey.position || 0;\n    }\n    this._addCommandToBinding = function(keyId, command, position) {\n        var ckb = this.commandKeyBinding, i;\n        if (!command) {\n            delete ckb[keyId];\n        } else if (!ckb[keyId] || this.$singleCommand) {\n            ckb[keyId] = command;\n        } else {\n            if (!Array.isArray(ckb[keyId])) {\n                ckb[keyId] = [ckb[keyId]];\n            } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n                ckb[keyId].splice(i, 1);\n            }\n\n            if (typeof position != \"number\") {\n                if (position || command.isDefault)\n                    position = -100;\n                else\n                   position = getPosition(command);\n            }\n            var commands = ckb[keyId];\n            for (i = 0; i < commands.length; i++) {\n                var other = commands[i];\n                var otherPos = getPosition(other);\n                if (otherPos > position)\n                    break;\n            }\n            commands.splice(i, 0, command);\n        }\n    };\n\n    this.addCommands = function(commands) {\n        commands && Object.keys(commands).forEach(function(name) {\n            var command = commands[name];\n            if (!command)\n                return;\n            \n            if (typeof command === \"string\")\n                return this.bindKey(command, name);\n\n            if (typeof command === \"function\")\n                command = { exec: command };\n\n            if (typeof command !== \"object\")\n                return;\n\n            if (!command.name)\n                command.name = name;\n\n            this.addCommand(command);\n        }, this);\n    };\n\n    this.removeCommands = function(commands) {\n        Object.keys(commands).forEach(function(name) {\n            this.removeCommand(commands[name]);\n        }, this);\n    };\n\n    this.bindKeys = function(keyList) {\n        Object.keys(keyList).forEach(function(key) {\n            this.bindKey(key, keyList[key]);\n        }, this);\n    };\n\n    this._buildKeyHash = function(command) {\n        this.bindKey(command.bindKey, command);\n    };\n    this.parseKeys = function(keys) {\n        var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x});\n        var key = parts.pop();\n\n        var keyCode = keyUtil[key];\n        if (keyUtil.FUNCTION_KEYS[keyCode])\n            key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n        else if (!parts.length)\n            return {key: key, hashId: -1};\n        else if (parts.length == 1 && parts[0] == \"shift\")\n            return {key: key.toUpperCase(), hashId: -1};\n\n        var hashId = 0;\n        for (var i = parts.length; i--;) {\n            var modifier = keyUtil.KEY_MODS[parts[i]];\n            if (modifier == null) {\n                if (typeof console != \"undefined\")\n                    console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n                return false;\n            }\n            hashId |= modifier;\n        }\n        return {key: key, hashId: hashId};\n    };\n\n    this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n        var key = KEY_MODS[hashId] + keyString;\n        return this.commandKeyBinding[key];\n    };\n\n    this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n        if (keyCode < 0) return;\n        var key = KEY_MODS[hashId] + keyString;\n        var command = this.commandKeyBinding[key];\n        if (data.$keyChain) {\n            data.$keyChain += \" \" + key;\n            command = this.commandKeyBinding[data.$keyChain] || command;\n        }\n        \n        if (command) {\n            if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n                data.$keyChain = data.$keyChain || key;\n                return {command: \"null\"};\n            }\n        }\n        \n        if (data.$keyChain) {\n            if ((!hashId || hashId == 4) && keyString.length == 1)\n                data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n            else if (hashId == -1 || keyCode > 0)\n                data.$keyChain = \"\"; // reset keyChain\n        }\n        return {command: command};\n    };\n    \n    this.getStatusText = function(editor, data) {\n        return data.$keyChain || \"\";\n    };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\n\nace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar MultiHashHandler = acequire(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n    MultiHashHandler.call(this, commands, platform);\n    this.byName = this.commands;\n    this.setDefaultHandler(\"exec\", function(e) {\n        return e.command.exec(e.editor, e.args || {});\n    });\n};\n\noop.inherits(CommandManager, MultiHashHandler);\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.exec = function(command, editor, args) {\n        if (Array.isArray(command)) {\n            for (var i = command.length; i--; ) {\n                if (this.exec(command[i], editor, args)) return true;\n            }\n            return false;\n        }\n        \n        if (typeof command === \"string\")\n            command = this.commands[command];\n\n        if (!command)\n            return false;\n\n        if (editor && editor.$readOnly && !command.readOnly)\n            return false;\n\n        var e = {editor: editor, command: command, args: args};\n        e.returnValue = this._emit(\"exec\", e);\n        this._signal(\"afterExec\", e);\n\n        return e.returnValue === false ? false : true;\n    };\n\n    this.toggleRecording = function(editor) {\n        if (this.$inReplay)\n            return;\n\n        editor && editor._emit(\"changeStatus\");\n        if (this.recording) {\n            this.macro.pop();\n            this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n            if (!this.macro.length)\n                this.macro = this.oldMacro;\n\n            return this.recording = false;\n        }\n        if (!this.$addCommandToMacro) {\n            this.$addCommandToMacro = function(e) {\n                this.macro.push([e.command, e.args]);\n            }.bind(this);\n        }\n\n        this.oldMacro = this.macro;\n        this.macro = [];\n        this.on(\"exec\", this.$addCommandToMacro);\n        return this.recording = true;\n    };\n\n    this.replay = function(editor) {\n        if (this.$inReplay || !this.macro)\n            return;\n\n        if (this.recording)\n            return this.toggleRecording(editor);\n\n        try {\n            this.$inReplay = true;\n            this.macro.forEach(function(x) {\n                if (typeof x == \"string\")\n                    this.exec(x, editor);\n                else\n                    this.exec(x[0], editor, x[1]);\n            }, this);\n        } finally {\n            this.$inReplay = false;\n        }\n    };\n\n    this.trimMacro = function(m) {\n        return m.map(function(x){\n            if (typeof x[0] != \"string\")\n                x[0] = x[0].name;\n            if (!x[1])\n                x = x[0];\n            return x;\n        });\n    };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\nvar config = acequire(\"../config\");\nvar Range = acequire(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n    return {win: win, mac: mac};\n}\nexports.commands = [{\n    name: \"showSettingsMenu\",\n    bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/settings_menu\", function(module) {\n            module.init(editor);\n            editor.showSettingsMenu();\n        });\n    },\n    readOnly: true\n}, {\n    name: \"goToNextError\",\n    bindKey: bindKey(\"Alt-E\", \"F4\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/error_marker\", function(module) {\n            module.showErrorMarker(editor, 1);\n        });\n    },\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"goToPreviousError\",\n    bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/error_marker\", function(module) {\n            module.showErrorMarker(editor, -1);\n        });\n    },\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"selectall\",\n    bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n    exec: function(editor) { editor.selectAll(); },\n    readOnly: true\n}, {\n    name: \"centerselection\",\n    bindKey: bindKey(null, \"Ctrl-L\"),\n    exec: function(editor) { editor.centerSelection(); },\n    readOnly: true\n}, {\n    name: \"gotoline\",\n    bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n    exec: function(editor) {\n        var line = parseInt(prompt(\"Enter line number:\"), 10);\n        if (!isNaN(line)) {\n            editor.gotoLine(line);\n        }\n    },\n    readOnly: true\n}, {\n    name: \"fold\",\n    bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n    exec: function(editor) { editor.session.toggleFold(false); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"unfold\",\n    bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n    exec: function(editor) { editor.session.toggleFold(true); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"toggleFoldWidget\",\n    bindKey: bindKey(\"F2\", \"F2\"),\n    exec: function(editor) { editor.session.toggleFoldWidget(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"toggleParentFoldWidget\",\n    bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n    exec: function(editor) { editor.session.toggleFoldWidget(true); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"foldall\",\n    bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n    exec: function(editor) { editor.session.foldAll(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"foldOther\",\n    bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n    exec: function(editor) { \n        editor.session.foldAll();\n        editor.session.unfold(editor.selection.getAllRanges());\n    },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"unfoldall\",\n    bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n    exec: function(editor) { editor.session.unfold(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"findnext\",\n    bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n    exec: function(editor) { editor.findNext(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"findprevious\",\n    bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n    exec: function(editor) { editor.findPrevious(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"selectOrFindNext\",\n    bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n    exec: function(editor) {\n        if (editor.selection.isEmpty())\n            editor.selection.selectWord();\n        else\n            editor.findNext(); \n    },\n    readOnly: true\n}, {\n    name: \"selectOrFindPrevious\",\n    bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n    exec: function(editor) { \n        if (editor.selection.isEmpty())\n            editor.selection.selectWord();\n        else\n            editor.findPrevious();\n    },\n    readOnly: true\n}, {\n    name: \"find\",\n    bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor)});\n    },\n    readOnly: true\n}, {\n    name: \"overwrite\",\n    bindKey: \"Insert\",\n    exec: function(editor) { editor.toggleOverwrite(); },\n    readOnly: true\n}, {\n    name: \"selecttostart\",\n    bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Home|Command-Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"gotostart\",\n    bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n    exec: function(editor) { editor.navigateFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"selectup\",\n    bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n    exec: function(editor) { editor.getSelection().selectUp(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"golineup\",\n    bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n    exec: function(editor, args) { editor.navigateUp(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttoend\",\n    bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-End|Command-Shift-Down\"),\n    exec: function(editor) { editor.getSelection().selectFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"gotoend\",\n    bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n    exec: function(editor) { editor.navigateFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"selectdown\",\n    bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n    exec: function(editor) { editor.getSelection().selectDown(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"golinedown\",\n    bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n    exec: function(editor, args) { editor.navigateDown(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectwordleft\",\n    bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotowordleft\",\n    bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n    exec: function(editor) { editor.navigateWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttolinestart\",\n    bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotolinestart\",\n    bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n    exec: function(editor) { editor.navigateLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectleft\",\n    bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n    exec: function(editor) { editor.getSelection().selectLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotoleft\",\n    bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n    exec: function(editor, args) { editor.navigateLeft(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectwordright\",\n    bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotowordright\",\n    bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n    exec: function(editor) { editor.navigateWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttolineend\",\n    bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotolineend\",\n    bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n    exec: function(editor) { editor.navigateLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectright\",\n    bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotoright\",\n    bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n    exec: function(editor, args) { editor.navigateRight(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectpagedown\",\n    bindKey: \"Shift-PageDown\",\n    exec: function(editor) { editor.selectPageDown(); },\n    readOnly: true\n}, {\n    name: \"pagedown\",\n    bindKey: bindKey(null, \"Option-PageDown\"),\n    exec: function(editor) { editor.scrollPageDown(); },\n    readOnly: true\n}, {\n    name: \"gotopagedown\",\n    bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n    exec: function(editor) { editor.gotoPageDown(); },\n    readOnly: true\n}, {\n    name: \"selectpageup\",\n    bindKey: \"Shift-PageUp\",\n    exec: function(editor) { editor.selectPageUp(); },\n    readOnly: true\n}, {\n    name: \"pageup\",\n    bindKey: bindKey(null, \"Option-PageUp\"),\n    exec: function(editor) { editor.scrollPageUp(); },\n    readOnly: true\n}, {\n    name: \"gotopageup\",\n    bindKey: \"PageUp\",\n    exec: function(editor) { editor.gotoPageUp(); },\n    readOnly: true\n}, {\n    name: \"scrollup\",\n    bindKey: bindKey(\"Ctrl-Up\", null),\n    exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"scrolldown\",\n    bindKey: bindKey(\"Ctrl-Down\", null),\n    exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"selectlinestart\",\n    bindKey: \"Shift-Home\",\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectlineend\",\n    bindKey: \"Shift-End\",\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"togglerecording\",\n    bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n    exec: function(editor) { editor.commands.toggleRecording(editor); },\n    readOnly: true\n}, {\n    name: \"replaymacro\",\n    bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n    exec: function(editor) { editor.commands.replay(editor); },\n    readOnly: true\n}, {\n    name: \"jumptomatching\",\n    bindKey: bindKey(\"Ctrl-P\", \"Ctrl-P\"),\n    exec: function(editor) { editor.jumpToMatching(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"selecttomatching\",\n    bindKey: bindKey(\"Ctrl-Shift-P\", \"Ctrl-Shift-P\"),\n    exec: function(editor) { editor.jumpToMatching(true); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"expandToMatching\",\n    bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n    exec: function(editor) { editor.jumpToMatching(true, true); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"passKeysToBrowser\",\n    bindKey: bindKey(null, null),\n    exec: function() {},\n    passEvent: true,\n    readOnly: true\n}, {\n    name: \"copy\",\n    exec: function(editor) {\n    },\n    readOnly: true\n},\n{\n    name: \"cut\",\n    exec: function(editor) {\n        var range = editor.getSelectionRange();\n        editor._emit(\"cut\", range);\n\n        if (!editor.selection.isEmpty()) {\n            editor.session.remove(range);\n            editor.clearSelection();\n        }\n    },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"paste\",\n    exec: function(editor, args) {\n        editor.$handlePaste(args);\n    },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removeline\",\n    bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n    exec: function(editor) { editor.removeLines(); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"duplicateSelection\",\n    bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n    exec: function(editor) { editor.duplicateSelection(); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"sortlines\",\n    bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n    exec: function(editor) { editor.sortLines(); },\n    scrollIntoView: \"selection\",\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"togglecomment\",\n    bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n    exec: function(editor) { editor.toggleCommentLines(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"toggleBlockComment\",\n    bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n    exec: function(editor) { editor.toggleBlockComment(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"modifyNumberUp\",\n    bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n    exec: function(editor) { editor.modifyNumber(1); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"modifyNumberDown\",\n    bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n    exec: function(editor) { editor.modifyNumber(-1); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"replace\",\n    bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true)});\n    }\n}, {\n    name: \"undo\",\n    bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n    exec: function(editor) { editor.undo(); }\n}, {\n    name: \"redo\",\n    bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n    exec: function(editor) { editor.redo(); }\n}, {\n    name: \"copylinesup\",\n    bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n    exec: function(editor) { editor.copyLinesUp(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"movelinesup\",\n    bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n    exec: function(editor) { editor.moveLinesUp(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"copylinesdown\",\n    bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n    exec: function(editor) { editor.copyLinesDown(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"movelinesdown\",\n    bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n    exec: function(editor) { editor.moveLinesDown(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"del\",\n    bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n    exec: function(editor) { editor.remove(\"right\"); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"backspace\",\n    bindKey: bindKey(\n        \"Shift-Backspace|Backspace\",\n        \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n    ),\n    exec: function(editor) { editor.remove(\"left\"); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"cut_or_delete\",\n    bindKey: bindKey(\"Shift-Delete\", null),\n    exec: function(editor) { \n        if (editor.selection.isEmpty()) {\n            editor.remove(\"left\");\n        } else {\n            return false;\n        }\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removetolinestart\",\n    bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n    exec: function(editor) { editor.removeToLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removetolineend\",\n    bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K\"),\n    exec: function(editor) { editor.removeToLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removewordleft\",\n    bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n    exec: function(editor) { editor.removeWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removewordright\",\n    bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n    exec: function(editor) { editor.removeWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"outdent\",\n    bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"indent\",\n    bindKey: bindKey(\"Tab\", \"Tab\"),\n    exec: function(editor) { editor.indent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockoutdent\",\n    bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockindent\",\n    bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n    exec: function(editor) { editor.blockIndent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"insertstring\",\n    exec: function(editor, str) { editor.insert(str); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"inserttext\",\n    exec: function(editor, args) {\n        editor.insert(lang.stringRepeat(args.text  || \"\", args.times || 1));\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"splitline\",\n    bindKey: bindKey(null, \"Ctrl-O\"),\n    exec: function(editor) { editor.splitLine(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"transposeletters\",\n    bindKey: bindKey(\"Ctrl-T\", \"Ctrl-T\"),\n    exec: function(editor) { editor.transposeLetters(); },\n    multiSelectAction: function(editor) {editor.transposeSelections(1); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"touppercase\",\n    bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n    exec: function(editor) { editor.toUpperCase(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"tolowercase\",\n    bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n    exec: function(editor) { editor.toLowerCase(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"expandtoline\",\n    bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n    exec: function(editor) {\n        var range = editor.selection.getRange();\n\n        range.start.column = range.end.column = 0;\n        range.end.row++;\n        editor.selection.setRange(range, false);\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"joinlines\",\n    bindKey: bindKey(null, null),\n    exec: function(editor) {\n        var isBackwards = editor.selection.isBackwards();\n        var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n        var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n        var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n        var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n        var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n        var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n        for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n            var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n            if (curLine.length !== 0) {\n                curLine = \" \" + curLine;\n            }\n            insertLine += curLine;\n        }\n\n        if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n            insertLine += editor.session.doc.getNewLineCharacter();\n        }\n\n        editor.clearSelection();\n        editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n        if (selectedCount > 0) {\n            editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n            editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n        } else {\n            firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n            editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n        }\n    },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"invertSelection\",\n    bindKey: bindKey(null, null),\n    exec: function(editor) {\n        var endRow = editor.session.doc.getLength() - 1;\n        var endCol = editor.session.doc.getLine(endRow).length;\n        var ranges = editor.selection.rangeList.ranges;\n        var newRanges = [];\n        if (ranges.length < 1) {\n            ranges = [editor.selection.getRange()];\n        }\n\n        for (var i = 0; i < ranges.length; i++) {\n            if (i == (ranges.length - 1)) {\n                if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n                    newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n                }\n            }\n\n            if (i === 0) {\n                if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n                    newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n                }\n            } else {\n                newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n            }\n        }\n\n        editor.exitMultiSelectMode();\n        editor.clearSelection();\n\n        for(var i = 0; i < newRanges.length; i++) {\n            editor.selection.addRange(newRanges[i], false);\n        }\n    },\n    readOnly: true,\n    scrollIntoView: \"none\"\n}];\n\n});\n\nace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar TextInput = acequire(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = acequire(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = acequire(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = acequire(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar Search = acequire(\"./search\").Search;\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = acequire(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = acequire(\"./commands/default_commands\").commands;\nvar config = acequire(\"./config\");\nvar TokenIterator = acequire(\"./token_iterator\").TokenIterator;\nvar Editor = function(renderer, session) {\n    var container = renderer.getContainerElement();\n    this.container = container;\n    this.renderer = renderer;\n\n    this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n    this.textInput  = new TextInput(renderer.getTextAreaContainer(), this);\n    this.renderer.textarea = this.textInput.getElement();\n    this.keyBinding = new KeyBinding(this);\n    this.$mouseHandler = new MouseHandler(this);\n    new FoldHandler(this);\n\n    this.$blockScrolling = 0;\n    this.$search = new Search().set({\n        wrap: true\n    });\n\n    this.$historyTracker = this.$historyTracker.bind(this);\n    this.commands.on(\"exec\", this.$historyTracker);\n\n    this.$initOperationListeners();\n    \n    this._$emitInputEvent = lang.delayedCall(function() {\n        this._signal(\"input\", {});\n        if (this.session && this.session.bgTokenizer)\n            this.session.bgTokenizer.scheduleStart();\n    }.bind(this));\n    \n    this.on(\"change\", function(_, _self) {\n        _self._$emitInputEvent.schedule(31);\n    });\n\n    this.setSession(session || new EditSession(\"\"));\n    config.resetOptions(this);\n    config._signal(\"editor\", this);\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.$initOperationListeners = function() {\n        function last(a) {return a[a.length - 1]}\n\n        this.selections = [];\n        this.commands.on(\"exec\", this.startOperation.bind(this), true);\n        this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n        this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\n        this.on(\"change\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.docChanged = true;\n        }.bind(this), true);\n\n        this.on(\"changeSelection\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.selectionChanged = true;\n        }.bind(this), true);\n    };\n\n    this.curOp = null;\n    this.prevOp = {};\n    this.startOperation = function(commadEvent) {\n        if (this.curOp) {\n            if (!commadEvent || this.curOp.command)\n                return;\n            this.prevOp = this.curOp;\n        }\n        if (!commadEvent) {\n            this.previousCommand = null;\n            commadEvent = {};\n        }\n\n        this.$opResetTimer.schedule();\n        this.curOp = {\n            command: commadEvent.command || {},\n            args: commadEvent.args,\n            scrollTop: this.renderer.scrollTop\n        };\n        if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\n            this.$blockScrolling++;\n    };\n\n    this.endOperation = function(e) {\n        if (this.curOp) {\n            if (e && e.returnValue === false)\n                return this.curOp = null;\n            this._signal(\"beforeEndOperation\");\n            var command = this.curOp.command;\n            if (command.name && this.$blockScrolling > 0)\n                this.$blockScrolling--;\n            var scrollIntoView = command && command.scrollIntoView;\n            if (scrollIntoView) {\n                switch (scrollIntoView) {\n                    case \"center-animate\":\n                        scrollIntoView = \"animate\";\n                    case \"center\":\n                        this.renderer.scrollCursorIntoView(null, 0.5);\n                        break;\n                    case \"animate\":\n                    case \"cursor\":\n                        this.renderer.scrollCursorIntoView();\n                        break;\n                    case \"selectionPart\":\n                        var range = this.selection.getRange();\n                        var config = this.renderer.layerConfig;\n                        if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n                            this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n                        }\n                        break;\n                    default:\n                        break;\n                }\n                if (scrollIntoView == \"animate\")\n                    this.renderer.animateScrolling(this.curOp.scrollTop);\n            }\n            \n            this.prevOp = this.curOp;\n            this.curOp = null;\n        }\n    };\n    this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n    this.$historyTracker = function(e) {\n        if (!this.$mergeUndoDeltas)\n            return;\n\n        var prev = this.prevOp;\n        var mergeableCommands = this.$mergeableCommands;\n        var shouldMerge = prev.command && (e.command.name == prev.command.name);\n        if (e.command.name == \"insertstring\") {\n            var text = e.args;\n            if (this.mergeNextCommand === undefined)\n                this.mergeNextCommand = true;\n\n            shouldMerge = shouldMerge\n                && this.mergeNextCommand // previous command allows to coalesce with\n                && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n            this.mergeNextCommand = true;\n        } else {\n            shouldMerge = shouldMerge\n                && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n        }\n\n        if (\n            this.$mergeUndoDeltas != \"always\"\n            && Date.now() - this.sequenceStartTime > 2000\n        ) {\n            shouldMerge = false; // the sequence is too long\n        }\n\n        if (shouldMerge)\n            this.session.mergeUndoDeltas = true;\n        else if (mergeableCommands.indexOf(e.command.name) !== -1)\n            this.sequenceStartTime = Date.now();\n    };\n    this.setKeyboardHandler = function(keyboardHandler, cb) {\n        if (keyboardHandler && typeof keyboardHandler === \"string\") {\n            this.$keybindingId = keyboardHandler;\n            var _self = this;\n            config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n                if (_self.$keybindingId == keyboardHandler)\n                    _self.keyBinding.setKeyboardHandler(module && module.handler);\n                cb && cb();\n            });\n        } else {\n            this.$keybindingId = null;\n            this.keyBinding.setKeyboardHandler(keyboardHandler);\n            cb && cb();\n        }\n    };\n    this.getKeyboardHandler = function() {\n        return this.keyBinding.getKeyboardHandler();\n    };\n    this.setSession = function(session) {\n        if (this.session == session)\n            return;\n        if (this.curOp) this.endOperation();\n        this.curOp = {};\n\n        var oldSession = this.session;\n        if (oldSession) {\n            this.session.off(\"change\", this.$onDocumentChange);\n            this.session.off(\"changeMode\", this.$onChangeMode);\n            this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n            this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n            this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n            this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n            this.session.off(\"changeFold\", this.$onChangeFold);\n            this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n            this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n            this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n            this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n            this.session.off(\"changeOverwrite\", this.$onCursorChange);\n            this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n            this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n            var selection = this.session.getSelection();\n            selection.off(\"changeCursor\", this.$onCursorChange);\n            selection.off(\"changeSelection\", this.$onSelectionChange);\n        }\n\n        this.session = session;\n        if (session) {\n            this.$onDocumentChange = this.onDocumentChange.bind(this);\n            session.on(\"change\", this.$onDocumentChange);\n            this.renderer.setSession(session);\n    \n            this.$onChangeMode = this.onChangeMode.bind(this);\n            session.on(\"changeMode\", this.$onChangeMode);\n    \n            this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n            session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n    \n            this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n            session.on(\"changeTabSize\", this.$onChangeTabSize);\n    \n            this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n            session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n    \n            this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n            session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n    \n            this.$onChangeFold = this.onChangeFold.bind(this);\n            session.on(\"changeFold\", this.$onChangeFold);\n    \n            this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n            this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n    \n            this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n            this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n    \n            this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n            this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n    \n            this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n            this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n    \n            this.$onCursorChange = this.onCursorChange.bind(this);\n            this.session.on(\"changeOverwrite\", this.$onCursorChange);\n    \n            this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n            this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n    \n            this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n            this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n    \n            this.selection = session.getSelection();\n            this.selection.on(\"changeCursor\", this.$onCursorChange);\n    \n            this.$onSelectionChange = this.onSelectionChange.bind(this);\n            this.selection.on(\"changeSelection\", this.$onSelectionChange);\n    \n            this.onChangeMode();\n    \n            this.$blockScrolling += 1;\n            this.onCursorChange();\n            this.$blockScrolling -= 1;\n    \n            this.onScrollTopChange();\n            this.onScrollLeftChange();\n            this.onSelectionChange();\n            this.onChangeFrontMarker();\n            this.onChangeBackMarker();\n            this.onChangeBreakpoint();\n            this.onChangeAnnotation();\n            this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n            this.renderer.updateFull();\n        } else {\n            this.selection = null;\n            this.renderer.setSession(session);\n        }\n\n        this._signal(\"changeSession\", {\n            session: session,\n            oldSession: oldSession\n        });\n        \n        this.curOp = null;\n        \n        oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n        session && session._signal(\"changeEditor\", {editor: this});\n    };\n    this.getSession = function() {\n        return this.session;\n    };\n    this.setValue = function(val, cursorPos) {\n        this.session.doc.setValue(val);\n\n        if (!cursorPos)\n            this.selectAll();\n        else if (cursorPos == 1)\n            this.navigateFileEnd();\n        else if (cursorPos == -1)\n            this.navigateFileStart();\n\n        return val;\n    };\n    this.getValue = function() {\n        return this.session.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.resize = function(force) {\n        this.renderer.onResize(force);\n    };\n    this.setTheme = function(theme, cb) {\n        this.renderer.setTheme(theme, cb);\n    };\n    this.getTheme = function() {\n        return this.renderer.getTheme();\n    };\n    this.setStyle = function(style) {\n        this.renderer.setStyle(style);\n    };\n    this.unsetStyle = function(style) {\n        this.renderer.unsetStyle(style);\n    };\n    this.getFontSize = function () {\n        return this.getOption(\"fontSize\") ||\n           dom.computedStyle(this.container, \"fontSize\");\n    };\n    this.setFontSize = function(size) {\n        this.setOption(\"fontSize\", size);\n    };\n\n    this.$highlightBrackets = function() {\n        if (this.session.$bracketHighlight) {\n            this.session.removeMarker(this.session.$bracketHighlight);\n            this.session.$bracketHighlight = null;\n        }\n\n        if (this.$highlightPending) {\n            return;\n        }\n        var self = this;\n        this.$highlightPending = true;\n        setTimeout(function() {\n            self.$highlightPending = false;\n            var session = self.session;\n            if (!session || !session.bgTokenizer) return;\n            var pos = session.findMatchingBracket(self.getCursorPosition());\n            if (pos) {\n                var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\n            } else if (session.$mode.getMatching) {\n                var range = session.$mode.getMatching(self.session);\n            }\n            if (range)\n                session.$bracketHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n        }, 50);\n    };\n    this.$highlightTags = function() {\n        if (this.$highlightTagPending)\n            return;\n        var self = this;\n        this.$highlightTagPending = true;\n        setTimeout(function() {\n            self.$highlightTagPending = false;\n            \n            var session = self.session;\n            if (!session || !session.bgTokenizer) return;\n            \n            var pos = self.getCursorPosition();\n            var iterator = new TokenIterator(self.session, pos.row, pos.column);\n            var token = iterator.getCurrentToken();\n            \n            if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n                session.removeMarker(session.$tagHighlight);\n                session.$tagHighlight = null;\n                return;\n            }\n            \n            if (token.type.indexOf(\"tag-open\") != -1) {\n                token = iterator.stepForward();\n                if (!token)\n                    return;\n            }\n            \n            var tag = token.value;\n            var depth = 0;\n            var prevToken = iterator.stepBackward();\n            \n            if (prevToken.value == '<'){\n                do {\n                    prevToken = token;\n                    token = iterator.stepForward();\n                    \n                    if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                        if (prevToken.value === '<'){\n                            depth++;\n                        } else if (prevToken.value === '</'){\n                            depth--;\n                        }\n                    }\n                    \n                } while (token && depth >= 0);\n            } else {\n                do {\n                    token = prevToken;\n                    prevToken = iterator.stepBackward();\n                    \n                    if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                        if (prevToken.value === '<') {\n                            depth++;\n                        } else if (prevToken.value === '</') {\n                            depth--;\n                        }\n                    }\n                } while (prevToken && depth <= 0);\n                iterator.stepForward();\n            }\n            \n            if (!token) {\n                session.removeMarker(session.$tagHighlight);\n                session.$tagHighlight = null;\n                return;\n            }\n            \n            var row = iterator.getCurrentTokenRow();\n            var column = iterator.getCurrentTokenColumn();\n            var range = new Range(row, column, row, column+token.value.length);\n            var sbm = session.$backMarkers[session.$tagHighlight];\n            if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) {\n                session.removeMarker(session.$tagHighlight);\n                session.$tagHighlight = null;\n            }\n            \n            if (range && !session.$tagHighlight)\n                session.$tagHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n        }, 50);\n    };\n    this.focus = function() {\n        var _self = this;\n        setTimeout(function() {\n            _self.textInput.focus();\n        });\n        this.textInput.focus();\n    };\n    this.isFocused = function() {\n        return this.textInput.isFocused();\n    };\n    this.blur = function() {\n        this.textInput.blur();\n    };\n    this.onFocus = function(e) {\n        if (this.$isFocused)\n            return;\n        this.$isFocused = true;\n        this.renderer.showCursor();\n        this.renderer.visualizeFocus();\n        this._emit(\"focus\", e);\n    };\n    this.onBlur = function(e) {\n        if (!this.$isFocused)\n            return;\n        this.$isFocused = false;\n        this.renderer.hideCursor();\n        this.renderer.visualizeBlur();\n        this._emit(\"blur\", e);\n    };\n\n    this.$cursorChange = function() {\n        this.renderer.updateCursor();\n    };\n    this.onDocumentChange = function(delta) {\n        var wrap = this.session.$useWrapMode;\n        var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity);\n        this.renderer.updateLines(delta.start.row, lastRow, wrap);\n\n        this._signal(\"change\", delta);\n        this.$cursorChange();\n        this.$updateHighlightActiveLine();\n    };\n\n    this.onTokenizerUpdate = function(e) {\n        var rows = e.data;\n        this.renderer.updateLines(rows.first, rows.last);\n    };\n\n\n    this.onScrollTopChange = function() {\n        this.renderer.scrollToY(this.session.getScrollTop());\n    };\n\n    this.onScrollLeftChange = function() {\n        this.renderer.scrollToX(this.session.getScrollLeft());\n    };\n    this.onCursorChange = function() {\n        this.$cursorChange();\n\n        if (!this.$blockScrolling) {\n            config.warn(\"Automatically scrolling cursor into view after selection change\",\n                \"this will be disabled in the next version\",\n                \"set editor.$blockScrolling = Infinity to disable this message\"\n            );\n            this.renderer.scrollCursorIntoView();\n        }\n\n        this.$highlightBrackets();\n        this.$highlightTags();\n        this.$updateHighlightActiveLine();\n        this._signal(\"changeSelection\");\n    };\n\n    this.$updateHighlightActiveLine = function() {\n        var session = this.getSession();\n\n        var highlight;\n        if (this.$highlightActiveLine) {\n            if ((this.$selectionStyle != \"line\" || !this.selection.isMultiLine()))\n                highlight = this.getCursorPosition();\n            if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))\n                highlight = false;\n        }\n\n        if (session.$highlightLineMarker && !highlight) {\n            session.removeMarker(session.$highlightLineMarker.id);\n            session.$highlightLineMarker = null;\n        } else if (!session.$highlightLineMarker && highlight) {\n            var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n            range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n            session.$highlightLineMarker = range;\n        } else if (highlight) {\n            session.$highlightLineMarker.start.row = highlight.row;\n            session.$highlightLineMarker.end.row = highlight.row;\n            session.$highlightLineMarker.start.column = highlight.column;\n            session._signal(\"changeBackMarker\");\n        }\n    };\n\n    this.onSelectionChange = function(e) {\n        var session = this.session;\n\n        if (session.$selectionMarker) {\n            session.removeMarker(session.$selectionMarker);\n        }\n        session.$selectionMarker = null;\n\n        if (!this.selection.isEmpty()) {\n            var range = this.selection.getRange();\n            var style = this.getSelectionStyle();\n            session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n        } else {\n            this.$updateHighlightActiveLine();\n        }\n\n        var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n        this.session.highlight(re);\n\n        this._signal(\"changeSelection\");\n    };\n\n    this.$getSelectionHighLightRegexp = function() {\n        var session = this.session;\n\n        var selection = this.getSelectionRange();\n        if (selection.isEmpty() || selection.isMultiLine())\n            return;\n\n        var startOuter = selection.start.column - 1;\n        var endOuter = selection.end.column + 1;\n        var line = session.getLine(selection.start.row);\n        var lineCols = line.length;\n        var needle = line.substring(Math.max(startOuter, 0),\n                                    Math.min(endOuter, lineCols));\n        if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n            (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n            return;\n\n        needle = line.substring(selection.start.column, selection.end.column);\n        if (!/^[\\w\\d]+$/.test(needle))\n            return;\n\n        var re = this.$search.$assembleRegExp({\n            wholeWord: true,\n            caseSensitive: true,\n            needle: needle\n        });\n\n        return re;\n    };\n\n\n    this.onChangeFrontMarker = function() {\n        this.renderer.updateFrontMarkers();\n    };\n\n    this.onChangeBackMarker = function() {\n        this.renderer.updateBackMarkers();\n    };\n\n\n    this.onChangeBreakpoint = function() {\n        this.renderer.updateBreakpoints();\n    };\n\n    this.onChangeAnnotation = function() {\n        this.renderer.setAnnotations(this.session.getAnnotations());\n    };\n\n\n    this.onChangeMode = function(e) {\n        this.renderer.updateText();\n        this._emit(\"changeMode\", e);\n    };\n\n\n    this.onChangeWrapLimit = function() {\n        this.renderer.updateFull();\n    };\n\n    this.onChangeWrapMode = function() {\n        this.renderer.onResize(true);\n    };\n\n\n    this.onChangeFold = function() {\n        this.$updateHighlightActiveLine();\n        this.renderer.updateFull();\n    };\n    this.getSelectedText = function() {\n        return this.session.getTextRange(this.getSelectionRange());\n    };\n    this.getCopyText = function() {\n        var text = this.getSelectedText();\n        this._signal(\"copy\", text);\n        return text;\n    };\n    this.onCopy = function() {\n        this.commands.exec(\"copy\", this);\n    };\n    this.onCut = function() {\n        this.commands.exec(\"cut\", this);\n    };\n    this.onPaste = function(text, event) {\n        var e = {text: text, event: event};\n        this.commands.exec(\"paste\", this, e);\n    };\n    \n    this.$handlePaste = function(e) {\n        if (typeof e == \"string\") \n            e = {text: e};\n        this._signal(\"paste\", e);\n        var text = e.text;\n        if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n            this.insert(text);\n        } else {\n            var lines = text.split(/\\r\\n|\\r|\\n/);\n            var ranges = this.selection.rangeList.ranges;\n    \n            if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n                return this.commands.exec(\"insertstring\", this, text);\n    \n            for (var i = ranges.length; i--;) {\n                var range = ranges[i];\n                if (!range.isEmpty())\n                    this.session.remove(range);\n    \n                this.session.insert(range.start, lines[i]);\n            }\n        }\n    };\n\n    this.execCommand = function(command, args) {\n        return this.commands.exec(command, this, args);\n    };\n    this.insert = function(text, pasted) {\n        var session = this.session;\n        var mode = session.getMode();\n        var cursor = this.getCursorPosition();\n\n        if (this.getBehavioursEnabled() && !pasted) {\n            var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n            if (transform) {\n                if (text !== transform.text) {\n                    this.session.mergeUndoDeltas = false;\n                    this.$mergeNextCommand = false;\n                }\n                text = transform.text;\n\n            }\n        }\n        \n        if (text == \"\\t\")\n            text = this.session.getTabString();\n        if (!this.selection.isEmpty()) {\n            var range = this.getSelectionRange();\n            cursor = this.session.remove(range);\n            this.clearSelection();\n        }\n        else if (this.session.getOverwrite()) {\n            var range = new Range.fromPoints(cursor, cursor);\n            range.end.column += text.length;\n            this.session.remove(range);\n        }\n\n        if (text == \"\\n\" || text == \"\\r\\n\") {\n            var line = session.getLine(cursor.row);\n            if (cursor.column > line.search(/\\S|$/)) {\n                var d = line.substr(cursor.column).search(/\\S|$/);\n                session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n            }\n        }\n        this.clearSelection();\n\n        var start = cursor.column;\n        var lineState = session.getState(cursor.row);\n        var line = session.getLine(cursor.row);\n        var shouldOutdent = mode.checkOutdent(lineState, line, text);\n        var end = session.insert(cursor, text);\n\n        if (transform && transform.selection) {\n            if (transform.selection.length == 2) { // Transform relative to the current column\n                this.selection.setSelectionRange(\n                    new Range(cursor.row, start + transform.selection[0],\n                              cursor.row, start + transform.selection[1]));\n            } else { // Transform relative to the current row.\n                this.selection.setSelectionRange(\n                    new Range(cursor.row + transform.selection[0],\n                              transform.selection[1],\n                              cursor.row + transform.selection[2],\n                              transform.selection[3]));\n            }\n        }\n\n        if (session.getDocument().isNewLine(text)) {\n            var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n            session.insert({row: cursor.row+1, column: 0}, lineIndent);\n        }\n        if (shouldOutdent)\n            mode.autoOutdent(lineState, session, cursor.row);\n    };\n\n    this.onTextInput = function(text) {\n        this.keyBinding.onTextInput(text);\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        this.keyBinding.onCommandKey(e, hashId, keyCode);\n    };\n    this.setOverwrite = function(overwrite) {\n        this.session.setOverwrite(overwrite);\n    };\n    this.getOverwrite = function() {\n        return this.session.getOverwrite();\n    };\n    this.toggleOverwrite = function() {\n        this.session.toggleOverwrite();\n    };\n    this.setScrollSpeed = function(speed) {\n        this.setOption(\"scrollSpeed\", speed);\n    };\n    this.getScrollSpeed = function() {\n        return this.getOption(\"scrollSpeed\");\n    };\n    this.setDragDelay = function(dragDelay) {\n        this.setOption(\"dragDelay\", dragDelay);\n    };\n    this.getDragDelay = function() {\n        return this.getOption(\"dragDelay\");\n    };\n    this.setSelectionStyle = function(val) {\n        this.setOption(\"selectionStyle\", val);\n    };\n    this.getSelectionStyle = function() {\n        return this.getOption(\"selectionStyle\");\n    };\n    this.setHighlightActiveLine = function(shouldHighlight) {\n        this.setOption(\"highlightActiveLine\", shouldHighlight);\n    };\n    this.getHighlightActiveLine = function() {\n        return this.getOption(\"highlightActiveLine\");\n    };\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.getOption(\"highlightGutterLine\");\n    };\n    this.setHighlightSelectedWord = function(shouldHighlight) {\n        this.setOption(\"highlightSelectedWord\", shouldHighlight);\n    };\n    this.getHighlightSelectedWord = function() {\n        return this.$highlightSelectedWord;\n    };\n\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.renderer.setAnimatedScroll(shouldAnimate);\n    };\n\n    this.getAnimatedScroll = function(){\n        return this.renderer.getAnimatedScroll();\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.renderer.setShowInvisibles(showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.renderer.getShowInvisibles();\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.renderer.setDisplayIndentGuides(display);\n    };\n\n    this.getDisplayIndentGuides = function() {\n        return this.renderer.getDisplayIndentGuides();\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.renderer.setShowPrintMargin(showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.renderer.getShowPrintMargin();\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.renderer.setPrintMarginColumn(showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.renderer.getPrintMarginColumn();\n    };\n    this.setReadOnly = function(readOnly) {\n        this.setOption(\"readOnly\", readOnly);\n    };\n    this.getReadOnly = function() {\n        return this.getOption(\"readOnly\");\n    };\n    this.setBehavioursEnabled = function (enabled) {\n        this.setOption(\"behavioursEnabled\", enabled);\n    };\n    this.getBehavioursEnabled = function () {\n        return this.getOption(\"behavioursEnabled\");\n    };\n    this.setWrapBehavioursEnabled = function (enabled) {\n        this.setOption(\"wrapBehavioursEnabled\", enabled);\n    };\n    this.getWrapBehavioursEnabled = function () {\n        return this.getOption(\"wrapBehavioursEnabled\");\n    };\n    this.setShowFoldWidgets = function(show) {\n        this.setOption(\"showFoldWidgets\", show);\n\n    };\n    this.getShowFoldWidgets = function() {\n        return this.getOption(\"showFoldWidgets\");\n    };\n\n    this.setFadeFoldWidgets = function(fade) {\n        this.setOption(\"fadeFoldWidgets\", fade);\n    };\n\n    this.getFadeFoldWidgets = function() {\n        return this.getOption(\"fadeFoldWidgets\");\n    };\n    this.remove = function(dir) {\n        if (this.selection.isEmpty()){\n            if (dir == \"left\")\n                this.selection.selectLeft();\n            else\n                this.selection.selectRight();\n        }\n\n        var range = this.getSelectionRange();\n        if (this.getBehavioursEnabled()) {\n            var session = this.session;\n            var state = session.getState(range.start.row);\n            var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n            if (range.end.column === 0) {\n                var text = session.getTextRange(range);\n                if (text[text.length - 1] == \"\\n\") {\n                    var line = session.getLine(range.end.row);\n                    if (/^\\s+$/.test(line)) {\n                        range.end.column = line.length;\n                    }\n                }\n            }\n            if (new_range)\n                range = new_range;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.removeWordRight = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordRight();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeWordLeft = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordLeft();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineStart = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineStart();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineEnd = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineEnd();\n\n        var range = this.getSelectionRange();\n        if (range.start.column == range.end.column && range.start.row == range.end.row) {\n            range.end.column = 0;\n            range.end.row++;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.splitLine = function() {\n        if (!this.selection.isEmpty()) {\n            this.session.remove(this.getSelectionRange());\n            this.clearSelection();\n        }\n\n        var cursor = this.getCursorPosition();\n        this.insert(\"\\n\");\n        this.moveCursorToPosition(cursor);\n    };\n    this.transposeLetters = function() {\n        if (!this.selection.isEmpty()) {\n            return;\n        }\n\n        var cursor = this.getCursorPosition();\n        var column = cursor.column;\n        if (column === 0)\n            return;\n\n        var line = this.session.getLine(cursor.row);\n        var swap, range;\n        if (column < line.length) {\n            swap = line.charAt(column) + line.charAt(column-1);\n            range = new Range(cursor.row, column-1, cursor.row, column+1);\n        }\n        else {\n            swap = line.charAt(column-1) + line.charAt(column-2);\n            range = new Range(cursor.row, column-2, cursor.row, column);\n        }\n        this.session.replace(range, swap);\n    };\n    this.toLowerCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toLowerCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.toUpperCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toUpperCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.indent = function() {\n        var session = this.session;\n        var range = this.getSelectionRange();\n\n        if (range.start.row < range.end.row) {\n            var rows = this.$getSelectedRows();\n            session.indentRows(rows.first, rows.last, \"\\t\");\n            return;\n        } else if (range.start.column < range.end.column) {\n            var text = session.getTextRange(range);\n            if (!/^\\s+$/.test(text)) {\n                var rows = this.$getSelectedRows();\n                session.indentRows(rows.first, rows.last, \"\\t\");\n                return;\n            }\n        }\n        \n        var line = session.getLine(range.start.row);\n        var position = range.start;\n        var size = session.getTabSize();\n        var column = session.documentToScreenColumn(position.row, position.column);\n\n        if (this.session.getUseSoftTabs()) {\n            var count = (size - column % size);\n            var indentString = lang.stringRepeat(\" \", count);\n        } else {\n            var count = column % size;\n            while (line[range.start.column - 1] == \" \" && count) {\n                range.start.column--;\n                count--;\n            }\n            this.selection.setSelectionRange(range);\n            indentString = \"\\t\";\n        }\n        return this.insert(indentString);\n    };\n    this.blockIndent = function() {\n        var rows = this.$getSelectedRows();\n        this.session.indentRows(rows.first, rows.last, \"\\t\");\n    };\n    this.blockOutdent = function() {\n        var selection = this.session.getSelection();\n        this.session.outdentRows(selection.getRange());\n    };\n    this.sortLines = function() {\n        var rows = this.$getSelectedRows();\n        var session = this.session;\n\n        var lines = [];\n        for (i = rows.first; i <= rows.last; i++)\n            lines.push(session.getLine(i));\n\n        lines.sort(function(a, b) {\n            if (a.toLowerCase() < b.toLowerCase()) return -1;\n            if (a.toLowerCase() > b.toLowerCase()) return 1;\n            return 0;\n        });\n\n        var deleteRange = new Range(0, 0, 0, 0);\n        for (var i = rows.first; i <= rows.last; i++) {\n            var line = session.getLine(i);\n            deleteRange.start.row = i;\n            deleteRange.end.row = i;\n            deleteRange.end.column = line.length;\n            session.replace(deleteRange, lines[i-rows.first]);\n        }\n    };\n    this.toggleCommentLines = function() {\n        var state = this.session.getState(this.getCursorPosition().row);\n        var rows = this.$getSelectedRows();\n        this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n    };\n\n    this.toggleBlockComment = function() {\n        var cursor = this.getCursorPosition();\n        var state = this.session.getState(cursor.row);\n        var range = this.getSelectionRange();\n        this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n    };\n    this.getNumberAt = function(row, column) {\n        var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n        _numberRx.lastIndex = 0;\n\n        var s = this.session.getLine(row);\n        while (_numberRx.lastIndex < column) {\n            var m = _numberRx.exec(s);\n            if(m.index <= column && m.index+m[0].length >= column){\n                var number = {\n                    value: m[0],\n                    start: m.index,\n                    end: m.index+m[0].length\n                };\n                return number;\n            }\n        }\n        return null;\n    };\n    this.modifyNumber = function(amount) {\n        var row = this.selection.getCursor().row;\n        var column = this.selection.getCursor().column;\n        var charRange = new Range(row, column-1, row, column);\n\n        var c = this.session.getTextRange(charRange);\n        if (!isNaN(parseFloat(c)) && isFinite(c)) {\n            var nr = this.getNumberAt(row, column);\n            if (nr) {\n                var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n                var decimals = nr.start + nr.value.length - fp;\n\n                var t = parseFloat(nr.value);\n                t *= Math.pow(10, decimals);\n\n\n                if(fp !== nr.end && column < fp){\n                    amount *= Math.pow(10, nr.end - column - 1);\n                } else {\n                    amount *= Math.pow(10, nr.end - column);\n                }\n\n                t += amount;\n                t /= Math.pow(10, decimals);\n                var nnr = t.toFixed(decimals);\n                var replaceRange = new Range(row, nr.start, row, nr.end);\n                this.session.replace(replaceRange, nnr);\n                this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n            }\n        }\n    };\n    this.removeLines = function() {\n        var rows = this.$getSelectedRows();\n        this.session.removeFullLines(rows.first, rows.last);\n        this.clearSelection();\n    };\n\n    this.duplicateSelection = function() {\n        var sel = this.selection;\n        var doc = this.session;\n        var range = sel.getRange();\n        var reverse = sel.isBackwards();\n        if (range.isEmpty()) {\n            var row = range.start.row;\n            doc.duplicateLines(row, row);\n        } else {\n            var point = reverse ? range.start : range.end;\n            var endPoint = doc.insert(point, doc.getTextRange(range), false);\n            range.start = point;\n            range.end = endPoint;\n\n            sel.setSelectionRange(range, reverse);\n        }\n    };\n    this.moveLinesDown = function() {\n        this.$moveLines(1, false);\n    };\n    this.moveLinesUp = function() {\n        this.$moveLines(-1, false);\n    };\n    this.moveText = function(range, toPosition, copy) {\n        return this.session.moveText(range, toPosition, copy);\n    };\n    this.copyLinesUp = function() {\n        this.$moveLines(-1, true);\n    };\n    this.copyLinesDown = function() {\n        this.$moveLines(1, true);\n    };\n    this.$moveLines = function(dir, copy) {\n        var rows, moved;\n        var selection = this.selection;\n        if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n            var range = selection.toOrientedRange();\n            rows = this.$getSelectedRows(range);\n            moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n            if (copy && dir == -1) moved = 0;\n            range.moveBy(moved, 0);\n            selection.fromOrientedRange(range);\n        } else {\n            var ranges = selection.rangeList.ranges;\n            selection.rangeList.detach(this.session);\n            this.inVirtualSelectionMode = true;\n            \n            var diff = 0;\n            var totalDiff = 0;\n            var l = ranges.length;\n            for (var i = 0; i < l; i++) {\n                var rangeIndex = i;\n                ranges[i].moveBy(diff, 0);\n                rows = this.$getSelectedRows(ranges[i]);\n                var first = rows.first;\n                var last = rows.last;\n                while (++i < l) {\n                    if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n                    var subRows = this.$getSelectedRows(ranges[i]);\n                    if (copy && subRows.first != last)\n                        break;\n                    else if (!copy && subRows.first > last + 1)\n                        break;\n                    last = subRows.last;\n                }\n                i--;\n                diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n                if (copy && dir == -1) rangeIndex = i + 1;\n                while (rangeIndex <= i) {\n                    ranges[rangeIndex].moveBy(diff, 0);\n                    rangeIndex++;\n                }\n                if (!copy) diff = 0;\n                totalDiff += diff;\n            }\n            \n            selection.fromOrientedRange(selection.ranges[0]);\n            selection.rangeList.attach(this.session);\n            this.inVirtualSelectionMode = false;\n        }\n    };\n    this.$getSelectedRows = function(range) {\n        range = (range || this.getSelectionRange()).collapseRows();\n\n        return {\n            first: this.session.getRowFoldStart(range.start.row),\n            last: this.session.getRowFoldEnd(range.end.row)\n        };\n    };\n\n    this.onCompositionStart = function(text) {\n        this.renderer.showComposition(this.getCursorPosition());\n    };\n\n    this.onCompositionUpdate = function(text) {\n        this.renderer.setCompositionText(text);\n    };\n\n    this.onCompositionEnd = function() {\n        this.renderer.hideComposition();\n    };\n    this.getFirstVisibleRow = function() {\n        return this.renderer.getFirstVisibleRow();\n    };\n    this.getLastVisibleRow = function() {\n        return this.renderer.getLastVisibleRow();\n    };\n    this.isRowVisible = function(row) {\n        return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n    };\n    this.isRowFullyVisible = function(row) {\n        return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n    };\n    this.$getVisibleRowCount = function() {\n        return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n    };\n\n    this.$moveByPage = function(dir, select) {\n        var renderer = this.renderer;\n        var config = this.renderer.layerConfig;\n        var rows = dir * Math.floor(config.height / config.lineHeight);\n\n        this.$blockScrolling++;\n        if (select === true) {\n            this.selection.$moveSelection(function(){\n                this.moveCursorBy(rows, 0);\n            });\n        } else if (select === false) {\n            this.selection.moveCursorBy(rows, 0);\n            this.selection.clearSelection();\n        }\n        this.$blockScrolling--;\n\n        var scrollTop = renderer.scrollTop;\n\n        renderer.scrollBy(0, rows * config.lineHeight);\n        if (select != null)\n            renderer.scrollCursorIntoView(null, 0.5);\n\n        renderer.animateScrolling(scrollTop);\n    };\n    this.selectPageDown = function() {\n        this.$moveByPage(1, true);\n    };\n    this.selectPageUp = function() {\n        this.$moveByPage(-1, true);\n    };\n    this.gotoPageDown = function() {\n       this.$moveByPage(1, false);\n    };\n    this.gotoPageUp = function() {\n        this.$moveByPage(-1, false);\n    };\n    this.scrollPageDown = function() {\n        this.$moveByPage(1);\n    };\n    this.scrollPageUp = function() {\n        this.$moveByPage(-1);\n    };\n    this.scrollToRow = function(row) {\n        this.renderer.scrollToRow(row);\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        this.renderer.scrollToLine(line, center, animate, callback);\n    };\n    this.centerSelection = function() {\n        var range = this.getSelectionRange();\n        var pos = {\n            row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n            column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n        };\n        this.renderer.alignCursor(pos, 0.5);\n    };\n    this.getCursorPosition = function() {\n        return this.selection.getCursor();\n    };\n    this.getCursorPositionScreen = function() {\n        return this.session.documentToScreenPosition(this.getCursorPosition());\n    };\n    this.getSelectionRange = function() {\n        return this.selection.getRange();\n    };\n    this.selectAll = function() {\n        this.$blockScrolling += 1;\n        this.selection.selectAll();\n        this.$blockScrolling -= 1;\n    };\n    this.clearSelection = function() {\n        this.selection.clearSelection();\n    };\n    this.moveCursorTo = function(row, column) {\n        this.selection.moveCursorTo(row, column);\n    };\n    this.moveCursorToPosition = function(pos) {\n        this.selection.moveCursorToPosition(pos);\n    };\n    this.jumpToMatching = function(select, expand) {\n        var cursor = this.getCursorPosition();\n        var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n        var prevToken = iterator.getCurrentToken();\n        var token = prevToken || iterator.stepForward();\n\n        if (!token) return;\n        var matchType;\n        var found = false;\n        var depth = {};\n        var i = cursor.column - token.start;\n        var bracketType;\n        var brackets = {\n            \")\": \"(\",\n            \"(\": \"(\",\n            \"]\": \"[\",\n            \"[\": \"[\",\n            \"{\": \"{\",\n            \"}\": \"{\"\n        };\n        \n        do {\n            if (token.value.match(/[{}()\\[\\]]/g)) {\n                for (; i < token.value.length && !found; i++) {\n                    if (!brackets[token.value[i]]) {\n                        continue;\n                    }\n\n                    bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n                    if (isNaN(depth[bracketType])) {\n                        depth[bracketType] = 0;\n                    }\n\n                    switch (token.value[i]) {\n                        case '(':\n                        case '[':\n                        case '{':\n                            depth[bracketType]++;\n                            break;\n                        case ')':\n                        case ']':\n                        case '}':\n                            depth[bracketType]--;\n\n                            if (depth[bracketType] === -1) {\n                                matchType = 'bracket';\n                                found = true;\n                            }\n                        break;\n                    }\n                }\n            }\n            else if (token && token.type.indexOf('tag-name') !== -1) {\n                if (isNaN(depth[token.value])) {\n                    depth[token.value] = 0;\n                }\n                \n                if (prevToken.value === '<') {\n                    depth[token.value]++;\n                }\n                else if (prevToken.value === '</') {\n                    depth[token.value]--;\n                }\n                \n                if (depth[token.value] === -1) {\n                    matchType = 'tag';\n                    found = true;\n                }\n            }\n\n            if (!found) {\n                prevToken = token;\n                token = iterator.stepForward();\n                i = 0;\n            }\n        } while (token && !found);\n        if (!matchType)\n            return;\n\n        var range, pos;\n        if (matchType === 'bracket') {\n            range = this.session.getBracketRange(cursor);\n            if (!range) {\n                range = new Range(\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + i - 1,\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + i - 1\n                );\n                pos = range.start;\n                if (expand || pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2)\n                    range = this.session.getBracketRange(pos);\n            }\n        }\n        else if (matchType === 'tag') {\n            if (token && token.type.indexOf('tag-name') !== -1) \n                var tag = token.value;\n            else\n                return;\n\n            range = new Range(\n                iterator.getCurrentTokenRow(),\n                iterator.getCurrentTokenColumn() - 2,\n                iterator.getCurrentTokenRow(),\n                iterator.getCurrentTokenColumn() - 2\n            );\n            if (range.compare(cursor.row, cursor.column) === 0) {\n                found = false;\n                do {\n                    token = prevToken;\n                    prevToken = iterator.stepBackward();\n                    \n                    if (prevToken) {\n                        if (prevToken.type.indexOf('tag-close') !== -1) {\n                            range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1);\n                        }\n\n                        if (token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                            if (prevToken.value === '<') {\n                                depth[tag]++;\n                            }\n                            else if (prevToken.value === '</') {\n                                depth[tag]--;\n                            }\n                            \n                            if (depth[tag] === 0)\n                                found = true;\n                        }\n                    }\n                } while (prevToken && !found);\n            }\n            if (token && token.type.indexOf('tag-name')) {\n                pos = range.start;\n                if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)\n                    pos = range.end;\n            }\n        }\n\n        pos = range && range.cursor || pos;\n        if (pos) {\n            if (select) {\n                if (range && expand) {\n                    this.selection.setRange(range);\n                } else if (range && range.isEqual(this.getSelectionRange())) {\n                    this.clearSelection();\n                } else {\n                    this.selection.selectTo(pos.row, pos.column);\n                }\n            } else {\n                this.selection.moveTo(pos.row, pos.column);\n            }\n        }\n    };\n    this.gotoLine = function(lineNumber, column, animate) {\n        this.selection.clearSelection();\n        this.session.unfold({row: lineNumber - 1, column: column || 0});\n\n        this.$blockScrolling += 1;\n        this.exitMultiSelectMode && this.exitMultiSelectMode();\n        this.moveCursorTo(lineNumber - 1, column || 0);\n        this.$blockScrolling -= 1;\n\n        if (!this.isRowFullyVisible(lineNumber - 1))\n            this.scrollToLine(lineNumber - 1, true, animate);\n    };\n    this.navigateTo = function(row, column) {\n        this.selection.moveTo(row, column);\n    };\n    this.navigateUp = function(times) {\n        if (this.selection.isMultiLine() && !this.selection.isBackwards()) {\n            var selectionStart = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionStart);\n        }\n        this.selection.clearSelection();\n        this.selection.moveCursorBy(-times || -1, 0);\n    };\n    this.navigateDown = function(times) {\n        if (this.selection.isMultiLine() && this.selection.isBackwards()) {\n            var selectionEnd = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionEnd);\n        }\n        this.selection.clearSelection();\n        this.selection.moveCursorBy(times || 1, 0);\n    };\n    this.navigateLeft = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionStart = this.getSelectionRange().start;\n            this.moveCursorToPosition(selectionStart);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorLeft();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateRight = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionEnd = this.getSelectionRange().end;\n            this.moveCursorToPosition(selectionEnd);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorRight();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateLineStart = function() {\n        this.selection.moveCursorLineStart();\n        this.clearSelection();\n    };\n    this.navigateLineEnd = function() {\n        this.selection.moveCursorLineEnd();\n        this.clearSelection();\n    };\n    this.navigateFileEnd = function() {\n        this.selection.moveCursorFileEnd();\n        this.clearSelection();\n    };\n    this.navigateFileStart = function() {\n        this.selection.moveCursorFileStart();\n        this.clearSelection();\n    };\n    this.navigateWordRight = function() {\n        this.selection.moveCursorWordRight();\n        this.clearSelection();\n    };\n    this.navigateWordLeft = function() {\n        this.selection.moveCursorWordLeft();\n        this.clearSelection();\n    };\n    this.replace = function(replacement, options) {\n        if (options)\n            this.$search.set(options);\n\n        var range = this.$search.find(this.session);\n        var replaced = 0;\n        if (!range)\n            return replaced;\n\n        if (this.$tryReplace(range, replacement)) {\n            replaced = 1;\n        }\n        if (range !== null) {\n            this.selection.setSelectionRange(range);\n            this.renderer.scrollSelectionIntoView(range.start, range.end);\n        }\n\n        return replaced;\n    };\n    this.replaceAll = function(replacement, options) {\n        if (options) {\n            this.$search.set(options);\n        }\n\n        var ranges = this.$search.findAll(this.session);\n        var replaced = 0;\n        if (!ranges.length)\n            return replaced;\n\n        this.$blockScrolling += 1;\n\n        var selection = this.getSelectionRange();\n        this.selection.moveTo(0, 0);\n\n        for (var i = ranges.length - 1; i >= 0; --i) {\n            if(this.$tryReplace(ranges[i], replacement)) {\n                replaced++;\n            }\n        }\n\n        this.selection.setSelectionRange(selection);\n        this.$blockScrolling -= 1;\n\n        return replaced;\n    };\n\n    this.$tryReplace = function(range, replacement) {\n        var input = this.session.getTextRange(range);\n        replacement = this.$search.replace(input, replacement);\n        if (replacement !== null) {\n            range.end = this.session.replace(range, replacement);\n            return range;\n        } else {\n            return null;\n        }\n    };\n    this.getLastSearchOptions = function() {\n        return this.$search.getOptions();\n    };\n    this.find = function(needle, options, animate) {\n        if (!options)\n            options = {};\n\n        if (typeof needle == \"string\" || needle instanceof RegExp)\n            options.needle = needle;\n        else if (typeof needle == \"object\")\n            oop.mixin(options, needle);\n\n        var range = this.selection.getRange();\n        if (options.needle == null) {\n            needle = this.session.getTextRange(range)\n                || this.$search.$options.needle;\n            if (!needle) {\n                range = this.session.getWordRange(range.start.row, range.start.column);\n                needle = this.session.getTextRange(range);\n            }\n            this.$search.set({needle: needle});\n        }\n\n        this.$search.set(options);\n        if (!options.start)\n            this.$search.set({start: range});\n\n        var newRange = this.$search.find(this.session);\n        if (options.preventScroll)\n            return newRange;\n        if (newRange) {\n            this.revealRange(newRange, animate);\n            return newRange;\n        }\n        if (options.backwards)\n            range.start = range.end;\n        else\n            range.end = range.start;\n        this.selection.setRange(range);\n    };\n    this.findNext = function(options, animate) {\n        this.find({skipCurrent: true, backwards: false}, options, animate);\n    };\n    this.findPrevious = function(options, animate) {\n        this.find(options, {skipCurrent: true, backwards: true}, animate);\n    };\n\n    this.revealRange = function(range, animate) {\n        this.$blockScrolling += 1;\n        this.session.unfold(range);\n        this.selection.setSelectionRange(range);\n        this.$blockScrolling -= 1;\n\n        var scrollTop = this.renderer.scrollTop;\n        this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n        if (animate !== false)\n            this.renderer.animateScrolling(scrollTop);\n    };\n    this.undo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().undo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.redo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().redo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.destroy = function() {\n        this.renderer.destroy();\n        this._signal(\"destroy\", this);\n        if (this.session) {\n            this.session.destroy();\n        }\n    };\n    this.setAutoScrollEditorIntoView = function(enable) {\n        if (!enable)\n            return;\n        var rect;\n        var self = this;\n        var shouldScroll = false;\n        if (!this.$scrollAnchor)\n            this.$scrollAnchor = document.createElement(\"div\");\n        var scrollAnchor = this.$scrollAnchor;\n        scrollAnchor.style.cssText = \"position:absolute\";\n        this.container.insertBefore(scrollAnchor, this.container.firstChild);\n        var onChangeSelection = this.on(\"changeSelection\", function() {\n            shouldScroll = true;\n        });\n        var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n            if (shouldScroll)\n                rect = self.renderer.container.getBoundingClientRect();\n        });\n        var onAfterRender = this.renderer.on(\"afterRender\", function() {\n            if (shouldScroll && rect && (self.isFocused()\n                || self.searchBox && self.searchBox.isFocused())\n            ) {\n                var renderer = self.renderer;\n                var pos = renderer.$cursorLayer.$pixelPos;\n                var config = renderer.layerConfig;\n                var top = pos.top - config.offset;\n                if (pos.top >= 0 && top + rect.top < 0) {\n                    shouldScroll = true;\n                } else if (pos.top < config.height &&\n                    pos.top + rect.top + config.lineHeight > window.innerHeight) {\n                    shouldScroll = false;\n                } else {\n                    shouldScroll = null;\n                }\n                if (shouldScroll != null) {\n                    scrollAnchor.style.top = top + \"px\";\n                    scrollAnchor.style.left = pos.left + \"px\";\n                    scrollAnchor.style.height = config.lineHeight + \"px\";\n                    scrollAnchor.scrollIntoView(shouldScroll);\n                }\n                shouldScroll = rect = null;\n            }\n        });\n        this.setAutoScrollEditorIntoView = function(enable) {\n            if (enable)\n                return;\n            delete this.setAutoScrollEditorIntoView;\n            this.off(\"changeSelection\", onChangeSelection);\n            this.renderer.off(\"afterRender\", onAfterRender);\n            this.renderer.off(\"beforeRender\", onBeforeRender);\n        };\n    };\n\n\n    this.$resetCursorStyle = function() {\n        var style = this.$cursorStyle || \"ace\";\n        var cursorLayer = this.renderer.$cursorLayer;\n        if (!cursorLayer)\n            return;\n        cursorLayer.setSmoothBlinking(/smooth/.test(style));\n        cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n        dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n    };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n    selectionStyle: {\n        set: function(style) {\n            this.onSelectionChange();\n            this._signal(\"changeSelectionStyle\", {data: style});\n        },\n        initialValue: \"line\"\n    },\n    highlightActiveLine: {\n        set: function() {this.$updateHighlightActiveLine();},\n        initialValue: true\n    },\n    highlightSelectedWord: {\n        set: function(shouldHighlight) {this.$onSelectionChange();},\n        initialValue: true\n    },\n    readOnly: {\n        set: function(readOnly) {\n            this.$resetCursorStyle(); \n        },\n        initialValue: false\n    },\n    cursorStyle: {\n        set: function(val) { this.$resetCursorStyle(); },\n        values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n        initialValue: \"ace\"\n    },\n    mergeUndoDeltas: {\n        values: [false, true, \"always\"],\n        initialValue: true\n    },\n    behavioursEnabled: {initialValue: true},\n    wrapBehavioursEnabled: {initialValue: true},\n    autoScrollEditorIntoView: {\n        set: function(val) {this.setAutoScrollEditorIntoView(val)}\n    },\n    keyboardHandler: {\n        set: function(val) { this.setKeyboardHandler(val); },\n        get: function() { return this.keybindingId; },\n        handlesSet: true\n    },\n\n    hScrollBarAlwaysVisible: \"renderer\",\n    vScrollBarAlwaysVisible: \"renderer\",\n    highlightGutterLine: \"renderer\",\n    animatedScroll: \"renderer\",\n    showInvisibles: \"renderer\",\n    showPrintMargin: \"renderer\",\n    printMarginColumn: \"renderer\",\n    printMargin: \"renderer\",\n    fadeFoldWidgets: \"renderer\",\n    showFoldWidgets: \"renderer\",\n    showLineNumbers: \"renderer\",\n    showGutter: \"renderer\",\n    displayIndentGuides: \"renderer\",\n    fontSize: \"renderer\",\n    fontFamily: \"renderer\",\n    maxLines: \"renderer\",\n    minLines: \"renderer\",\n    scrollPastEnd: \"renderer\",\n    fixedWidthGutter: \"renderer\",\n    theme: \"renderer\",\n\n    scrollSpeed: \"$mouseHandler\",\n    dragDelay: \"$mouseHandler\",\n    dragEnabled: \"$mouseHandler\",\n    focusTimout: \"$mouseHandler\",\n    tooltipFollowsMouse: \"$mouseHandler\",\n\n    firstLineNumber: \"session\",\n    overwrite: \"session\",\n    newLineMode: \"session\",\n    useWorker: \"session\",\n    useSoftTabs: \"session\",\n    tabSize: \"session\",\n    wrap: \"session\",\n    indentedSoftWrap: \"session\",\n    foldStyle: \"session\",\n    mode: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n    this.reset();\n};\n\n(function() {\n    this.execute = function(options) {\n        var deltaSets = options.args[0];\n        this.$doc  = options.args[1];\n        if (options.merge && this.hasUndo()){\n            this.dirtyCounter--;\n            deltaSets = this.$undoStack.pop().concat(deltaSets);\n        }\n        this.$undoStack.push(deltaSets);\n        this.$redoStack = [];\n        if (this.dirtyCounter < 0) {\n            this.dirtyCounter = NaN;\n        }\n        this.dirtyCounter++;\n    };\n    this.undo = function(dontSelect) {\n        var deltaSets = this.$undoStack.pop();\n        var undoSelectionRange = null;\n        if (deltaSets) {\n            undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\n            this.$redoStack.push(deltaSets);\n            this.dirtyCounter--;\n        }\n\n        return undoSelectionRange;\n    };\n    this.redo = function(dontSelect) {\n        var deltaSets = this.$redoStack.pop();\n        var redoSelectionRange = null;\n        if (deltaSets) {\n            redoSelectionRange =\n                this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\n            this.$undoStack.push(deltaSets);\n            this.dirtyCounter++;\n        }\n        return redoSelectionRange;\n    };\n    this.reset = function() {\n        this.$undoStack = [];\n        this.$redoStack = [];\n        this.dirtyCounter = 0;\n    };\n    this.hasUndo = function() {\n        return this.$undoStack.length > 0;\n    };\n    this.hasRedo = function() {\n        return this.$redoStack.length > 0;\n    };\n    this.markClean = function() {\n        this.dirtyCounter = 0;\n    };\n    this.isClean = function() {\n        return this.dirtyCounter === 0;\n    };\n    this.$serializeDeltas = function(deltaSets) {\n        return cloneDeltaSetsObj(deltaSets, $serializeDelta);\n    };\n    this.$deserializeDeltas = function(deltaSets) {\n        return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\n    };\n    \n    function $serializeDelta(delta){\n        return {\n            action: delta.action,\n            start: delta.start,\n            end: delta.end,\n            lines: delta.lines.length == 1 ? null : delta.lines,\n            text: delta.lines.length == 1 ? delta.lines[0] : null\n        };\n    }\n        \n    function $deserializeDelta(delta) {\n        return {\n            action: delta.action,\n            start: delta.start,\n            end: delta.end,\n            lines: delta.lines || [delta.text]\n        };\n    }\n    \n    function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\n        var deltaSets_new = new Array(deltaSets_old.length);\n        for (var i = 0; i < deltaSets_old.length; i++) {\n            var deltaSet_old = deltaSets_old[i];\n            var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\n            \n            for (var j = 0; j < deltaSet_old.deltas.length; j++) {\n                var delta_old = deltaSet_old.deltas[j];\n                deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\n            }\n            \n            deltaSets_new[i] = deltaSet_new;\n        }\n        return deltaSets_new;\n    }\n    \n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\nace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar lang = acequire(\"../lib/lang\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Gutter = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_gutter-layer\";\n    parentEl.appendChild(this.element);\n    this.setShowFoldWidgets(this.$showFoldWidgets);\n    \n    this.gutterWidth = 0;\n\n    this.$annotations = [];\n    this.$updateAnnotations = this.$updateAnnotations.bind(this);\n\n    this.$cells = [];\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.setSession = function(session) {\n        if (this.session)\n            this.session.removeEventListener(\"change\", this.$updateAnnotations);\n        this.session = session;\n        if (session)\n            session.on(\"change\", this.$updateAnnotations);\n    };\n\n    this.addGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n        this.session.addGutterDecoration(row, className);\n    };\n\n    this.removeGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n        this.session.removeGutterDecoration(row, className);\n    };\n\n    this.setAnnotations = function(annotations) {\n        this.$annotations = [];\n        for (var i = 0; i < annotations.length; i++) {\n            var annotation = annotations[i];\n            var row = annotation.row;\n            var rowInfo = this.$annotations[row];\n            if (!rowInfo)\n                rowInfo = this.$annotations[row] = {text: []};\n           \n            var annoText = annotation.text;\n            annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\n            if (rowInfo.text.indexOf(annoText) === -1)\n                rowInfo.text.push(annoText);\n\n            var type = annotation.type;\n            if (type == \"error\")\n                rowInfo.className = \" ace_error\";\n            else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n                rowInfo.className = \" ace_warning\";\n            else if (type == \"info\" && (!rowInfo.className))\n                rowInfo.className = \" ace_info\";\n        }\n    };\n\n    this.$updateAnnotations = function (delta) {\n        if (!this.$annotations.length)\n            return;\n        var firstRow = delta.start.row;\n        var len = delta.end.row - firstRow;\n        if (len === 0) {\n        } else if (delta.action == 'remove') {\n            this.$annotations.splice(firstRow, len + 1, null);\n        } else {\n            var args = new Array(len + 1);\n            args.unshift(firstRow, 1);\n            this.$annotations.splice.apply(this.$annotations, args);\n        }\n    };\n\n    this.update = function(config) {\n        var session = this.session;\n        var firstRow = config.firstRow;\n        var lastRow = Math.min(config.lastRow + config.gutterOffset,  // needed to compensate for hor scollbar\n            session.getLength() - 1);\n        var fold = session.getNextFoldLine(firstRow);\n        var foldStart = fold ? fold.start.row : Infinity;\n        var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n        var breakpoints = session.$breakpoints;\n        var decorations = session.$decorations;\n        var firstLineNumber = session.$firstLineNumber;\n        var lastLineNumber = 0;\n        \n        var gutterRenderer = session.gutterRenderer || this.$renderer;\n\n        var cell = null;\n        var index = -1;\n        var row = firstRow;\n        while (true) {\n            if (row > foldStart) {\n                row = fold.end.row + 1;\n                fold = session.getNextFoldLine(row, fold);\n                foldStart = fold ? fold.start.row : Infinity;\n            }\n            if (row > lastRow) {\n                while (this.$cells.length > index + 1) {\n                    cell = this.$cells.pop();\n                    this.element.removeChild(cell.element);\n                }\n                break;\n            }\n\n            cell = this.$cells[++index];\n            if (!cell) {\n                cell = {element: null, textNode: null, foldWidget: null};\n                cell.element = dom.createElement(\"div\");\n                cell.textNode = document.createTextNode('');\n                cell.element.appendChild(cell.textNode);\n                this.element.appendChild(cell.element);\n                this.$cells[index] = cell;\n            }\n\n            var className = \"ace_gutter-cell \";\n            if (breakpoints[row])\n                className += breakpoints[row];\n            if (decorations[row])\n                className += decorations[row];\n            if (this.$annotations[row])\n                className += this.$annotations[row].className;\n            if (cell.element.className != className)\n                cell.element.className = className;\n\n            var height = session.getRowLength(row) * config.lineHeight + \"px\";\n            if (height != cell.element.style.height)\n                cell.element.style.height = height;\n\n            if (foldWidgets) {\n                var c = foldWidgets[row];\n                if (c == null)\n                    c = foldWidgets[row] = session.getFoldWidget(row);\n            }\n\n            if (c) {\n                if (!cell.foldWidget) {\n                    cell.foldWidget = dom.createElement(\"span\");\n                    cell.element.appendChild(cell.foldWidget);\n                }\n                var className = \"ace_fold-widget ace_\" + c;\n                if (c == \"start\" && row == foldStart && row < fold.end.row)\n                    className += \" ace_closed\";\n                else\n                    className += \" ace_open\";\n                if (cell.foldWidget.className != className)\n                    cell.foldWidget.className = className;\n\n                var height = config.lineHeight + \"px\";\n                if (cell.foldWidget.style.height != height)\n                    cell.foldWidget.style.height = height;\n            } else {\n                if (cell.foldWidget) {\n                    cell.element.removeChild(cell.foldWidget);\n                    cell.foldWidget = null;\n                }\n            }\n            \n            var text = lastLineNumber = gutterRenderer\n                ? gutterRenderer.getText(session, row)\n                : row + firstLineNumber;\n            if (text != cell.textNode.data)\n                cell.textNode.data = text;\n\n            row++;\n        }\n\n        this.element.style.height = config.minHeight + \"px\";\n\n        if (this.$fixedWidth || session.$useWrapMode)\n            lastLineNumber = session.getLength() + firstLineNumber;\n\n        var gutterWidth = gutterRenderer \n            ? gutterRenderer.getWidth(session, lastLineNumber, config)\n            : lastLineNumber.toString().length * config.characterWidth;\n        \n        var padding = this.$padding || this.$computePadding();\n        gutterWidth += padding.left + padding.right;\n        if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n            this.gutterWidth = gutterWidth;\n            this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n            this._emit(\"changeGutterWidth\", gutterWidth);\n        }\n    };\n\n    this.$fixedWidth = false;\n    \n    this.$showLineNumbers = true;\n    this.$renderer = \"\";\n    this.setShowLineNumbers = function(show) {\n        this.$renderer = !show && {\n            getWidth: function() {return \"\"},\n            getText: function() {return \"\"}\n        };\n    };\n    \n    this.getShowLineNumbers = function() {\n        return this.$showLineNumbers;\n    };\n    \n    this.$showFoldWidgets = true;\n    this.setShowFoldWidgets = function(show) {\n        if (show)\n            dom.addCssClass(this.element, \"ace_folding-enabled\");\n        else\n            dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n        this.$showFoldWidgets = show;\n        this.$padding = null;\n    };\n    \n    this.getShowFoldWidgets = function() {\n        return this.$showFoldWidgets;\n    };\n\n    this.$computePadding = function() {\n        if (!this.element.firstChild)\n            return {left: 0, right: 0};\n        var style = dom.computedStyle(this.element.firstChild);\n        this.$padding = {};\n        this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n        this.$padding.right = parseInt(style.paddingRight) || 0;\n        return this.$padding;\n    };\n\n    this.getRegion = function(point) {\n        var padding = this.$padding || this.$computePadding();\n        var rect = this.element.getBoundingClientRect();\n        if (point.x < padding.left + rect.left)\n            return \"markers\";\n        if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n            return \"foldWidgets\";\n    };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar dom = acequire(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_marker-layer\";\n    parentEl.appendChild(this.element);\n};\n\n(function() {\n\n    this.$padding = 0;\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n    this.setSession = function(session) {\n        this.session = session;\n    };\n    \n    this.setMarkers = function(markers) {\n        this.markers = markers;\n    };\n\n    this.update = function(config) {\n        var config = config || this.config;\n        if (!config)\n            return;\n\n        this.config = config;\n\n\n        var html = [];\n        for (var key in this.markers) {\n            var marker = this.markers[key];\n\n            if (!marker.range) {\n                marker.update(html, this, this.session, config);\n                continue;\n            }\n\n            var range = marker.range.clipRows(config.firstRow, config.lastRow);\n            if (range.isEmpty()) continue;\n\n            range = range.toScreenRange(this.session);\n            if (marker.renderer) {\n                var top = this.$getTop(range.start.row, config);\n                var left = this.$padding + range.start.column * config.characterWidth;\n                marker.renderer(html, range, left, top, config);\n            } else if (marker.type == \"fullLine\") {\n                this.drawFullLineMarker(html, range, marker.clazz, config);\n            } else if (marker.type == \"screenLine\") {\n                this.drawScreenLineMarker(html, range, marker.clazz, config);\n            } else if (range.isMultiLine()) {\n                if (marker.type == \"text\")\n                    this.drawTextMarker(html, range, marker.clazz, config);\n                else\n                    this.drawMultiLineMarker(html, range, marker.clazz, config);\n            } else {\n                this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n            }\n        }\n        this.element.innerHTML = html.join(\"\");\n    };\n\n    this.$getTop = function(row, layerConfig) {\n        return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n    };\n\n    function getBorderClass(tl, tr, br, bl) {\n        return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n    }\n    this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n        var session = this.session;\n        var start = range.start.row;\n        var end = range.end.row;\n        var row = start;\n        var prev = 0; \n        var curr = 0;\n        var next = session.getScreenLastRowColumn(row);\n        var lineRange = new Range(row, range.start.column, row, curr);\n        for (; row <= end; row++) {\n            lineRange.start.row = lineRange.end.row = row;\n            lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n            lineRange.end.column = next;\n            prev = curr;\n            curr = next;\n            next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n            this.drawSingleLineMarker(stringBuilder, lineRange, \n                clazz + (row == start  ? \" ace_start\" : \"\") + \" ace_br\"\n                    + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),\n                layerConfig, row == end ? 0 : 1, extraStyle);\n        }\n    };\n    this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var padding = this.$padding;\n        var height = config.lineHeight;\n        var top = this.$getTop(range.start.row, config);\n        var left = padding + range.start.column * config.characterWidth;\n        extraStyle = extraStyle || \"\";\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \" ace_br1 ace_start' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;\", extraStyle, \"'></div>\"\n        );\n        top = this.$getTop(range.end.row, config);\n        var width = range.end.column * config.characterWidth;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \" ace_br12' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\n        );\n        height = (range.end.row - range.start.row - 1) * config.lineHeight;\n        if (height <= 0)\n            return;\n        top = this.$getTop(range.start.row + 1, config);\n        \n        var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n        stringBuilder.push(\n            \"<div class='\", clazz, (radiusClass ? \" ace_br\" + radiusClass : \"\"), \"' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\n        );\n    };\n    this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n        var height = config.lineHeight;\n        var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n        var top = this.$getTop(range.start.row, config);\n        var left = this.$padding + range.start.column * config.characterWidth;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n\n    this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n        if (range.start.row != range.end.row)\n            height += this.$getTop(range.end.row, config) - top;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n    \n    this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_text-layer\";\n    parentEl.appendChild(this.element);\n    this.$updateEolChar = this.$updateEolChar.bind(this);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.EOF_CHAR = \"\\xB6\";\n    this.EOL_CHAR_LF = \"\\xAC\";\n    this.EOL_CHAR_CRLF = \"\\xa4\";\n    this.EOL_CHAR = this.EOL_CHAR_LF;\n    this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n    this.SPACE_CHAR = \"\\xB7\";\n    this.$padding = 0;\n\n    this.$updateEolChar = function() {\n        var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n           ? this.EOL_CHAR_LF\n           : this.EOL_CHAR_CRLF;\n        if (this.EOL_CHAR != EOL_CHAR) {\n            this.EOL_CHAR = EOL_CHAR;\n            return true;\n        }\n    }\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.element.style.padding = \"0 \" + padding + \"px\";\n    };\n\n    this.getLineHeight = function() {\n        return this.$fontMetrics.$characterSize.height || 0;\n    };\n\n    this.getCharacterWidth = function() {\n        return this.$fontMetrics.$characterSize.width || 0;\n    };\n    \n    this.$setFontMetrics = function(measure) {\n        this.$fontMetrics = measure;\n        this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n            this._signal(\"changeCharacterSize\", e);\n        }.bind(this));\n        this.$pollSizeChanges();\n    }\n\n    this.checkForSizeChanges = function() {\n        this.$fontMetrics.checkForSizeChanges();\n    };\n    this.$pollSizeChanges = function() {\n        return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n    };\n    this.setSession = function(session) {\n        this.session = session;\n        if (session)\n            this.$computeTabString();\n    };\n\n    this.showInvisibles = false;\n    this.setShowInvisibles = function(showInvisibles) {\n        if (this.showInvisibles == showInvisibles)\n            return false;\n\n        this.showInvisibles = showInvisibles;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.displayIndentGuides = true;\n    this.setDisplayIndentGuides = function(display) {\n        if (this.displayIndentGuides == display)\n            return false;\n\n        this.displayIndentGuides = display;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.$tabStrings = [];\n    this.onChangeTabSize =\n    this.$computeTabString = function() {\n        var tabSize = this.session.getTabSize();\n        this.tabSize = tabSize;\n        var tabStr = this.$tabStrings = [0];\n        for (var i = 1; i < tabSize + 1; i++) {\n            if (this.showInvisibles) {\n                tabStr.push(\"<span class='ace_invisible ace_invisible_tab'>\"\n                    + lang.stringRepeat(this.TAB_CHAR, i)\n                    + \"</span>\");\n            } else {\n                tabStr.push(lang.stringRepeat(\" \", i));\n            }\n        }\n        if (this.displayIndentGuides) {\n            this.$indentGuideRe =  /\\s\\S| \\t|\\t |\\s$/;\n            var className = \"ace_indent-guide\";\n            var spaceClass = \"\";\n            var tabClass = \"\";\n            if (this.showInvisibles) {\n                className += \" ace_invisible\";\n                spaceClass = \" ace_invisible_space\";\n                tabClass = \" ace_invisible_tab\";\n                var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n                var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\n            } else{\n                var spaceContent = lang.stringRepeat(\" \", this.tabSize);\n                var tabContent = spaceContent;\n            }\n\n            this.$tabStrings[\" \"] = \"<span class='\" + className + spaceClass + \"'>\" + spaceContent + \"</span>\";\n            this.$tabStrings[\"\\t\"] = \"<span class='\" + className + tabClass + \"'>\" + tabContent + \"</span>\";\n        }\n    };\n\n    this.updateLines = function(config, firstRow, lastRow) {\n        if (this.config.lastRow != config.lastRow ||\n            this.config.firstRow != config.firstRow) {\n            this.scrollLines(config);\n        }\n        this.config = config;\n\n        var first = Math.max(firstRow, config.firstRow);\n        var last = Math.min(lastRow, config.lastRow);\n\n        var lineElements = this.element.childNodes;\n        var lineElementsIdx = 0;\n\n        for (var row = config.firstRow; row < first; row++) {\n            var foldLine = this.session.getFoldLine(row);\n            if (foldLine) {\n                if (foldLine.containsRow(first)) {\n                    first = foldLine.start.row;\n                    break;\n                } else {\n                    row = foldLine.end.row;\n                }\n            }\n            lineElementsIdx ++;\n        }\n\n        var row = first;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > last)\n                break;\n\n            var lineElement = lineElements[lineElementsIdx++];\n            if (lineElement) {\n                var html = [];\n                this.$renderLine(\n                    html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n                );\n                lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n                lineElement.innerHTML = html.join(\"\");\n            }\n            row++;\n        }\n    };\n\n    this.scrollLines = function(config) {\n        var oldConfig = this.config;\n        this.config = config;\n\n        if (!oldConfig || oldConfig.lastRow < config.firstRow)\n            return this.update(config);\n\n        if (config.lastRow < oldConfig.firstRow)\n            return this.update(config);\n\n        var el = this.element;\n        if (oldConfig.firstRow < config.firstRow)\n            for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n                el.removeChild(el.firstChild);\n\n        if (oldConfig.lastRow > config.lastRow)\n            for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n                el.removeChild(el.lastChild);\n\n        if (config.firstRow < oldConfig.firstRow) {\n            var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n            if (el.firstChild)\n                el.insertBefore(fragment, el.firstChild);\n            else\n                el.appendChild(fragment);\n        }\n\n        if (config.lastRow > oldConfig.lastRow) {\n            var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n            el.appendChild(fragment);\n        }\n    };\n\n    this.$renderLinesFragment = function(config, firstRow, lastRow) {\n        var fragment = this.element.ownerDocument.createDocumentFragment();\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row : Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            var container = dom.createElement(\"div\");\n\n            var html = [];\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n            container.innerHTML = html.join(\"\");\n            if (this.$useLineGroups()) {\n                container.className = 'ace_line_group';\n                fragment.appendChild(container);\n                container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n            } else {\n                while(container.firstChild)\n                    fragment.appendChild(container.firstChild);\n            }\n\n            row++;\n        }\n        return fragment;\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var html = [];\n        var firstRow = config.firstRow, lastRow = config.lastRow;\n\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            if (this.$useLineGroups())\n                html.push(\"<div class='ace_line_group' style='height:\", config.lineHeight*this.session.getRowLength(row), \"px'>\")\n\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n            if (this.$useLineGroups())\n                html.push(\"</div>\"); // end the line group\n\n            row++;\n        }\n        this.element.innerHTML = html.join(\"\");\n    };\n\n    this.$textToken = {\n        \"text\": true,\n        \"rparen\": true,\n        \"lparen\": true\n    };\n\n    this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n        var self = this;\n        var replaceReg = /\\t|&|<|>|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF\\uFFF9-\\uFFFC])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]/g;\n        var replaceFunc = function(c, a, b, tabIdx, idx4) {\n            if (a) {\n                return self.showInvisibles\n                    ? \"<span class='ace_invisible ace_invisible_space'>\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"</span>\"\n                    : c;\n            } else if (c == \"&\") {\n                return \"&#38;\";\n            } else if (c == \"<\") {\n                return \"&#60;\";\n            } else if (c == \">\") {\n                return \"&#62;\";\n            } else if (c == \"\\t\") {\n                var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n                screenColumn += tabSize - 1;\n                return self.$tabStrings[tabSize];\n            } else if (c == \"\\u3000\") {\n                var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n                var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n                screenColumn += 1;\n                return \"<span class='\" + classToUse + \"' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + space + \"</span>\";\n            } else if (b) {\n                return \"<span class='ace_invisible ace_invisible_space ace_invalid'>\" + self.SPACE_CHAR + \"</span>\";\n            } else {\n                screenColumn += 1;\n                return \"<span class='ace_cjk' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + c + \"</span>\";\n            }\n        };\n\n        var output = value.replace(replaceReg, replaceFunc);\n\n        if (!this.$textToken[token.type]) {\n            var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n            var style = \"\";\n            if (token.type == \"fold\")\n                style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n            stringBuilder.push(\"<span class='\", classes, \"'\", style, \">\", output, \"</span>\");\n        }\n        else {\n            stringBuilder.push(output);\n        }\n        return screenColumn + value.length;\n    };\n\n    this.renderIndentGuide = function(stringBuilder, value, max) {\n        var cols = value.search(this.$indentGuideRe);\n        if (cols <= 0 || cols >= max)\n            return value;\n        if (value[0] == \" \") {\n            cols -= cols % this.tabSize;\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n            return value.substr(cols);\n        } else if (value[0] == \"\\t\") {\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n            return value.substr(cols);\n        }\n        return value;\n    };\n\n    this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n        var chars = 0;\n        var split = 0;\n        var splitChars = splits[0];\n        var screenColumn = 0;\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            var value = token.value;\n            if (i == 0 && this.displayIndentGuides) {\n                chars = value.length;\n                value = this.renderIndentGuide(stringBuilder, value, splitChars);\n                if (!value)\n                    continue;\n                chars -= value.length;\n            }\n\n            if (chars + value.length < splitChars) {\n                screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n                chars += value.length;\n            } else {\n                while (chars + value.length >= splitChars) {\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn,\n                        token, value.substring(0, splitChars - chars)\n                    );\n                    value = value.substring(splitChars - chars);\n                    chars = splitChars;\n\n                    if (!onlyContents) {\n                        stringBuilder.push(\"</div>\",\n                            \"<div class='ace_line' style='height:\",\n                            this.config.lineHeight, \"px'>\"\n                        );\n                    }\n\n                    stringBuilder.push(lang.stringRepeat(\"\\xa0\", splits.indent));\n\n                    split ++;\n                    screenColumn = 0;\n                    splitChars = splits[split] || Number.MAX_VALUE;\n                }\n                if (value.length != 0) {\n                    chars += value.length;\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn, token, value\n                    );\n                }\n            }\n        }\n    };\n\n    this.$renderSimpleLine = function(stringBuilder, tokens) {\n        var screenColumn = 0;\n        var token = tokens[0];\n        var value = token.value;\n        if (this.displayIndentGuides)\n            value = this.renderIndentGuide(stringBuilder, value);\n        if (value)\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        for (var i = 1; i < tokens.length; i++) {\n            token = tokens[i];\n            value = token.value;\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        }\n    };\n    this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n        if (!foldLine && foldLine != false)\n            foldLine = this.session.getFoldLine(row);\n\n        if (foldLine)\n            var tokens = this.$getFoldLineTokens(row, foldLine);\n        else\n            var tokens = this.session.getTokens(row);\n\n\n        if (!onlyContents) {\n            stringBuilder.push(\n                \"<div class='ace_line' style='height:\", \n                    this.config.lineHeight * (\n                        this.$useLineGroups() ? 1 :this.session.getRowLength(row)\n                    ), \"px'>\"\n            );\n        }\n\n        if (tokens.length) {\n            var splits = this.session.getRowSplitData(row);\n            if (splits && splits.length)\n                this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n            else\n                this.$renderSimpleLine(stringBuilder, tokens);\n        }\n\n        if (this.showInvisibles) {\n            if (foldLine)\n                row = foldLine.end.row\n\n            stringBuilder.push(\n                \"<span class='ace_invisible ace_invisible_eol'>\",\n                row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n                \"</span>\"\n            );\n        }\n        if (!onlyContents)\n            stringBuilder.push(\"</div>\");\n    };\n\n    this.$getFoldLineTokens = function(row, foldLine) {\n        var session = this.session;\n        var renderTokens = [];\n\n        function addTokens(tokens, from, to) {\n            var idx = 0, col = 0;\n            while ((col + tokens[idx].value.length) < from) {\n                col += tokens[idx].value.length;\n                idx++;\n\n                if (idx == tokens.length)\n                    return;\n            }\n            if (col != from) {\n                var value = tokens[idx].value.substring(from - col);\n                if (value.length > (to - from))\n                    value = value.substring(0, to - from);\n\n                renderTokens.push({\n                    type: tokens[idx].type,\n                    value: value\n                });\n\n                col = from + value.length;\n                idx += 1;\n            }\n\n            while (col < to && idx < tokens.length) {\n                var value = tokens[idx].value;\n                if (value.length + col > to) {\n                    renderTokens.push({\n                        type: tokens[idx].type,\n                        value: value.substring(0, to - col)\n                    });\n                } else\n                    renderTokens.push(tokens[idx]);\n                col += value.length;\n                idx += 1;\n            }\n        }\n\n        var tokens = session.getTokens(row);\n        foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n            if (placeholder != null) {\n                renderTokens.push({\n                    type: \"fold\",\n                    value: placeholder\n                });\n            } else {\n                if (isNewRow)\n                    tokens = session.getTokens(row);\n\n                if (tokens.length)\n                    addTokens(tokens, lastColumn, column);\n            }\n        }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n        return renderTokens;\n    };\n\n    this.$useLineGroups = function() {\n        return this.session.getUseWrapMode();\n    };\n\n    this.destroy = function() {\n        clearInterval(this.$pollSizeChangesTimer);\n        if (this.$measureNode)\n            this.$measureNode.parentNode.removeChild(this.$measureNode);\n        delete this.$measureNode;\n    };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar isIE8;\n\nvar Cursor = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_cursor-layer\";\n    parentEl.appendChild(this.element);\n    \n    if (isIE8 === undefined)\n        isIE8 = !(\"opacity\" in this.element.style);\n\n    this.isVisible = false;\n    this.isBlinking = true;\n    this.blinkInterval = 1000;\n    this.smoothBlinking = false;\n\n    this.cursors = [];\n    this.cursor = this.addCursor();\n    dom.addCssClass(this.element, \"ace_hidden-cursors\");\n    this.$updateCursors = (isIE8\n        ? this.$updateVisibility\n        : this.$updateOpacity).bind(this);\n};\n\n(function() {\n    \n    this.$updateVisibility = function(val) {\n        var cursors = this.cursors;\n        for (var i = cursors.length; i--; )\n            cursors[i].style.visibility = val ? \"\" : \"hidden\";\n    };\n    this.$updateOpacity = function(val) {\n        var cursors = this.cursors;\n        for (var i = cursors.length; i--; )\n            cursors[i].style.opacity = val ? \"\" : \"0\";\n    };\n    \n\n    this.$padding = 0;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n\n    this.setSession = function(session) {\n        this.session = session;\n    };\n\n    this.setBlinking = function(blinking) {\n        if (blinking != this.isBlinking){\n            this.isBlinking = blinking;\n            this.restartTimer();\n        }\n    };\n\n    this.setBlinkInterval = function(blinkInterval) {\n        if (blinkInterval != this.blinkInterval){\n            this.blinkInterval = blinkInterval;\n            this.restartTimer();\n        }\n    };\n\n    this.setSmoothBlinking = function(smoothBlinking) {\n        if (smoothBlinking != this.smoothBlinking && !isIE8) {\n            this.smoothBlinking = smoothBlinking;\n            dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n            this.$updateCursors(true);\n            this.$updateCursors = (this.$updateOpacity).bind(this);\n            this.restartTimer();\n        }\n    };\n\n    this.addCursor = function() {\n        var el = dom.createElement(\"div\");\n        el.className = \"ace_cursor\";\n        this.element.appendChild(el);\n        this.cursors.push(el);\n        return el;\n    };\n\n    this.removeCursor = function() {\n        if (this.cursors.length > 1) {\n            var el = this.cursors.pop();\n            el.parentNode.removeChild(el);\n            return el;\n        }\n    };\n\n    this.hideCursor = function() {\n        this.isVisible = false;\n        dom.addCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.showCursor = function() {\n        this.isVisible = true;\n        dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.restartTimer = function() {\n        var update = this.$updateCursors;\n        clearInterval(this.intervalId);\n        clearTimeout(this.timeoutId);\n        if (this.smoothBlinking) {\n            dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n        }\n        \n        update(true);\n\n        if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n            return;\n\n        if (this.smoothBlinking) {\n            setTimeout(function(){\n                dom.addCssClass(this.element, \"ace_smooth-blinking\");\n            }.bind(this));\n        }\n        \n        var blink = function(){\n            this.timeoutId = setTimeout(function() {\n                update(false);\n            }, 0.6 * this.blinkInterval);\n        }.bind(this);\n\n        this.intervalId = setInterval(function() {\n            update(true);\n            blink();\n        }, this.blinkInterval);\n\n        blink();\n    };\n\n    this.getPixelPosition = function(position, onScreen) {\n        if (!this.config || !this.session)\n            return {left : 0, top : 0};\n\n        if (!position)\n            position = this.session.selection.getCursor();\n        var pos = this.session.documentToScreenPosition(position);\n        var cursorLeft = this.$padding + pos.column * this.config.characterWidth;\n        var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n            this.config.lineHeight;\n\n        return {left : cursorLeft, top : cursorTop};\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var selections = this.session.$selectionMarkers;\n        var i = 0, cursorIndex = 0;\n\n        if (selections === undefined || selections.length === 0){\n            selections = [{cursor: null}];\n        }\n\n        for (var i = 0, n = selections.length; i < n; i++) {\n            var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n            if ((pixelPos.top > config.height + config.offset ||\n                 pixelPos.top < 0) && i > 1) {\n                continue;\n            }\n\n            var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n            \n            if (!this.drawCursor) {\n                style.left = pixelPos.left + \"px\";\n                style.top = pixelPos.top + \"px\";\n                style.width = config.characterWidth + \"px\";\n                style.height = config.lineHeight + \"px\";\n            } else {\n                this.drawCursor(style, pixelPos, config, selections[i], this.session);\n            }\n        }\n        while (this.cursors.length > cursorIndex)\n            this.removeCursor();\n\n        var overwrite = this.session.getOverwrite();\n        this.$setOverwrite(overwrite);\n        this.$pixelPos = pixelPos;\n        this.restartTimer();\n    };\n    \n    this.drawCursor = null;\n\n    this.$setOverwrite = function(overwrite) {\n        if (overwrite != this.overwrite) {\n            this.overwrite = overwrite;\n            if (overwrite)\n                dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n            else\n                dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n        }\n    };\n\n    this.destroy = function() {\n        clearInterval(this.intervalId);\n        clearTimeout(this.timeoutId);\n    };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\nvar ScrollBar = function(parent) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n    this.inner = dom.createElement(\"div\");\n    this.inner.className = \"ace_scrollbar-inner\";\n    this.element.appendChild(this.inner);\n\n    parent.appendChild(this.element);\n\n    this.setVisible(false);\n    this.skipEvent = false;\n\n    event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n    event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n\n    this.setVisible = function(isVisible) {\n        this.element.style.display = isVisible ? \"\" : \"none\";\n        this.isVisible = isVisible;\n        this.coeff = 1;\n    };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n    ScrollBar.call(this, parent);\n    this.scrollTop = 0;\n    this.scrollHeight = 0;\n    renderer.$scrollbarWidth = \n    this.width = dom.scrollbarWidth(parent.ownerDocument);\n    this.inner.style.width =\n    this.element.style.width = (this.width || 15) + 5 + \"px\";\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n    this.classSuffix = '-v';\n    this.onScroll = function() {\n        if (!this.skipEvent) {\n            this.scrollTop = this.element.scrollTop;\n            if (this.coeff != 1) {\n                var h = this.element.clientHeight / this.scrollHeight;\n                this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n            }\n            this._emit(\"scroll\", {data: this.scrollTop});\n        }\n        this.skipEvent = false;\n    };\n    this.getWidth = function() {\n        return this.isVisible ? this.width : 0;\n    };\n    this.setHeight = function(height) {\n        this.element.style.height = height + \"px\";\n    };\n    this.setInnerHeight =\n    this.setScrollHeight = function(height) {\n        this.scrollHeight = height;\n        if (height > MAX_SCROLL_H) {\n            this.coeff = MAX_SCROLL_H / height;\n            height = MAX_SCROLL_H;\n        } else if (this.coeff != 1) {\n            this.coeff = 1\n        }\n        this.inner.style.height = height + \"px\";\n    };\n    this.setScrollTop = function(scrollTop) {\n        if (this.scrollTop != scrollTop) {\n            this.skipEvent = true;\n            this.scrollTop = scrollTop;\n            this.element.scrollTop = scrollTop * this.coeff;\n        }\n    };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n    ScrollBar.call(this, parent);\n    this.scrollLeft = 0;\n    this.height = renderer.$scrollbarWidth;\n    this.inner.style.height =\n    this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n    this.classSuffix = '-h';\n    this.onScroll = function() {\n        if (!this.skipEvent) {\n            this.scrollLeft = this.element.scrollLeft;\n            this._emit(\"scroll\", {data: this.scrollLeft});\n        }\n        this.skipEvent = false;\n    };\n    this.getHeight = function() {\n        return this.isVisible ? this.height : 0;\n    };\n    this.setWidth = function(width) {\n        this.element.style.width = width + \"px\";\n    };\n    this.setInnerWidth = function(width) {\n        this.inner.style.width = width + \"px\";\n    };\n    this.setScrollWidth = function(width) {\n        this.inner.style.width = width + \"px\";\n    };\n    this.setScrollLeft = function(scrollLeft) {\n        if (this.scrollLeft != scrollLeft) {\n            this.skipEvent = true;\n            this.scrollLeft = this.element.scrollLeft = scrollLeft;\n        }\n    };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n    this.onRender = onRender;\n    this.pending = false;\n    this.changes = 0;\n    this.window = win || window;\n};\n\n(function() {\n\n\n    this.schedule = function(change) {\n        this.changes = this.changes | change;\n        if (!this.pending && this.changes) {\n            this.pending = true;\n            var _self = this;\n            event.nextFrame(function() {\n                _self.pending = false;\n                var changes;\n                while (changes = _self.changes) {\n                    _self.changes = 0;\n                    _self.onRender(changes);\n                }\n            }, this.window);\n        }\n    };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\n    this.el = dom.createElement(\"div\");\n    this.$setMeasureNodeStyles(this.el.style, true);\n    \n    this.$main = dom.createElement(\"div\");\n    this.$setMeasureNodeStyles(this.$main.style);\n    \n    this.$measureNode = dom.createElement(\"div\");\n    this.$setMeasureNodeStyles(this.$measureNode.style);\n    \n    \n    this.el.appendChild(this.$main);\n    this.el.appendChild(this.$measureNode);\n    parentEl.appendChild(this.el);\n    \n    if (!CHAR_COUNT)\n        this.$testFractionalRect();\n    this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n    \n    this.$characterSize = {width: 0, height: 0};\n    this.checkForSizeChanges();\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n        \n    this.$characterSize = {width: 0, height: 0};\n    \n    this.$testFractionalRect = function() {\n        var el = dom.createElement(\"div\");\n        this.$setMeasureNodeStyles(el.style);\n        el.style.width = \"0.2px\";\n        document.documentElement.appendChild(el);\n        var w = el.getBoundingClientRect().width;\n        if (w > 0 && w < 1)\n            CHAR_COUNT = 50;\n        else\n            CHAR_COUNT = 100;\n        el.parentNode.removeChild(el);\n    };\n    \n    this.$setMeasureNodeStyles = function(style, isRoot) {\n        style.width = style.height = \"auto\";\n        style.left = style.top = \"0px\";\n        style.visibility = \"hidden\";\n        style.position = \"absolute\";\n        style.whiteSpace = \"pre\";\n\n        if (useragent.isIE < 8) {\n            style[\"font-family\"] = \"inherit\";\n        } else {\n            style.font = \"inherit\";\n        }\n        style.overflow = isRoot ? \"hidden\" : \"visible\";\n    };\n\n    this.checkForSizeChanges = function() {\n        var size = this.$measureSizes();\n        if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n            this.$measureNode.style.fontWeight = \"bold\";\n            var boldSize = this.$measureSizes();\n            this.$measureNode.style.fontWeight = \"\";\n            this.$characterSize = size;\n            this.charSizes = Object.create(null);\n            this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n            this._emit(\"changeCharacterSize\", {data: size});\n        }\n    };\n\n    this.$pollSizeChanges = function() {\n        if (this.$pollSizeChangesTimer)\n            return this.$pollSizeChangesTimer;\n        var self = this;\n        return this.$pollSizeChangesTimer = setInterval(function() {\n            self.checkForSizeChanges();\n        }, 500);\n    };\n    \n    this.setPolling = function(val) {\n        if (val) {\n            this.$pollSizeChanges();\n        } else if (this.$pollSizeChangesTimer) {\n            clearInterval(this.$pollSizeChangesTimer);\n            this.$pollSizeChangesTimer = 0;\n        }\n    };\n\n    this.$measureSizes = function() {\n        if (CHAR_COUNT === 50) {\n            var rect = null;\n            try { \n               rect = this.$measureNode.getBoundingClientRect();\n            } catch(e) {\n               rect = {width: 0, height:0 };\n            }\n            var size = {\n                height: rect.height,\n                width: rect.width / CHAR_COUNT\n            };\n        } else {\n            var size = {\n                height: this.$measureNode.clientHeight,\n                width: this.$measureNode.clientWidth / CHAR_COUNT\n            };\n        }\n        if (size.width === 0 || size.height === 0)\n            return null;\n        return size;\n    };\n\n    this.$measureCharWidth = function(ch) {\n        this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\n        var rect = this.$main.getBoundingClientRect();\n        return rect.width / CHAR_COUNT;\n    };\n    \n    this.getCharacterWidth = function(ch) {\n        var w = this.charSizes[ch];\n        if (w === undefined) {\n            w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n        }\n        return w;\n    };\n\n    this.destroy = function() {\n        clearInterval(this.$pollSizeChangesTimer);\n        if (this.el && this.el.parentNode)\n            this.el.parentNode.removeChild(this.el);\n    };\n\n}).call(FontMetrics.prototype);\n\n});\n\nace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar config = acequire(\"./config\");\nvar useragent = acequire(\"./lib/useragent\");\nvar GutterLayer = acequire(\"./layer/gutter\").Gutter;\nvar MarkerLayer = acequire(\"./layer/marker\").Marker;\nvar TextLayer = acequire(\"./layer/text\").Text;\nvar CursorLayer = acequire(\"./layer/cursor\").Cursor;\nvar HScrollBar = acequire(\"./scrollbar\").HScrollBar;\nvar VScrollBar = acequire(\"./scrollbar\").VScrollBar;\nvar RenderLoop = acequire(\"./renderloop\").RenderLoop;\nvar FontMetrics = acequire(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: inherit;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-webkit-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_editor.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block;   \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.ace_br1 {border-top-left-radius    : 3px;}\\\n.ace_br2 {border-top-right-radius   : 3px;}\\\n.ace_br3 {border-top-left-radius    : 3px; border-top-right-radius:    3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius    : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius   : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius    : 3px; border-bottom-left-radius:  3px;}\\\n.ace_br10{border-top-right-radius   : 3px; border-bottom-left-radius:  3px;}\\\n.ace_br11{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-left-radius:  3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}\\\n.ace_br13{border-top-left-radius    : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}\\\n.ace_br14{border-top-right-radius   : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}\\\n.ace_br15{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor.css\");\n\nvar VirtualRenderer = function(container, theme) {\n    var _self = this;\n\n    this.container = container || dom.createElement(\"div\");\n    this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\n    dom.addCssClass(this.container, \"ace_editor\");\n\n    this.setTheme(theme);\n\n    this.$gutter = dom.createElement(\"div\");\n    this.$gutter.className = \"ace_gutter\";\n    this.container.appendChild(this.$gutter);\n\n    this.scroller = dom.createElement(\"div\");\n    this.scroller.className = \"ace_scroller\";\n    this.container.appendChild(this.scroller);\n\n    this.content = dom.createElement(\"div\");\n    this.content.className = \"ace_content\";\n    this.scroller.appendChild(this.content);\n\n    this.$gutterLayer = new GutterLayer(this.$gutter);\n    this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n    this.$markerBack = new MarkerLayer(this.content);\n\n    var textLayer = this.$textLayer = new TextLayer(this.content);\n    this.canvas = textLayer.element;\n\n    this.$markerFront = new MarkerLayer(this.content);\n\n    this.$cursorLayer = new CursorLayer(this.content);\n    this.$horizScroll = false;\n    this.$vScroll = false;\n\n    this.scrollBar = \n    this.scrollBarV = new VScrollBar(this.container, this);\n    this.scrollBarH = new HScrollBar(this.container, this);\n    this.scrollBarV.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n    });\n    this.scrollBarH.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n    });\n\n    this.scrollTop = 0;\n    this.scrollLeft = 0;\n\n    this.cursorPos = {\n        row : 0,\n        column : 0\n    };\n\n    this.$fontMetrics = new FontMetrics(this.container);\n    this.$textLayer.$setFontMetrics(this.$fontMetrics);\n    this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n        _self.updateCharacterSize();\n        _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n        _self._signal(\"changeCharacterSize\", e);\n    });\n\n    this.$size = {\n        width: 0,\n        height: 0,\n        scrollerHeight: 0,\n        scrollerWidth: 0,\n        $dirty: true\n    };\n\n    this.layerConfig = {\n        width : 1,\n        padding : 0,\n        firstRow : 0,\n        firstRowScreen: 0,\n        lastRow : 0,\n        lineHeight : 0,\n        characterWidth : 0,\n        minHeight : 1,\n        maxHeight : 1,\n        offset : 0,\n        height : 1,\n        gutterOffset: 1\n    };\n    \n    this.scrollMargin = {\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        v: 0,\n        h: 0\n    };\n\n    this.$loop = new RenderLoop(\n        this.$renderChanges.bind(this),\n        this.container.ownerDocument.defaultView\n    );\n    this.$loop.schedule(this.CHANGE_FULL);\n\n    this.updateCharacterSize();\n    this.setPadding(4);\n    config.resetOptions(this);\n    config._emit(\"renderer\", this);\n};\n\n(function() {\n\n    this.CHANGE_CURSOR = 1;\n    this.CHANGE_MARKER = 2;\n    this.CHANGE_GUTTER = 4;\n    this.CHANGE_SCROLL = 8;\n    this.CHANGE_LINES = 16;\n    this.CHANGE_TEXT = 32;\n    this.CHANGE_SIZE = 64;\n    this.CHANGE_MARKER_BACK = 128;\n    this.CHANGE_MARKER_FRONT = 256;\n    this.CHANGE_FULL = 512;\n    this.CHANGE_H_SCROLL = 1024;\n\n    oop.implement(this, EventEmitter);\n\n    this.updateCharacterSize = function() {\n        if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n            this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n            this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n        }\n\n        this.layerConfig.characterWidth =\n        this.characterWidth = this.$textLayer.getCharacterWidth();\n        this.layerConfig.lineHeight =\n        this.lineHeight = this.$textLayer.getLineHeight();\n        this.$updatePrintMargin();\n    };\n    this.setSession = function(session) {\n        if (this.session)\n            this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n            \n        this.session = session;\n        if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n            session.setScrollTop(-this.scrollMargin.top);\n\n        this.$cursorLayer.setSession(session);\n        this.$markerBack.setSession(session);\n        this.$markerFront.setSession(session);\n        this.$gutterLayer.setSession(session);\n        this.$textLayer.setSession(session);\n        if (!session)\n            return;\n        \n        this.$loop.schedule(this.CHANGE_FULL);\n        this.session.$setFontMetrics(this.$fontMetrics);\n        this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n        \n        this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n        this.onChangeNewLineMode()\n        this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n    };\n    this.updateLines = function(firstRow, lastRow, force) {\n        if (lastRow === undefined)\n            lastRow = Infinity;\n\n        if (!this.$changedLines) {\n            this.$changedLines = {\n                firstRow: firstRow,\n                lastRow: lastRow\n            };\n        }\n        else {\n            if (this.$changedLines.firstRow > firstRow)\n                this.$changedLines.firstRow = firstRow;\n\n            if (this.$changedLines.lastRow < lastRow)\n                this.$changedLines.lastRow = lastRow;\n        }\n        if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n            if (force)\n                this.$changedLines.lastRow = this.layerConfig.lastRow;\n            else\n                return;\n        }\n        if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n            return;\n        this.$loop.schedule(this.CHANGE_LINES);\n    };\n\n    this.onChangeNewLineMode = function() {\n        this.$loop.schedule(this.CHANGE_TEXT);\n        this.$textLayer.$updateEolChar();\n    };\n    \n    this.onChangeTabSize = function() {\n        this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n        this.$textLayer.onChangeTabSize();\n    };\n    this.updateText = function() {\n        this.$loop.schedule(this.CHANGE_TEXT);\n    };\n    this.updateFull = function(force) {\n        if (force)\n            this.$renderChanges(this.CHANGE_FULL, true);\n        else\n            this.$loop.schedule(this.CHANGE_FULL);\n    };\n    this.updateFontSize = function() {\n        this.$textLayer.checkForSizeChanges();\n    };\n\n    this.$changes = 0;\n    this.$updateSizeAsync = function() {\n        if (this.$loop.pending)\n            this.$size.$dirty = true;\n        else\n            this.onResize();\n    };\n    this.onResize = function(force, gutterWidth, width, height) {\n        if (this.resizing > 2)\n            return;\n        else if (this.resizing > 0)\n            this.resizing++;\n        else\n            this.resizing = force ? 1 : 0;\n        var el = this.container;\n        if (!height)\n            height = el.clientHeight || el.scrollHeight;\n        if (!width)\n            width = el.clientWidth || el.scrollWidth;\n        var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n        \n        if (!this.$size.scrollerHeight || (!width && !height))\n            return this.resizing = 0;\n\n        if (force)\n            this.$gutterLayer.$padding = null;\n\n        if (force)\n            this.$renderChanges(changes | this.$changes, true);\n        else\n            this.$loop.schedule(changes | this.$changes);\n\n        if (this.resizing)\n            this.resizing = 0;\n        this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n    };\n    \n    this.$updateCachedSize = function(force, gutterWidth, width, height) {\n        height -= (this.$extraHeight || 0);\n        var changes = 0;\n        var size = this.$size;\n        var oldSize = {\n            width: size.width,\n            height: size.height,\n            scrollerHeight: size.scrollerHeight,\n            scrollerWidth: size.scrollerWidth\n        };\n        if (height && (force || size.height != height)) {\n            size.height = height;\n            changes |= this.CHANGE_SIZE;\n\n            size.scrollerHeight = size.height;\n            if (this.$horizScroll)\n                size.scrollerHeight -= this.scrollBarH.getHeight();\n            this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n            changes = changes | this.CHANGE_SCROLL;\n        }\n\n        if (width && (force || size.width != width)) {\n            changes |= this.CHANGE_SIZE;\n            size.width = width;\n            \n            if (gutterWidth == null)\n                gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n            \n            this.gutterWidth = gutterWidth;\n            \n            this.scrollBarH.element.style.left = \n            this.scroller.style.left = gutterWidth + \"px\";\n            size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth());           \n            \n            this.scrollBarH.element.style.right = \n            this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n            this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n            if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n                changes |= this.CHANGE_FULL;\n        }\n        \n        size.$dirty = !width || !height;\n\n        if (changes)\n            this._signal(\"resize\", oldSize);\n\n        return changes;\n    };\n\n    this.onGutterResize = function() {\n        var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n        if (gutterWidth != this.gutterWidth)\n            this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n        if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else if (this.$size.$dirty) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else {\n            this.$computeLayerConfig();\n            this.$loop.schedule(this.CHANGE_MARKER);\n        }\n    };\n    this.adjustWrapLimit = function() {\n        var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n        var limit = Math.floor(availableWidth / this.characterWidth);\n        return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n    };\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.setOption(\"animatedScroll\", shouldAnimate);\n    };\n    this.getAnimatedScroll = function() {\n        return this.$animatedScroll;\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.setOption(\"showInvisibles\", showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.getOption(\"showInvisibles\");\n    };\n    this.getDisplayIndentGuides = function() {\n        return this.getOption(\"displayIndentGuides\");\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.setOption(\"displayIndentGuides\", display);\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.setOption(\"showPrintMargin\", showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.getOption(\"showPrintMargin\");\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.setOption(\"printMarginColumn\", showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.getOption(\"printMarginColumn\");\n    };\n    this.getShowGutter = function(){\n        return this.getOption(\"showGutter\");\n    };\n    this.setShowGutter = function(show){\n        return this.setOption(\"showGutter\", show);\n    };\n\n    this.getFadeFoldWidgets = function(){\n        return this.getOption(\"fadeFoldWidgets\")\n    };\n\n    this.setFadeFoldWidgets = function(show) {\n        this.setOption(\"fadeFoldWidgets\", show);\n    };\n\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.getOption(\"highlightGutterLine\");\n    };\n\n    this.$updateGutterLineHighlight = function() {\n        var pos = this.$cursorLayer.$pixelPos;\n        var height = this.layerConfig.lineHeight;\n        if (this.session.getUseWrapMode()) {\n            var cursor = this.session.selection.getCursor();\n            cursor.column = 0;\n            pos = this.$cursorLayer.getPixelPosition(cursor, true);\n            height *= this.session.getRowLength(cursor.row);\n        }\n        this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n        this.$gutterLineHighlight.style.height = height + \"px\";\n    };\n\n    this.$updatePrintMargin = function() {\n        if (!this.$showPrintMargin && !this.$printMarginEl)\n            return;\n\n        if (!this.$printMarginEl) {\n            var containerEl = dom.createElement(\"div\");\n            containerEl.className = \"ace_layer ace_print-margin-layer\";\n            this.$printMarginEl = dom.createElement(\"div\");\n            this.$printMarginEl.className = \"ace_print-margin\";\n            containerEl.appendChild(this.$printMarginEl);\n            this.content.insertBefore(containerEl, this.content.firstChild);\n        }\n\n        var style = this.$printMarginEl.style;\n        style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n        style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n        \n        if (this.session && this.session.$wrap == -1)\n            this.adjustWrapLimit();\n    };\n    this.getContainerElement = function() {\n        return this.container;\n    };\n    this.getMouseEventTarget = function() {\n        return this.scroller;\n    };\n    this.getTextAreaContainer = function() {\n        return this.container;\n    };\n    this.$moveTextAreaToCursor = function() {\n        if (!this.$keepTextAreaAtCursor)\n            return;\n        var config = this.layerConfig;\n        var posTop = this.$cursorLayer.$pixelPos.top;\n        var posLeft = this.$cursorLayer.$pixelPos.left;\n        posTop -= config.offset;\n\n        var style = this.textarea.style;\n        var h = this.lineHeight;\n        if (posTop < 0 || posTop > config.height - h) {\n            style.top = style.left = \"0\";\n            return;\n        }\n\n        var w = this.characterWidth;\n        if (this.$composition) {\n            var val = this.textarea.value.replace(/^\\x01+/, \"\");\n            w *= (this.session.$getStringScreenWidth(val)[0]+2);\n            h += 2;\n        }\n        posLeft -= this.scrollLeft;\n        if (posLeft > this.$size.scrollerWidth - w)\n            posLeft = this.$size.scrollerWidth - w;\n\n        posLeft += this.gutterWidth;\n        style.height = h + \"px\";\n        style.width = w + \"px\";\n        style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n        style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n    };\n    this.getFirstVisibleRow = function() {\n        return this.layerConfig.firstRow;\n    };\n    this.getFirstFullyVisibleRow = function() {\n        return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n    };\n    this.getLastFullyVisibleRow = function() {\n        var config = this.layerConfig;\n        var lastRow = config.lastRow\n        var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n        if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n            return lastRow - 1;\n        return lastRow;\n    };\n    this.getLastVisibleRow = function() {\n        return this.layerConfig.lastRow;\n    };\n\n    this.$padding = null;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.$textLayer.setPadding(padding);\n        this.$cursorLayer.setPadding(padding);\n        this.$markerFront.setPadding(padding);\n        this.$markerBack.setPadding(padding);\n        this.$loop.schedule(this.CHANGE_FULL);\n        this.$updatePrintMargin();\n    };\n    \n    this.setScrollMargin = function(top, bottom, left, right) {\n        var sm = this.scrollMargin;\n        sm.top = top|0;\n        sm.bottom = bottom|0;\n        sm.right = right|0;\n        sm.left = left|0;\n        sm.v = sm.top + sm.bottom;\n        sm.h = sm.left + sm.right;\n        if (sm.top && this.scrollTop <= 0 && this.session)\n            this.session.setScrollTop(-sm.top);\n        this.updateFull();\n    };\n    this.getHScrollBarAlwaysVisible = function() {\n        return this.$hScrollBarAlwaysVisible;\n    };\n    this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n        this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n    };\n    this.getVScrollBarAlwaysVisible = function() {\n        return this.$vScrollBarAlwaysVisible;\n    };\n    this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n        this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n    };\n\n    this.$updateScrollBarV = function() {\n        var scrollHeight = this.layerConfig.maxHeight;\n        var scrollerHeight = this.$size.scrollerHeight;\n        if (!this.$maxLines && this.$scrollPastEnd) {\n            scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n            if (this.scrollTop > scrollHeight - scrollerHeight) {\n                scrollHeight = this.scrollTop + scrollerHeight;\n                this.scrollBarV.scrollTop = null;\n            }\n        }\n        this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n        this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n    };\n    this.$updateScrollBarH = function() {\n        this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n        this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n    };\n    \n    this.$frozen = false;\n    this.freeze = function() {\n        this.$frozen = true;\n    };\n    \n    this.unfreeze = function() {\n        this.$frozen = false;\n    };\n\n    this.$renderChanges = function(changes, force) {\n        if (this.$changes) {\n            changes |= this.$changes;\n            this.$changes = 0;\n        }\n        if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n            this.$changes |= changes;\n            return; \n        } \n        if (this.$size.$dirty) {\n            this.$changes |= changes;\n            return this.onResize(true);\n        }\n        if (!this.lineHeight) {\n            this.$textLayer.checkForSizeChanges();\n        }\n        \n        this._signal(\"beforeRender\");\n        var config = this.layerConfig;\n        if (changes & this.CHANGE_FULL ||\n            changes & this.CHANGE_SIZE ||\n            changes & this.CHANGE_TEXT ||\n            changes & this.CHANGE_LINES ||\n            changes & this.CHANGE_SCROLL ||\n            changes & this.CHANGE_H_SCROLL\n        ) {\n            changes |= this.$computeLayerConfig();\n            if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n                var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n                if (st > 0) {\n                    this.scrollTop = st;\n                    changes = changes | this.CHANGE_SCROLL;\n                    changes |= this.$computeLayerConfig();\n                }\n            }\n            config = this.layerConfig;\n            this.$updateScrollBarV();\n            if (changes & this.CHANGE_H_SCROLL)\n                this.$updateScrollBarH();\n            this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n            this.content.style.marginTop = (-config.offset) + \"px\";\n            this.content.style.width = config.width + 2 * this.$padding + \"px\";\n            this.content.style.height = config.minHeight + \"px\";\n        }\n        if (changes & this.CHANGE_H_SCROLL) {\n            this.content.style.marginLeft = -this.scrollLeft + \"px\";\n            this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n        }\n        if (changes & this.CHANGE_FULL) {\n            this.$textLayer.update(config);\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n            this.$markerBack.update(config);\n            this.$markerFront.update(config);\n            this.$cursorLayer.update(config);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this._signal(\"afterRender\");\n            return;\n        }\n        if (changes & this.CHANGE_SCROLL) {\n            if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n                this.$textLayer.update(config);\n            else\n                this.$textLayer.scrollLines(config);\n\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n            this.$markerBack.update(config);\n            this.$markerFront.update(config);\n            this.$cursorLayer.update(config);\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this.$moveTextAreaToCursor();\n            this._signal(\"afterRender\");\n            return;\n        }\n\n        if (changes & this.CHANGE_TEXT) {\n            this.$textLayer.update(config);\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n        else if (changes & this.CHANGE_LINES) {\n            if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n        else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n\n        if (changes & this.CHANGE_CURSOR) {\n            this.$cursorLayer.update(config);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n            this.$markerFront.update(config);\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n            this.$markerBack.update(config);\n        }\n\n        this._signal(\"afterRender\");\n    };\n\n    \n    this.$autosize = function() {\n        var height = this.session.getScreenLength() * this.lineHeight;\n        var maxHeight = this.$maxLines * this.lineHeight;\n        var desiredHeight = Math.min(maxHeight,\n            Math.max((this.$minLines || 1) * this.lineHeight, height)\n        ) + this.scrollMargin.v + (this.$extraHeight || 0);\n        if (this.$horizScroll)\n            desiredHeight += this.scrollBarH.getHeight();\n        if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n            desiredHeight = this.$maxPixelHeight;\n        var vScroll = height > maxHeight;\n        \n        if (desiredHeight != this.desiredHeight ||\n            this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n            if (vScroll != this.$vScroll) {\n                this.$vScroll = vScroll;\n                this.scrollBarV.setVisible(vScroll);\n            }\n            \n            var w = this.container.clientWidth;\n            this.container.style.height = desiredHeight + \"px\";\n            this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n            this.desiredHeight = desiredHeight;\n            \n            this._signal(\"autosize\");\n        }\n    };\n    \n    this.$computeLayerConfig = function() {\n        var session = this.session;\n        var size = this.$size;\n        \n        var hideScrollbars = size.height <= 2 * this.lineHeight;\n        var screenLines = this.session.getScreenLength();\n        var maxHeight = screenLines * this.lineHeight;\n\n        var longestLine = this.$getLongestLine();\n        \n        var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n            size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n        var hScrollChanged = this.$horizScroll !== horizScroll;\n        if (hScrollChanged) {\n            this.$horizScroll = horizScroll;\n            this.scrollBarH.setVisible(horizScroll);\n        }\n        var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n        if (this.$maxLines && this.lineHeight > 1)\n            this.$autosize();\n\n        var offset = this.scrollTop % this.lineHeight;\n        var minHeight = size.scrollerHeight + this.lineHeight;\n        \n        var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n            ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n            : 0;\n        maxHeight += scrollPastEnd;\n        \n        var sm = this.scrollMargin;\n        this.session.setScrollTop(Math.max(-sm.top,\n            Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n        this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n            longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n        \n        var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n            size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n        var vScrollChanged = vScrollBefore !== vScroll;\n        if (vScrollChanged) {\n            this.$vScroll = vScroll;\n            this.scrollBarV.setVisible(vScroll);\n        }\n\n        var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n        var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n        var lastRow = firstRow + lineCount;\n        var firstRowScreen, firstRowHeight;\n        var lineHeight = this.lineHeight;\n        firstRow = session.screenToDocumentRow(firstRow, 0);\n        var foldLine = session.getFoldLine(firstRow);\n        if (foldLine) {\n            firstRow = foldLine.start.row;\n        }\n\n        firstRowScreen = session.documentToScreenRow(firstRow, 0);\n        firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n        lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n        minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n                                                firstRowHeight;\n\n        offset = this.scrollTop - firstRowScreen * lineHeight;\n\n        var changes = 0;\n        if (this.layerConfig.width != longestLine) \n            changes = this.CHANGE_H_SCROLL;\n        if (hScrollChanged || vScrollChanged) {\n            changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n            this._signal(\"scrollbarVisibilityChanged\");\n            if (vScrollChanged)\n                longestLine = this.$getLongestLine();\n        }\n        \n        this.layerConfig = {\n            width : longestLine,\n            padding : this.$padding,\n            firstRow : firstRow,\n            firstRowScreen: firstRowScreen,\n            lastRow : lastRow,\n            lineHeight : lineHeight,\n            characterWidth : this.characterWidth,\n            minHeight : minHeight,\n            maxHeight : maxHeight,\n            offset : offset,\n            gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n            height : this.$size.scrollerHeight\n        };\n\n        return changes;\n    };\n\n    this.$updateLines = function() {\n        var firstRow = this.$changedLines.firstRow;\n        var lastRow = this.$changedLines.lastRow;\n        this.$changedLines = null;\n\n        var layerConfig = this.layerConfig;\n\n        if (firstRow > layerConfig.lastRow + 1) { return; }\n        if (lastRow < layerConfig.firstRow) { return; }\n        if (lastRow === Infinity) {\n            if (this.$showGutter)\n                this.$gutterLayer.update(layerConfig);\n            this.$textLayer.update(layerConfig);\n            return;\n        }\n        this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n        return true;\n    };\n\n    this.$getLongestLine = function() {\n        var charCount = this.session.getScreenWidth();\n        if (this.showInvisibles && !this.session.$useWrapMode)\n            charCount += 1;\n\n        return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n    };\n    this.updateFrontMarkers = function() {\n        this.$markerFront.setMarkers(this.session.getMarkers(true));\n        this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n    };\n    this.updateBackMarkers = function() {\n        this.$markerBack.setMarkers(this.session.getMarkers());\n        this.$loop.schedule(this.CHANGE_MARKER_BACK);\n    };\n    this.addGutterDecoration = function(row, className){\n        this.$gutterLayer.addGutterDecoration(row, className);\n    };\n    this.removeGutterDecoration = function(row, className){\n        this.$gutterLayer.removeGutterDecoration(row, className);\n    };\n    this.updateBreakpoints = function(rows) {\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.setAnnotations = function(annotations) {\n        this.$gutterLayer.setAnnotations(annotations);\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.updateCursor = function() {\n        this.$loop.schedule(this.CHANGE_CURSOR);\n    };\n    this.hideCursor = function() {\n        this.$cursorLayer.hideCursor();\n    };\n    this.showCursor = function() {\n        this.$cursorLayer.showCursor();\n    };\n\n    this.scrollSelectionIntoView = function(anchor, lead, offset) {\n        this.scrollCursorIntoView(anchor, offset);\n        this.scrollCursorIntoView(lead, offset);\n    };\n    this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n        if (this.$size.scrollerHeight === 0)\n            return;\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n        var left = pos.left;\n        var top = pos.top;\n        \n        var topMargin = $viewMargin && $viewMargin.top || 0;\n        var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n        \n        var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n        \n        if (scrollTop + topMargin > top) {\n            if (offset && scrollTop + topMargin > top + this.lineHeight)\n                top -= offset * this.$size.scrollerHeight;\n            if (top === 0)\n                top = -this.scrollMargin.top;\n            this.session.setScrollTop(top);\n        } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n            if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top -  this.lineHeight)\n                top += offset * this.$size.scrollerHeight;\n            this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n        }\n\n        var scrollLeft = this.scrollLeft;\n\n        if (scrollLeft > left) {\n            if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n                left = -this.scrollMargin.left;\n            this.session.setScrollLeft(left);\n        } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n            this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n        } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n            this.session.setScrollLeft(0);\n        }\n    };\n    this.getScrollTop = function() {\n        return this.session.getScrollTop();\n    };\n    this.getScrollLeft = function() {\n        return this.session.getScrollLeft();\n    };\n    this.getScrollTopRow = function() {\n        return this.scrollTop / this.lineHeight;\n    };\n    this.getScrollBottomRow = function() {\n        return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n    };\n    this.scrollToRow = function(row) {\n        this.session.setScrollTop(row * this.lineHeight);\n    };\n\n    this.alignCursor = function(cursor, alignment) {\n        if (typeof cursor == \"number\")\n            cursor = {row: cursor, column: 0};\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n        var h = this.$size.scrollerHeight - this.lineHeight;\n        var offset = pos.top - h * (alignment || 0);\n\n        this.session.setScrollTop(offset);\n        return offset;\n    };\n\n    this.STEPS = 8;\n    this.$calcSteps = function(fromValue, toValue){\n        var i = 0;\n        var l = this.STEPS;\n        var steps = [];\n\n        var func  = function(t, x_min, dx) {\n            return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n        };\n\n        for (i = 0; i < l; ++i)\n            steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n        return steps;\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n        var offset = pos.top;\n        if (center)\n            offset -= this.$size.scrollerHeight / 2;\n\n        var initialScroll = this.scrollTop;\n        this.session.setScrollTop(offset);\n        if (animate !== false)\n            this.animateScrolling(initialScroll, callback);\n    };\n\n    this.animateScrolling = function(fromValue, callback) {\n        var toValue = this.scrollTop;\n        if (!this.$animatedScroll)\n            return;\n        var _self = this;\n        \n        if (fromValue == toValue)\n            return;\n        \n        if (this.$scrollAnimation) {\n            var oldSteps = this.$scrollAnimation.steps;\n            if (oldSteps.length) {\n                fromValue = oldSteps[0];\n                if (fromValue == toValue)\n                    return;\n            }\n        }\n        \n        var steps = _self.$calcSteps(fromValue, toValue);\n        this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n        clearInterval(this.$timer);\n\n        _self.session.setScrollTop(steps.shift());\n        _self.session.$scrollTop = toValue;\n        this.$timer = setInterval(function() {\n            if (steps.length) {\n                _self.session.setScrollTop(steps.shift());\n                _self.session.$scrollTop = toValue;\n            } else if (toValue != null) {\n                _self.session.$scrollTop = -1;\n                _self.session.setScrollTop(toValue);\n                toValue = null;\n            } else {\n                _self.$timer = clearInterval(_self.$timer);\n                _self.$scrollAnimation = null;\n                callback && callback();\n            }\n        }, 10);\n    };\n    this.scrollToY = function(scrollTop) {\n        if (this.scrollTop !== scrollTop) {\n            this.$loop.schedule(this.CHANGE_SCROLL);\n            this.scrollTop = scrollTop;\n        }\n    };\n    this.scrollToX = function(scrollLeft) {\n        if (this.scrollLeft !== scrollLeft)\n            this.scrollLeft = scrollLeft;\n        this.$loop.schedule(this.CHANGE_H_SCROLL);\n    };\n    this.scrollTo = function(x, y) {\n        this.session.setScrollTop(y);\n        this.session.setScrollLeft(y);\n    };\n    this.scrollBy = function(deltaX, deltaY) {\n        deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n        deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n    };\n    this.isScrollableBy = function(deltaX, deltaY) {\n        if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n           return true;\n        if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n            - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n           return true;\n        if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n            return true;\n        if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n            - this.layerConfig.width < -1 + this.scrollMargin.right)\n           return true;\n    };\n\n    this.pixelToScreenCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;\n        var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n        var col = Math.round(offset);\n\n        return {row: row, column: col, side: offset - col > 0 ? 1 : -1};\n    };\n\n    this.screenToTextCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var col = Math.round(\n            (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth\n        );\n\n        var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n        return this.session.screenToDocumentPosition(row, Math.max(col, 0));\n    };\n    this.textToScreenCoordinates = function(row, column) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n        var pos = this.session.documentToScreenPosition(row, column);\n\n        var x = this.$padding + Math.round(pos.column * this.characterWidth);\n        var y = pos.row * this.lineHeight;\n\n        return {\n            pageX: canvasPos.left + x - this.scrollLeft,\n            pageY: canvasPos.top + y - this.scrollTop\n        };\n    };\n    this.visualizeFocus = function() {\n        dom.addCssClass(this.container, \"ace_focus\");\n    };\n    this.visualizeBlur = function() {\n        dom.removeCssClass(this.container, \"ace_focus\");\n    };\n    this.showComposition = function(position) {\n        if (!this.$composition)\n            this.$composition = {\n                keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n                cssText: this.textarea.style.cssText\n            };\n\n        this.$keepTextAreaAtCursor = true;\n        dom.addCssClass(this.textarea, \"ace_composition\");\n        this.textarea.style.cssText = \"\";\n        this.$moveTextAreaToCursor();\n    };\n    this.setCompositionText = function(text) {\n        this.$moveTextAreaToCursor();\n    };\n    this.hideComposition = function() {\n        if (!this.$composition)\n            return;\n\n        dom.removeCssClass(this.textarea, \"ace_composition\");\n        this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n        this.textarea.style.cssText = this.$composition.cssText;\n        this.$composition = null;\n    };\n    this.setTheme = function(theme, cb) {\n        var _self = this;\n        this.$themeId = theme;\n        _self._dispatchEvent('themeChange',{theme:theme});\n\n        if (!theme || typeof theme == \"string\") {\n            var moduleName = theme || this.$options.theme.initialValue;\n            config.loadModule([\"theme\", moduleName], afterLoad);\n        } else {\n            afterLoad(theme);\n        }\n\n        function afterLoad(module) {\n            if (_self.$themeId != theme)\n                return cb && cb();\n            if (!module || !module.cssClass)\n                throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n            dom.importCssString(\n                module.cssText,\n                module.cssClass,\n                _self.container.ownerDocument\n            );\n\n            if (_self.theme)\n                dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n            var padding = \"padding\" in module ? module.padding \n                : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n            if (_self.$padding && padding != _self.$padding)\n                _self.setPadding(padding);\n            _self.$theme = module.cssClass;\n\n            _self.theme = module;\n            dom.addCssClass(_self.container, module.cssClass);\n            dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n            if (_self.$size) {\n                _self.$size.width = 0;\n                _self.$updateSizeAsync();\n            }\n\n            _self._dispatchEvent('themeLoaded', {theme:module});\n            cb && cb();\n        }\n    };\n    this.getTheme = function() {\n        return this.$themeId;\n    };\n    this.setStyle = function(style, include) {\n        dom.setCssClass(this.container, style, include !== false);\n    };\n    this.unsetStyle = function(style) {\n        dom.removeCssClass(this.container, style);\n    };\n    \n    this.setCursorStyle = function(style) {\n        if (this.scroller.style.cursor != style)\n            this.scroller.style.cursor = style;\n    };\n    this.setMouseCursor = function(cursorStyle) {\n        this.scroller.style.cursor = cursorStyle;\n    };\n    this.destroy = function() {\n        this.$textLayer.destroy();\n        this.$cursorLayer.destroy();\n    };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n    animatedScroll: {initialValue: false},\n    showInvisibles: {\n        set: function(value) {\n            if (this.$textLayer.setShowInvisibles(value))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: false\n    },\n    showPrintMargin: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: true\n    },\n    printMarginColumn: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: 80\n    },\n    printMargin: {\n        set: function(val) {\n            if (typeof val == \"number\")\n                this.$printMarginColumn = val;\n            this.$showPrintMargin = !!val;\n            this.$updatePrintMargin();\n        },\n        get: function() {\n            return this.$showPrintMargin && this.$printMarginColumn; \n        }\n    },\n    showGutter: {\n        set: function(show){\n            this.$gutter.style.display = show ? \"block\" : \"none\";\n            this.$loop.schedule(this.CHANGE_FULL);\n            this.onGutterResize();\n        },\n        initialValue: true\n    },\n    fadeFoldWidgets: {\n        set: function(show) {\n            dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n        },\n        initialValue: false\n    },\n    showFoldWidgets: {\n        set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)},\n        initialValue: true\n    },\n    showLineNumbers: {\n        set: function(show) {\n            this.$gutterLayer.setShowLineNumbers(show);\n            this.$loop.schedule(this.CHANGE_GUTTER);\n        },\n        initialValue: true\n    },\n    displayIndentGuides: {\n        set: function(show) {\n            if (this.$textLayer.setDisplayIndentGuides(show))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: true\n    },\n    highlightGutterLine: {\n        set: function(shouldHighlight) {\n            if (!this.$gutterLineHighlight) {\n                this.$gutterLineHighlight = dom.createElement(\"div\");\n                this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n                this.$gutter.appendChild(this.$gutterLineHighlight);\n                return;\n            }\n\n            this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n            if (this.$cursorLayer.$pixelPos)\n                this.$updateGutterLineHighlight();\n        },\n        initialValue: false,\n        value: true\n    },\n    hScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    vScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    fontSize:  {\n        set: function(size) {\n            if (typeof size == \"number\")\n                size = size + \"px\";\n            this.container.style.fontSize = size;\n            this.updateFontSize();\n        },\n        initialValue: 12\n    },\n    fontFamily: {\n        set: function(name) {\n            this.container.style.fontFamily = name;\n            this.updateFontSize();\n        }\n    },\n    maxLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    minLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    maxPixelHeight: {\n        set: function(val) {\n            this.updateFull();\n        },\n        initialValue: 0\n    },\n    scrollPastEnd: {\n        set: function(val) {\n            val = +val || 0;\n            if (this.$scrollPastEnd == val)\n                return;\n            this.$scrollPastEnd = val;\n            this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: 0,\n        handlesSet: true\n    },\n    fixedWidthGutter: {\n        set: function(val) {\n            this.$gutterLayer.$fixedWidth = !!val;\n            this.$loop.schedule(this.CHANGE_GUTTER);\n        }\n    },\n    theme: {\n        set: function(val) { this.setTheme(val) },\n        get: function() { return this.$themeId || this.theme; },\n        initialValue: \"./theme/textmate\",\n        handlesSet: true\n    }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar net = acequire(\"../lib/net\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\nvar config = acequire(\"../config\");\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) {\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.onMessage = this.onMessage.bind(this);\n    if (acequire.nameToUrl && !acequire.toUrl)\n        acequire.toUrl = acequire.nameToUrl;\n    \n    if (config.get(\"packaged\") || !acequire.toUrl) {\n        workerUrl = workerUrl || config.moduleUrl(mod.id, \"worker\")\n    } else {\n        var normalizePath = this.$normalizePath;\n        workerUrl = workerUrl || normalizePath(acequire.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n        var tlns = {};\n        topLevelNamespaces.forEach(function(ns) {\n            tlns[ns] = normalizePath(acequire.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n        });\n    }\n\n    try {\n            var workerSrc = mod.src;\n    var Blob = require('w3c-blob');\n    var blob = new Blob([ workerSrc ], { type: 'application/javascript' });\n    var blobUrl = (window.URL || window.webkitURL).createObjectURL(blob);\n\n    this.$worker = new Worker(blobUrl);\n\n    } catch(e) {\n        if (e instanceof window.DOMException) {\n            var blob = this.$workerBlob(workerUrl);\n            var URL = window.URL || window.webkitURL;\n            var blobURL = URL.createObjectURL(blob);\n\n            this.$worker = new Worker(blobURL);\n            URL.revokeObjectURL(blobURL);\n        } else {\n            throw e;\n        }\n    }\n    this.$worker.postMessage({\n        init : true,\n        tlns : tlns,\n        module : mod.id,\n        classname : classname\n    });\n\n    this.callbackId = 1;\n    this.callbacks = {};\n\n    this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.onMessage = function(e) {\n        var msg = e.data;\n        switch(msg.type) {\n            case \"event\":\n                this._signal(msg.name, {data: msg.data});\n                break;\n            case \"call\":\n                var callback = this.callbacks[msg.id];\n                if (callback) {\n                    callback(msg.data);\n                    delete this.callbacks[msg.id];\n                }\n                break;\n            case \"error\":\n                this.reportError(msg.data);\n                break;\n            case \"log\":\n                window.console && console.log && console.log.apply(console, msg.data);\n                break;\n        }\n    };\n    \n    this.reportError = function(err) {\n        window.console && console.error && console.error(err);\n    };\n\n    this.$normalizePath = function(path) {\n        return net.qualifyURL(path);\n    };\n\n    this.terminate = function() {\n        this._signal(\"terminate\", {});\n        this.deltaQueue = null;\n        this.$worker.terminate();\n        this.$worker = null;\n        if (this.$doc)\n            this.$doc.off(\"change\", this.changeListener);\n        this.$doc = null;\n    };\n\n    this.send = function(cmd, args) {\n        this.$worker.postMessage({command: cmd, args: args});\n    };\n\n    this.call = function(cmd, args, callback) {\n        if (callback) {\n            var id = this.callbackId++;\n            this.callbacks[id] = callback;\n            args.push(id);\n        }\n        this.send(cmd, args);\n    };\n\n    this.emit = function(event, data) {\n        try {\n            this.$worker.postMessage({event: event, data: {data: data.data}});\n        }\n        catch(ex) {\n            console.error(ex.stack);\n        }\n    };\n\n    this.attachToDocument = function(doc) {\n        if(this.$doc)\n            this.terminate();\n\n        this.$doc = doc;\n        this.call(\"setValue\", [doc.getValue()]);\n        doc.on(\"change\", this.changeListener);\n    };\n\n    this.changeListener = function(delta) {\n        if (!this.deltaQueue) {\n            this.deltaQueue = [];\n            setTimeout(this.$sendDeltaQueue, 0);\n        }\n        if (delta.action == \"insert\")\n            this.deltaQueue.push(delta.start, delta.lines);\n        else\n            this.deltaQueue.push(delta.start, delta.end);\n    };\n\n    this.$sendDeltaQueue = function() {\n        var q = this.deltaQueue;\n        if (!q) return;\n        this.deltaQueue = null;\n        if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n            this.call(\"setValue\", [this.$doc.getValue()]);\n        } else\n            this.emit(\"change\", {data: q});\n    };\n\n    this.$workerBlob = function(workerUrl) {\n        var script = \"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n        try {\n            return new Blob([script], {\"type\": \"application/javascript\"});\n        } catch (e) { // Backwards-compatibility\n            var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n            var blobBuilder = new BlobBuilder();\n            blobBuilder.append(script);\n            return blobBuilder.getBlob(\"application/javascript\");\n        }\n    };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.callbackId = 1;\n    this.callbacks = {};\n    this.messageBuffer = [];\n\n    var main = null;\n    var emitSync = false;\n    var sender = Object.create(EventEmitter);\n    var _self = this;\n\n    this.$worker = {};\n    this.$worker.terminate = function() {};\n    this.$worker.postMessage = function(e) {\n        _self.messageBuffer.push(e);\n        if (main) {\n            if (emitSync)\n                setTimeout(processNext);\n            else\n                processNext();\n        }\n    };\n    this.setEmitSync = function(val) { emitSync = val };\n\n    var processNext = function() {\n        var msg = _self.messageBuffer.shift();\n        if (msg.command)\n            main[msg.command].apply(main, msg.args);\n        else if (msg.event)\n            sender._signal(msg.event, msg.data);\n    };\n\n    sender.postMessage = function(msg) {\n        _self.onMessage({data: msg});\n    };\n    sender.callback = function(data, callbackId) {\n        this.postMessage({type: \"call\", id: callbackId, data: data});\n    };\n    sender.emit = function(name, data) {\n        this.postMessage({type: \"event\", name: name, data: data});\n    };\n\n    config.loadModule([\"worker\", mod], function(Main) {\n        main = new Main[classname](sender);\n        while (_self.messageBuffer.length)\n            processNext();\n    });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar oop = acequire(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n    var _self = this;\n    this.length = length;\n    this.session = session;\n    this.doc = session.getDocument();\n    this.mainClass = mainClass;\n    this.othersClass = othersClass;\n    this.$onUpdate = this.onUpdate.bind(this);\n    this.doc.on(\"change\", this.$onUpdate);\n    this.$others = others;\n    \n    this.$onCursorChange = function() {\n        setTimeout(function() {\n            _self.onCursorChange();\n        });\n    };\n    \n    this.$pos = pos;\n    var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n    this.$undoStackDepth = undoStack.length;\n    this.setup();\n\n    session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setup = function() {\n        var _self = this;\n        var doc = this.doc;\n        var session = this.session;\n        \n        this.selectionBefore = session.selection.toJSON();\n        if (session.selection.inMultiSelectMode)\n            session.selection.toSingleRange();\n\n        this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n        var pos = this.pos;\n        pos.$insertRight = true;\n        pos.detach();\n        pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n        this.others = [];\n        this.$others.forEach(function(other) {\n            var anchor = doc.createAnchor(other.row, other.column);\n            anchor.$insertRight = true;\n            anchor.detach();\n            _self.others.push(anchor);\n        });\n        session.setUndoSelect(false);\n    };\n    this.showOtherMarkers = function() {\n        if (this.othersActive) return;\n        var session = this.session;\n        var _self = this;\n        this.othersActive = true;\n        this.others.forEach(function(anchor) {\n            anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n        });\n    };\n    this.hideOtherMarkers = function() {\n        if (!this.othersActive) return;\n        this.othersActive = false;\n        for (var i = 0; i < this.others.length; i++) {\n            this.session.removeMarker(this.others[i].markerId);\n        }\n    };\n    this.onUpdate = function(delta) {\n        if (this.$updating)\n            return this.updateAnchors(delta);\n            \n        var range = delta;\n        if (range.start.row !== range.end.row) return;\n        if (range.start.row !== this.pos.row) return;\n        this.$updating = true;\n        var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n        var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n        var distanceFromStart = range.start.column - this.pos.column;\n        \n        this.updateAnchors(delta);\n        \n        if (inMainRange)\n            this.length += lengthDiff;\n\n        if (inMainRange && !this.session.$fromUndo) {\n            if (delta.action === 'insert') {\n                for (var i = this.others.length - 1; i >= 0; i--) {\n                    var otherPos = this.others[i];\n                    var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                    this.doc.insertMergedLines(newPos, delta.lines);\n                }\n            } else if (delta.action === 'remove') {\n                for (var i = this.others.length - 1; i >= 0; i--) {\n                    var otherPos = this.others[i];\n                    var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                    this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n                }\n            }\n        }\n        \n        this.$updating = false;\n        this.updateMarkers();\n    };\n    \n    this.updateAnchors = function(delta) {\n        this.pos.onChange(delta);\n        for (var i = this.others.length; i--;)\n            this.others[i].onChange(delta);\n        this.updateMarkers();\n    };\n    \n    this.updateMarkers = function() {\n        if (this.$updating)\n            return;\n        var _self = this;\n        var session = this.session;\n        var updateMarker = function(pos, className) {\n            session.removeMarker(pos.markerId);\n            pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n        };\n        updateMarker(this.pos, this.mainClass);\n        for (var i = this.others.length; i--;)\n            updateMarker(this.others[i], this.othersClass);\n    };\n\n    this.onCursorChange = function(event) {\n        if (this.$updating || !this.session) return;\n        var pos = this.session.selection.getCursor();\n        if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n            this.showOtherMarkers();\n            this._emit(\"cursorEnter\", event);\n        } else {\n            this.hideOtherMarkers();\n            this._emit(\"cursorLeave\", event);\n        }\n    };    \n    this.detach = function() {\n        this.session.removeMarker(this.pos && this.pos.markerId);\n        this.hideOtherMarkers();\n        this.doc.removeEventListener(\"change\", this.$onUpdate);\n        this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n        this.session.setUndoSelect(true);\n        this.session = null;\n    };\n    this.cancel = function() {\n        if (this.$undoStackDepth === -1)\n            return;\n        var undoManager = this.session.getUndoManager();\n        var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n        for (var i = 0; i < undosRequired; i++) {\n            undoManager.undo(true);\n        }\n        if (this.selectionBefore)\n            this.session.selection.fromJSON(this.selectionBefore);\n    };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n    var ev = e.domEvent;\n    var alt = ev.altKey;\n    var shift = ev.shiftKey;\n    var ctrl = ev.ctrlKey;\n    var accel = e.getAccelKey();\n    var button = e.getButton();\n    \n    if (ctrl && useragent.isMac)\n        button = ev.button;\n\n    if (e.editor.inMultiSelectMode && button == 2) {\n        e.editor.textInput.onContextMenu(e.domEvent);\n        return;\n    }\n    \n    if (!ctrl && !alt && !accel) {\n        if (button === 0 && e.editor.inMultiSelectMode)\n            e.editor.exitMultiSelectMode();\n        return;\n    }\n    \n    if (button !== 0)\n        return;\n\n    var editor = e.editor;\n    var selection = editor.selection;\n    var isMultiSelect = editor.inMultiSelectMode;\n    var pos = e.getDocumentPosition();\n    var cursor = selection.getCursor();\n    var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n    var mouseX = e.x, mouseY = e.y;\n    var onMouseSelection = function(e) {\n        mouseX = e.clientX;\n        mouseY = e.clientY;\n    };\n    \n    var session = editor.session;\n    var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n    var screenCursor = screenAnchor;\n    \n    var selectionMode;\n    if (editor.$mouseHandler.$enableJumpToDef) {\n        if (ctrl && alt || accel && alt)\n            selectionMode = shift ? \"block\" : \"add\";\n        else if (alt && editor.$blockSelectEnabled)\n            selectionMode = \"block\";\n    } else {\n        if (accel && !alt) {\n            selectionMode = \"add\";\n            if (!isMultiSelect && shift)\n                return;\n        } else if (alt && editor.$blockSelectEnabled) {\n            selectionMode = \"block\";\n        }\n    }\n    \n    if (selectionMode && useragent.isMac && ev.ctrlKey) {\n        editor.$mouseHandler.cancelContextMenu();\n    }\n\n    if (selectionMode == \"add\") {\n        if (!isMultiSelect && inSelection)\n            return; // dragging\n\n        if (!isMultiSelect) {\n            var range = selection.toOrientedRange();\n            editor.addSelectionMarker(range);\n        }\n\n        var oldRange = selection.rangeList.rangeAtPoint(pos);\n        \n        \n        editor.$blockScrolling++;\n        editor.inVirtualSelectionMode = true;\n        \n        if (shift) {\n            oldRange = null;\n            range = selection.ranges[0] || range;\n            editor.removeSelectionMarker(range);\n        }\n        editor.once(\"mouseup\", function() {\n            var tmpSel = selection.toOrientedRange();\n\n            if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n                selection.substractPoint(tmpSel.cursor);\n            else {\n                if (shift) {\n                    selection.substractPoint(range.cursor);\n                } else if (range) {\n                    editor.removeSelectionMarker(range);\n                    selection.addRange(range);\n                }\n                selection.addRange(tmpSel);\n            }\n            editor.$blockScrolling--;\n            editor.inVirtualSelectionMode = false;\n        });\n\n    } else if (selectionMode == \"block\") {\n        e.stop();\n        editor.inVirtualSelectionMode = true;        \n        var initialRange;\n        var rectSel = [];\n        var blockSelect = function() {\n            var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n            var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);\n\n            if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n                return;\n            screenCursor = newCursor;\n            \n            editor.$blockScrolling++;\n            editor.selection.moveToPosition(cursor);\n            editor.renderer.scrollCursorIntoView();\n\n            editor.removeSelectionMarkers(rectSel);\n            rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n            if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n                rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n            rectSel.forEach(editor.addSelectionMarker, editor);\n            editor.updateSelectionMarkers();\n            editor.$blockScrolling--;\n        };\n        editor.$blockScrolling++;\n        if (isMultiSelect && !accel) {\n            selection.toSingleRange();\n        } else if (!isMultiSelect && accel) {\n            initialRange = selection.toOrientedRange();\n            editor.addSelectionMarker(initialRange);\n        }\n        \n        if (shift)\n            screenAnchor = session.documentToScreenPosition(selection.lead);            \n        else\n            selection.moveToPosition(pos);\n        editor.$blockScrolling--;\n        \n        screenCursor = {row: -1, column: -1};\n\n        var onMouseSelectionEnd = function(e) {\n            clearInterval(timerId);\n            editor.removeSelectionMarkers(rectSel);\n            if (!rectSel.length)\n                rectSel = [selection.toOrientedRange()];\n            editor.$blockScrolling++;\n            if (initialRange) {\n                editor.removeSelectionMarker(initialRange);\n                selection.toSingleRange(initialRange);\n            }\n            for (var i = 0; i < rectSel.length; i++)\n                selection.addRange(rectSel[i]);\n            editor.inVirtualSelectionMode = false;\n            editor.$mouseHandler.$clickSelection = null;\n            editor.$blockScrolling--;\n        };\n\n        var onSelectionInterval = blockSelect;\n\n        event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n        var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n        return e.preventDefault();\n    }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(acequire, exports, module) {\nexports.defaultCommands = [{\n    name: \"addCursorAbove\",\n    exec: function(editor) { editor.selectMoreLines(-1); },\n    bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"addCursorBelow\",\n    exec: function(editor) { editor.selectMoreLines(1); },\n    bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"addCursorAboveSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"addCursorBelowSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectMoreBefore\",\n    exec: function(editor) { editor.selectMore(-1); },\n    bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectMoreAfter\",\n    exec: function(editor) { editor.selectMore(1); },\n    bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectNextBefore\",\n    exec: function(editor) { editor.selectMore(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectNextAfter\",\n    exec: function(editor) { editor.selectMore(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"splitIntoLines\",\n    exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n    bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n    readOnly: true\n}, {\n    name: \"alignCursors\",\n    exec: function(editor) { editor.alignCursors(); },\n    bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"findAll\",\n    exec: function(editor) { editor.findAll(); },\n    bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}];\nexports.multiSelectCommands = [{\n    name: \"singleSelection\",\n    bindKey: \"esc\",\n    exec: function(editor) { editor.exitMultiSelectMode(); },\n    scrollIntoView: \"cursor\",\n    readOnly: true,\n    isAvailable: function(editor) {return editor && editor.inMultiSelectMode}\n}];\n\nvar HashHandler = acequire(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(acequire, exports, module) {\n\nvar RangeList = acequire(\"./range_list\").RangeList;\nvar Range = acequire(\"./range\").Range;\nvar Selection = acequire(\"./selection\").Selection;\nvar onMouseDown = acequire(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = acequire(\"./lib/event\");\nvar lang = acequire(\"./lib/lang\");\nvar commands = acequire(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = acequire(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n    search.$options.wrap = true;\n    search.$options.needle = needle;\n    search.$options.backwards = dir == -1;\n    return search.find(session);\n}\nvar EditSession = acequire(\"./edit_session\").EditSession;\n(function() {\n    this.getSelectionMarkers = function() {\n        return this.$selectionMarkers;\n    };\n}).call(EditSession.prototype);\n(function() {\n    this.ranges = null;\n    this.rangeList = null;\n    this.addRange = function(range, $blockChangeEvents) {\n        if (!range)\n            return;\n\n        if (!this.inMultiSelectMode && this.rangeCount === 0) {\n            var oldRange = this.toOrientedRange();\n            this.rangeList.add(oldRange);\n            this.rangeList.add(range);\n            if (this.rangeList.ranges.length != 2) {\n                this.rangeList.removeAll();\n                return $blockChangeEvents || this.fromOrientedRange(range);\n            }\n            this.rangeList.removeAll();\n            this.rangeList.add(oldRange);\n            this.$onAddRange(oldRange);\n        }\n\n        if (!range.cursor)\n            range.cursor = range.end;\n\n        var removed = this.rangeList.add(range);\n\n        this.$onAddRange(range);\n\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n            this._signal(\"multiSelect\");\n            this.inMultiSelectMode = true;\n            this.session.$undoSelect = false;\n            this.rangeList.attach(this.session);\n        }\n\n        return $blockChangeEvents || this.fromOrientedRange(range);\n    };\n\n    this.toSingleRange = function(range) {\n        range = range || this.ranges[0];\n        var removed = this.rangeList.removeAll();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        range && this.fromOrientedRange(range);\n    };\n    this.substractPoint = function(pos) {\n        var removed = this.rangeList.substractPoint(pos);\n        if (removed) {\n            this.$onRemoveRange(removed);\n            return removed[0];\n        }\n    };\n    this.mergeOverlappingRanges = function() {\n        var removed = this.rangeList.merge();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n        else if(this.ranges[0])\n            this.fromOrientedRange(this.ranges[0]);\n    };\n\n    this.$onAddRange = function(range) {\n        this.rangeCount = this.rangeList.ranges.length;\n        this.ranges.unshift(range);\n        this._signal(\"addRange\", {range: range});\n    };\n\n    this.$onRemoveRange = function(removed) {\n        this.rangeCount = this.rangeList.ranges.length;\n        if (this.rangeCount == 1 && this.inMultiSelectMode) {\n            var lastRange = this.rangeList.ranges.pop();\n            removed.push(lastRange);\n            this.rangeCount = 0;\n        }\n\n        for (var i = removed.length; i--; ) {\n            var index = this.ranges.indexOf(removed[i]);\n            this.ranges.splice(index, 1);\n        }\n\n        this._signal(\"removeRange\", {ranges: removed});\n\n        if (this.rangeCount === 0 && this.inMultiSelectMode) {\n            this.inMultiSelectMode = false;\n            this._signal(\"singleSelect\");\n            this.session.$undoSelect = true;\n            this.rangeList.detach(this.session);\n        }\n\n        lastRange = lastRange || this.ranges[0];\n        if (lastRange && !lastRange.isEqual(this.getRange()))\n            this.fromOrientedRange(lastRange);\n    };\n    this.$initRangeList = function() {\n        if (this.rangeList)\n            return;\n\n        this.rangeList = new RangeList();\n        this.ranges = [];\n        this.rangeCount = 0;\n    };\n    this.getAllRanges = function() {\n        return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n    };\n\n    this.splitIntoLines = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var range = this.getRange();\n            var isBackwards = this.isBackwards();\n            var startRow = range.start.row;\n            var endRow = range.end.row;\n            if (startRow == endRow) {\n                if (isBackwards)\n                    var start = range.end, end = range.start;\n                else\n                    var start = range.start, end = range.end;\n                \n                this.addRange(Range.fromPoints(end, end));\n                this.addRange(Range.fromPoints(start, start));\n                return;\n            }\n\n            var rectSel = [];\n            var r = this.getLineRange(startRow, true);\n            r.start.column = range.start.column;\n            rectSel.push(r);\n\n            for (var i = startRow + 1; i < endRow; i++)\n                rectSel.push(this.getLineRange(i, true));\n\n            r = this.getLineRange(endRow, true);\n            r.end.column = range.end.column;\n            rectSel.push(r);\n\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.toggleBlockSelection = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var cursor = this.session.documentToScreenPosition(this.selectionLead);\n            var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n            var rectSel = this.rectangularRangeBlock(cursor, anchor);\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n        var rectSel = [];\n\n        var xBackwards = screenCursor.column < screenAnchor.column;\n        if (xBackwards) {\n            var startColumn = screenCursor.column;\n            var endColumn = screenAnchor.column;\n        } else {\n            var startColumn = screenAnchor.column;\n            var endColumn = screenCursor.column;\n        }\n\n        var yBackwards = screenCursor.row < screenAnchor.row;\n        if (yBackwards) {\n            var startRow = screenCursor.row;\n            var endRow = screenAnchor.row;\n        } else {\n            var startRow = screenAnchor.row;\n            var endRow = screenCursor.row;\n        }\n\n        if (startColumn < 0)\n            startColumn = 0;\n        if (startRow < 0)\n            startRow = 0;\n\n        if (startRow == endRow)\n            includeEmptyLines = true;\n\n        for (var row = startRow; row <= endRow; row++) {\n            var range = Range.fromPoints(\n                this.session.screenToDocumentPosition(row, startColumn),\n                this.session.screenToDocumentPosition(row, endColumn)\n            );\n            if (range.isEmpty()) {\n                if (docEnd && isSamePoint(range.end, docEnd))\n                    break;\n                var docEnd = range.end;\n            }\n            range.cursor = xBackwards ? range.start : range.end;\n            rectSel.push(range);\n        }\n\n        if (yBackwards)\n            rectSel.reverse();\n\n        if (!includeEmptyLines) {\n            var end = rectSel.length - 1;\n            while (rectSel[end].isEmpty() && end > 0)\n                end--;\n            if (end > 0) {\n                var start = 0;\n                while (rectSel[start].isEmpty())\n                    start++;\n            }\n            for (var i = end; i >= start; i--) {\n                if (rectSel[i].isEmpty())\n                    rectSel.splice(i, 1);\n            }\n        }\n\n        return rectSel;\n    };\n}).call(Selection.prototype);\nvar Editor = acequire(\"./editor\").Editor;\n(function() {\n    this.updateSelectionMarkers = function() {\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n    this.addSelectionMarker = function(orientedRange) {\n        if (!orientedRange.cursor)\n            orientedRange.cursor = orientedRange.end;\n\n        var style = this.getSelectionStyle();\n        orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n        this.session.$selectionMarkers.push(orientedRange);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n        return orientedRange;\n    };\n    this.removeSelectionMarker = function(range) {\n        if (!range.marker)\n            return;\n        this.session.removeMarker(range.marker);\n        var index = this.session.$selectionMarkers.indexOf(range);\n        if (index != -1)\n            this.session.$selectionMarkers.splice(index, 1);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n    };\n\n    this.removeSelectionMarkers = function(ranges) {\n        var markerList = this.session.$selectionMarkers;\n        for (var i = ranges.length; i--; ) {\n            var range = ranges[i];\n            if (!range.marker)\n                continue;\n            this.session.removeMarker(range.marker);\n            var index = markerList.indexOf(range);\n            if (index != -1)\n                markerList.splice(index, 1);\n        }\n        this.session.selectionMarkerCount = markerList.length;\n    };\n\n    this.$onAddRange = function(e) {\n        this.addSelectionMarker(e.range);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onRemoveRange = function(e) {\n        this.removeSelectionMarkers(e.ranges);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onMultiSelect = function(e) {\n        if (this.inMultiSelectMode)\n            return;\n        this.inMultiSelectMode = true;\n\n        this.setStyle(\"ace_multiselect\");\n        this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n        this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onSingleSelect = function(e) {\n        if (this.session.multiSelect.inVirtualMode)\n            return;\n        this.inMultiSelectMode = false;\n\n        this.unsetStyle(\"ace_multiselect\");\n        this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n        this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n        this._emit(\"changeSelection\");\n    };\n\n    this.$onMultiSelectExec = function(e) {\n        var command = e.command;\n        var editor = e.editor;\n        if (!editor.multiSelect)\n            return;\n        if (!command.multiSelectAction) {\n            var result = command.exec(editor, e.args || {});\n            editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n            editor.multiSelect.mergeOverlappingRanges();\n        } else if (command.multiSelectAction == \"forEach\") {\n            result = editor.forEachSelection(command, e.args);\n        } else if (command.multiSelectAction == \"forEachLine\") {\n            result = editor.forEachSelection(command, e.args, true);\n        } else if (command.multiSelectAction == \"single\") {\n            editor.exitMultiSelectMode();\n            result = command.exec(editor, e.args || {});\n        } else {\n            result = command.multiSelectAction(editor, e.args || {});\n        }\n        return result;\n    }; \n    this.forEachSelection = function(cmd, args, options) {\n        if (this.inVirtualSelectionMode)\n            return;\n        var keepOrder = options && options.keepOrder;\n        var $byLines = options == true || options && options.$byLines\n        var session = this.session;\n        var selection = this.selection;\n        var rangeList = selection.rangeList;\n        var ranges = (keepOrder ? selection : rangeList).ranges;\n        var result;\n        \n        if (!ranges.length)\n            return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n        \n        var reg = selection._eventRegistry;\n        selection._eventRegistry = {};\n\n        var tmpSel = new Selection(session);\n        this.inVirtualSelectionMode = true;\n        for (var i = ranges.length; i--;) {\n            if ($byLines) {\n                while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n                    i--;\n            }\n            tmpSel.fromOrientedRange(ranges[i]);\n            tmpSel.index = i;\n            this.selection = session.selection = tmpSel;\n            var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n            if (!result && cmdResult !== undefined)\n                result = cmdResult;\n            tmpSel.toOrientedRange(ranges[i]);\n        }\n        tmpSel.detach();\n\n        this.selection = session.selection = selection;\n        this.inVirtualSelectionMode = false;\n        selection._eventRegistry = reg;\n        selection.mergeOverlappingRanges();\n        \n        var anim = this.renderer.$scrollAnimation;\n        this.onCursorChange();\n        this.onSelectionChange();\n        if (anim && anim.from == anim.to)\n            this.renderer.animateScrolling(anim.from);\n        \n        return result;\n    };\n    this.exitMultiSelectMode = function() {\n        if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n            return;\n        this.multiSelect.toSingleRange();\n    };\n\n    this.getSelectedText = function() {\n        var text = \"\";\n        if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n            var ranges = this.multiSelect.rangeList.ranges;\n            var buf = [];\n            for (var i = 0; i < ranges.length; i++) {\n                buf.push(this.session.getTextRange(ranges[i]));\n            }\n            var nl = this.session.getDocument().getNewLineCharacter();\n            text = buf.join(nl);\n            if (text.length == (buf.length - 1) * nl.length)\n                text = \"\";\n        } else if (!this.selection.isEmpty()) {\n            text = this.session.getTextRange(this.getSelectionRange());\n        }\n        return text;\n    };\n    \n    this.$checkMultiselectChange = function(e, anchor) {\n        if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n            var range = this.multiSelect.ranges[0];\n            if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n                return;\n            var pos = anchor == this.multiSelect.anchor\n                ? range.cursor == range.start ? range.end : range.start\n                : range.cursor;\n            if (pos.row != anchor.row \n                || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n                this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n        }\n    };\n    this.findAll = function(needle, options, additive) {\n        options = options || {};\n        options.needle = needle || options.needle;\n        if (options.needle == undefined) {\n            var range = this.selection.isEmpty()\n                ? this.selection.getWordRange()\n                : this.selection.getRange();\n            options.needle = this.session.getTextRange(range);\n        }    \n        this.$search.set(options);\n        \n        var ranges = this.$search.findAll(this.session);\n        if (!ranges.length)\n            return 0;\n\n        this.$blockScrolling += 1;\n        var selection = this.multiSelect;\n\n        if (!additive)\n            selection.toSingleRange(ranges[0]);\n\n        for (var i = ranges.length; i--; )\n            selection.addRange(ranges[i], true);\n        if (range && selection.rangeList.rangeAtPoint(range.start))\n            selection.addRange(range, true);\n        \n        this.$blockScrolling -= 1;\n\n        return ranges.length;\n    };\n    this.selectMoreLines = function(dir, skip) {\n        var range = this.selection.toOrientedRange();\n        var isBackwards = range.cursor == range.end;\n\n        var screenLead = this.session.documentToScreenPosition(range.cursor);\n        if (this.selection.$desiredColumn)\n            screenLead.column = this.selection.$desiredColumn;\n\n        var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n        if (!range.isEmpty()) {\n            var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n            var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n        } else {\n            var anchor = lead;\n        }\n\n        if (isBackwards) {\n            var newRange = Range.fromPoints(lead, anchor);\n            newRange.cursor = newRange.start;\n        } else {\n            var newRange = Range.fromPoints(anchor, lead);\n            newRange.cursor = newRange.end;\n        }\n\n        newRange.desiredColumn = screenLead.column;\n        if (!this.selection.inMultiSelectMode) {\n            this.selection.addRange(range);\n        } else {\n            if (skip)\n                var toRemove = range.cursor;\n        }\n\n        this.selection.addRange(newRange);\n        if (toRemove)\n            this.selection.substractPoint(toRemove);\n    };\n    this.transposeSelections = function(dir) {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var all = sel.ranges;\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            if (range.isEmpty()) {\n                var tmp = session.getWordRange(range.start.row, range.start.column);\n                range.start.row = tmp.start.row;\n                range.start.column = tmp.start.column;\n                range.end.row = tmp.end.row;\n                range.end.column = tmp.end.column;\n            }\n        }\n        sel.mergeOverlappingRanges();\n\n        var words = [];\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            words.unshift(session.getTextRange(range));\n        }\n\n        if (dir < 0)\n            words.unshift(words.pop());\n        else\n            words.push(words.shift());\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            var tmp = range.clone();\n            session.replace(range, words[i]);\n            range.start.row = tmp.start.row;\n            range.start.column = tmp.start.column;\n        }\n    };\n    this.selectMore = function(dir, skip, stopAtFirst) {\n        var session = this.session;\n        var sel = session.multiSelect;\n\n        var range = sel.toOrientedRange();\n        if (range.isEmpty()) {\n            range = session.getWordRange(range.start.row, range.start.column);\n            range.cursor = dir == -1 ? range.start : range.end;\n            this.multiSelect.addRange(range);\n            if (stopAtFirst)\n                return;\n        }\n        var needle = session.getTextRange(range);\n\n        var newRange = find(session, needle, dir);\n        if (newRange) {\n            newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n            this.$blockScrolling += 1;\n            this.session.unfold(newRange);\n            this.multiSelect.addRange(newRange);\n            this.$blockScrolling -= 1;\n            this.renderer.scrollCursorIntoView(null, 0.5);\n        }\n        if (skip)\n            this.multiSelect.substractPoint(range.cursor);\n    };\n    this.alignCursors = function() {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var ranges = sel.ranges;\n        var row = -1;\n        var sameRowRanges = ranges.filter(function(r) {\n            if (r.cursor.row == row)\n                return true;\n            row = r.cursor.row;\n        });\n        \n        if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n            var range = this.selection.getRange();\n            var fr = range.start.row, lr = range.end.row;\n            var guessRange = fr == lr;\n            if (guessRange) {\n                var max = this.session.getLength();\n                var line;\n                do {\n                    line = this.session.getLine(lr);\n                } while (/[=:]/.test(line) && ++lr < max);\n                do {\n                    line = this.session.getLine(fr);\n                } while (/[=:]/.test(line) && --fr > 0);\n                \n                if (fr < 0) fr = 0;\n                if (lr >= max) lr = max - 1;\n            }\n            var lines = this.session.removeFullLines(fr, lr);\n            lines = this.$reAlignText(lines, guessRange);\n            this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n            if (!guessRange) {\n                range.start.column = 0;\n                range.end.column = lines[lines.length - 1].length;\n            }\n            this.selection.setRange(range);\n        } else {\n            sameRowRanges.forEach(function(r) {\n                sel.substractPoint(r.cursor);\n            });\n\n            var maxCol = 0;\n            var minSpace = Infinity;\n            var spaceOffsets = ranges.map(function(r) {\n                var p = r.cursor;\n                var line = session.getLine(p.row);\n                var spaceOffset = line.substr(p.column).search(/\\S/g);\n                if (spaceOffset == -1)\n                    spaceOffset = 0;\n\n                if (p.column > maxCol)\n                    maxCol = p.column;\n                if (spaceOffset < minSpace)\n                    minSpace = spaceOffset;\n                return spaceOffset;\n            });\n            ranges.forEach(function(r, i) {\n                var p = r.cursor;\n                var l = maxCol - p.column;\n                var d = spaceOffsets[i] - minSpace;\n                if (l > d)\n                    session.insert(p, lang.stringRepeat(\" \", l - d));\n                else\n                    session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n                r.start.column = r.end.column = maxCol;\n                r.start.row = r.end.row = p.row;\n                r.cursor = r.end;\n            });\n            sel.fromOrientedRange(ranges[0]);\n            this.renderer.updateCursor();\n            this.renderer.updateBackMarkers();\n        }\n    };\n\n    this.$reAlignText = function(lines, forceLeft) {\n        var isLeftAligned = true, isRightAligned = true;\n        var startW, textW, endW;\n\n        return lines.map(function(line) {\n            var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n            if (!m)\n                return [line];\n\n            if (startW == null) {\n                startW = m[1].length;\n                textW = m[2].length;\n                endW = m[3].length;\n                return m;\n            }\n\n            if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n                isRightAligned = false;\n            if (startW != m[1].length)\n                isLeftAligned = false;\n\n            if (startW > m[1].length)\n                startW = m[1].length;\n            if (textW < m[2].length)\n                textW = m[2].length;\n            if (endW > m[3].length)\n                endW = m[3].length;\n\n            return m;\n        }).map(forceLeft ? alignLeft :\n            isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n        function spaces(n) {\n            return lang.stringRepeat(\" \", n);\n        }\n\n        function alignLeft(m) {\n            return !m[2] ? m[0] : spaces(startW) + m[2]\n                + spaces(textW - m[2].length + endW)\n                + m[4].replace(/^([=:])\\s+/, \"$1 \");\n        }\n        function alignRight(m) {\n            return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n                + spaces(endW, \" \")\n                + m[4].replace(/^([=:])\\s+/, \"$1 \");\n        }\n        function unAlign(m) {\n            return !m[2] ? m[0] : spaces(startW) + m[2]\n                + spaces(endW)\n                + m[4].replace(/^([=:])\\s+/, \"$1 \");\n        }\n    };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n    var session = e.session;\n    if (session && !session.multiSelect) {\n        session.$selectionMarkers = [];\n        session.selection.$initRangeList();\n        session.multiSelect = session.selection;\n    }\n    this.multiSelect = session && session.multiSelect;\n\n    var oldSession = e.oldSession;\n    if (oldSession) {\n        oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n        oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n        oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n        oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n        oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n        oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n    }\n\n    if (session) {\n        session.multiSelect.on(\"addRange\", this.$onAddRange);\n        session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n        session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n        session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n        session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n        session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n    }\n\n    if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n        if (session.selection.inMultiSelectMode)\n            this.$onMultiSelect();\n        else\n            this.$onSingleSelect();\n    }\n};\nfunction MultiSelect(editor) {\n    if (editor.$multiselectOnSessionChange)\n        return;\n    editor.$onAddRange = editor.$onAddRange.bind(editor);\n    editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n    editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n    editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n    editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n    editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n    editor.$multiselectOnSessionChange(editor);\n    editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n    editor.on(\"mousedown\", onMouseDown);\n    editor.commands.addCommands(commands.defaultCommands);\n\n    addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n    var el = editor.textInput.getElement();\n    var altCursor = false;\n    event.addListener(el, \"keydown\", function(e) {\n        var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n        if (editor.$blockSelectEnabled && altDown) {\n            if (!altCursor) {\n                editor.renderer.setMouseCursor(\"crosshair\");\n                altCursor = true;\n            }\n        } else if (altCursor) {\n            reset();\n        }\n    });\n\n    event.addListener(el, \"keyup\", reset);\n    event.addListener(el, \"blur\", reset);\n    function reset(e) {\n        if (altCursor) {\n            editor.renderer.setMouseCursor(\"\");\n            altCursor = false;\n        }\n    }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nacequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n    enableMultiselect: {\n        set: function(val) {\n            MultiSelect(this);\n            if (val) {\n                this.on(\"changeSession\", this.$multiselectOnSessionChange);\n                this.on(\"mousedown\", onMouseDown);\n            } else {\n                this.off(\"changeSession\", this.$multiselectOnSessionChange);\n                this.off(\"mousedown\", onMouseDown);\n            }\n        },\n        value: true\n    },\n    enableBlockSelect: {\n        set: function(val) {\n            this.$blockSelectEnabled = val;\n        },\n        value: true\n    }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = session.getFoldWidget(end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n    this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var end = {row: row, column: column};\n        var start = session.$findOpeningBracket(bracket, end);\n\n        if (!start)\n            return;\n\n        start.column++;\n        end.column--;\n\n        return  Range.fromPoints(start, end);\n    };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar Range = acequire(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n    this.session = session;\n    this.session.widgetManager = this;\n    this.session.getRowLength = this.getRowLength;\n    this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n    this.updateOnChange = this.updateOnChange.bind(this);\n    this.renderWidgets = this.renderWidgets.bind(this);\n    this.measureWidgets = this.measureWidgets.bind(this);\n    this.session._changedWidgets = [];\n    this.$onChangeEditor = this.$onChangeEditor.bind(this);\n    \n    this.session.on(\"change\", this.updateOnChange);\n    this.session.on(\"changeFold\", this.updateOnFold);\n    this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n    this.getRowLength = function(row) {\n        var h;\n        if (this.lineWidgets)\n            h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n        else \n            h = 0;\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1 + h;\n        } else {\n            return this.$wrapData[row].length + 1 + h;\n        }\n    };\n\n    this.$getWidgetScreenLength = function() {\n        var screenRows = 0;\n        this.lineWidgets.forEach(function(w){\n            if (w && w.rowCount && !w.hidden)\n                screenRows += w.rowCount;\n        });\n        return screenRows;\n    };    \n    \n    this.$onChangeEditor = function(e) {\n        this.attach(e.editor);\n    };\n    \n    this.attach = function(editor) {\n        if (editor  && editor.widgetManager && editor.widgetManager != this)\n            editor.widgetManager.detach();\n\n        if (this.editor == editor)\n            return;\n\n        this.detach();\n        this.editor = editor;\n        \n        if (editor) {\n            editor.widgetManager = this;\n            editor.renderer.on(\"beforeRender\", this.measureWidgets);\n            editor.renderer.on(\"afterRender\", this.renderWidgets);\n        }\n    };\n    this.detach = function(e) {\n        var editor = this.editor;\n        if (!editor)\n            return;\n        \n        this.editor = null;\n        editor.widgetManager = null;\n        \n        editor.renderer.off(\"beforeRender\", this.measureWidgets);\n        editor.renderer.off(\"afterRender\", this.renderWidgets);\n        var lineWidgets = this.session.lineWidgets;\n        lineWidgets && lineWidgets.forEach(function(w) {\n            if (w && w.el && w.el.parentNode) {\n                w._inDocument = false;\n                w.el.parentNode.removeChild(w.el);\n            }\n        });\n    };\n\n    this.updateOnFold = function(e, session) {\n        var lineWidgets = session.lineWidgets;\n        if (!lineWidgets || !e.action)\n            return;\n        var fold = e.data;\n        var start = fold.start.row;\n        var end = fold.end.row;\n        var hide = e.action == \"add\";\n        for (var i = start + 1; i < end; i++) {\n            if (lineWidgets[i])\n                lineWidgets[i].hidden = hide;\n        }\n        if (lineWidgets[end]) {\n            if (hide) {\n                if (!lineWidgets[start])\n                    lineWidgets[start] = lineWidgets[end];\n                else\n                    lineWidgets[end].hidden = hide;\n            } else {\n                if (lineWidgets[start] == lineWidgets[end])\n                    lineWidgets[start] = undefined;\n                lineWidgets[end].hidden = hide;\n            }\n        }\n    };\n    \n    this.updateOnChange = function(delta) {\n        var lineWidgets = this.session.lineWidgets;\n        if (!lineWidgets) return;\n        \n        var startRow = delta.start.row;\n        var len = delta.end.row - startRow;\n\n        if (len === 0) {\n        } else if (delta.action == 'remove') {\n            var removed = lineWidgets.splice(startRow + 1, len);\n            removed.forEach(function(w) {\n                w && this.removeLineWidget(w);\n            }, this);\n            this.$updateRows();\n        } else {\n            var args = new Array(len);\n            args.unshift(startRow, 0);\n            lineWidgets.splice.apply(lineWidgets, args);\n            this.$updateRows();\n        }\n    };\n    \n    this.$updateRows = function() {\n        var lineWidgets = this.session.lineWidgets;\n        if (!lineWidgets) return;\n        var noWidgets = true;\n        lineWidgets.forEach(function(w, i) {\n            if (w) {\n                noWidgets = false;\n                w.row = i;\n                while (w.$oldWidget) {\n                    w.$oldWidget.row = i;\n                    w = w.$oldWidget;\n                }\n            }\n        });\n        if (noWidgets)\n            this.session.lineWidgets = null;\n    };\n\n    this.addLineWidget = function(w) {\n        if (!this.session.lineWidgets)\n            this.session.lineWidgets = new Array(this.session.getLength());\n        \n        var old = this.session.lineWidgets[w.row];\n        if (old) {\n            w.$oldWidget = old;\n            if (old.el && old.el.parentNode) {\n                old.el.parentNode.removeChild(old.el);\n                old._inDocument = false;\n            }\n        }\n            \n        this.session.lineWidgets[w.row] = w;\n        \n        w.session = this.session;\n        \n        var renderer = this.editor.renderer;\n        if (w.html && !w.el) {\n            w.el = dom.createElement(\"div\");\n            w.el.innerHTML = w.html;\n        }\n        if (w.el) {\n            dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n            w.el.style.position = \"absolute\";\n            w.el.style.zIndex = 5;\n            renderer.container.appendChild(w.el);\n            w._inDocument = true;\n        }\n        \n        if (!w.coverGutter) {\n            w.el.style.zIndex = 3;\n        }\n        if (w.pixelHeight == null) {\n            w.pixelHeight = w.el.offsetHeight;\n        }\n        if (w.rowCount == null) {\n            w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n        }\n        \n        var fold = this.session.getFoldAt(w.row, 0);\n        w.$fold = fold;\n        if (fold) {\n            var lineWidgets = this.session.lineWidgets;\n            if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n                lineWidgets[fold.start.row] = w;\n            else\n                w.hidden = true;\n        }\n            \n        this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n        \n        this.$updateRows();\n        this.renderWidgets(null, renderer);\n        this.onWidgetChanged(w);\n        return w;\n    };\n    \n    this.removeLineWidget = function(w) {\n        w._inDocument = false;\n        w.session = null;\n        if (w.el && w.el.parentNode)\n            w.el.parentNode.removeChild(w.el);\n        if (w.editor && w.editor.destroy) try {\n            w.editor.destroy();\n        } catch(e){}\n        if (this.session.lineWidgets) {\n            var w1 = this.session.lineWidgets[w.row]\n            if (w1 == w) {\n                this.session.lineWidgets[w.row] = w.$oldWidget;\n                if (w.$oldWidget)\n                    this.onWidgetChanged(w.$oldWidget);\n            } else {\n                while (w1) {\n                    if (w1.$oldWidget == w) {\n                        w1.$oldWidget = w.$oldWidget;\n                        break;\n                    }\n                    w1 = w1.$oldWidget;\n                }\n            }\n        }\n        this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n        this.$updateRows();\n    };\n    \n    this.getWidgetsAtRow = function(row) {\n        var lineWidgets = this.session.lineWidgets;\n        var w = lineWidgets && lineWidgets[row];\n        var list = [];\n        while (w) {\n            list.push(w);\n            w = w.$oldWidget;\n        }\n        return list;\n    };\n    \n    this.onWidgetChanged = function(w) {\n        this.session._changedWidgets.push(w);\n        this.editor && this.editor.renderer.updateFull();\n    };\n    \n    this.measureWidgets = function(e, renderer) {\n        var changedWidgets = this.session._changedWidgets;\n        var config = renderer.layerConfig;\n        \n        if (!changedWidgets || !changedWidgets.length) return;\n        var min = Infinity;\n        for (var i = 0; i < changedWidgets.length; i++) {\n            var w = changedWidgets[i];\n            if (!w || !w.el) continue;\n            if (w.session != this.session) continue;\n            if (!w._inDocument) {\n                if (this.session.lineWidgets[w.row] != w)\n                    continue;\n                w._inDocument = true;\n                renderer.container.appendChild(w.el);\n            }\n            \n            w.h = w.el.offsetHeight;\n            \n            if (!w.fixedWidth) {\n                w.w = w.el.offsetWidth;\n                w.screenWidth = Math.ceil(w.w / config.characterWidth);\n            }\n            \n            var rowCount = w.h / config.lineHeight;\n            if (w.coverLine) {\n                rowCount -= this.session.getRowLineCount(w.row);\n                if (rowCount < 0)\n                    rowCount = 0;\n            }\n            if (w.rowCount != rowCount) {\n                w.rowCount = rowCount;\n                if (w.row < min)\n                    min = w.row;\n            }\n        }\n        if (min != Infinity) {\n            this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n            this.session.lineWidgetWidth = null;\n        }\n        this.session._changedWidgets = [];\n    };\n    \n    this.renderWidgets = function(e, renderer) {\n        var config = renderer.layerConfig;\n        var lineWidgets = this.session.lineWidgets;\n        if (!lineWidgets)\n            return;\n        var first = Math.min(this.firstRow, config.firstRow);\n        var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n        \n        while (first > 0 && !lineWidgets[first])\n            first--;\n        \n        this.firstRow = config.firstRow;\n        this.lastRow = config.lastRow;\n\n        renderer.$cursorLayer.config = config;\n        for (var i = first; i <= last; i++) {\n            var w = lineWidgets[i];\n            if (!w || !w.el) continue;\n            if (w.hidden) {\n                w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n                continue;\n            }\n            if (!w._inDocument) {\n                w._inDocument = true;\n                renderer.container.appendChild(w.el);\n            }\n            var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n            if (!w.coverLine)\n                top += config.lineHeight * this.session.getRowLineCount(w.row);\n            w.el.style.top = top - config.offset + \"px\";\n            \n            var left = w.coverGutter ? 0 : renderer.gutterWidth;\n            if (!w.fixedWidth)\n                left -= renderer.scrollLeft;\n            w.el.style.left = left + \"px\";\n            \n            if (w.fullWidth && w.screenWidth) {\n                w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n            }\n            \n            if (w.fixedWidth) {\n                w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n            } else {\n                w.el.style.right = \"\";\n            }\n        }\n    };\n    \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar LineWidgets = acequire(\"../line_widgets\").LineWidgets;\nvar dom = acequire(\"../lib/dom\");\nvar Range = acequire(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n    var first = 0;\n    var last = array.length - 1;\n\n    while (first <= last) {\n        var mid = (first + last) >> 1;\n        var c = comparator(needle, array[mid]);\n        if (c > 0)\n            first = mid + 1;\n        else if (c < 0)\n            last = mid - 1;\n        else\n            return mid;\n    }\n    return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n    var annotations = session.getAnnotations().sort(Range.comparePoints);\n    if (!annotations.length)\n        return;\n    \n    var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n    if (i < 0)\n        i = -i - 1;\n    \n    if (i >= annotations.length)\n        i = dir > 0 ? 0 : annotations.length - 1;\n    else if (i === 0 && dir < 0)\n        i = annotations.length - 1;\n    \n    var annotation = annotations[i];\n    if (!annotation || !dir)\n        return;\n\n    if (annotation.row === row) {\n        do {\n            annotation = annotations[i += dir];\n        } while (annotation && annotation.row === row);\n        if (!annotation)\n            return annotations.slice();\n    }\n    \n    \n    var matched = [];\n    row = annotation.row;\n    do {\n        matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n        annotation = annotations[i += dir];\n    } while (annotation && annotation.row == row);\n    return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n    var session = editor.session;\n    if (!session.widgetManager) {\n        session.widgetManager = new LineWidgets(session);\n        session.widgetManager.attach(editor);\n    }\n    \n    var pos = editor.getCursorPosition();\n    var row = pos.row;\n    var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n        return w.type == \"errorMarker\";\n    })[0];\n    if (oldWidget) {\n        oldWidget.destroy();\n    } else {\n        row -= dir;\n    }\n    var annotations = findAnnotations(session, row, dir);\n    var gutterAnno;\n    if (annotations) {\n        var annotation = annotations[0];\n        pos.column = (annotation.pos && typeof annotation.column != \"number\"\n            ? annotation.pos.sc\n            : annotation.column) || 0;\n        pos.row = annotation.row;\n        gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n    } else if (oldWidget) {\n        return;\n    } else {\n        gutterAnno = {\n            text: [\"Looks good!\"],\n            className: \"ace_ok\"\n        };\n    }\n    editor.session.unfold(pos.row);\n    editor.selection.moveToPosition(pos);\n    \n    var w = {\n        row: pos.row, \n        fixedWidth: true,\n        coverGutter: true,\n        el: dom.createElement(\"div\"),\n        type: \"errorMarker\"\n    };\n    var el = w.el.appendChild(dom.createElement(\"div\"));\n    var arrow = w.el.appendChild(dom.createElement(\"div\"));\n    arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n    \n    var left = editor.renderer.$cursorLayer\n        .getPixelPosition(pos).left;\n    arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n    \n    w.el.className = \"error_widget_wrapper\";\n    el.className = \"error_widget \" + gutterAnno.className;\n    el.innerHTML = gutterAnno.text.join(\"<br>\");\n    \n    el.appendChild(dom.createElement(\"div\"));\n    \n    var kb = function(_, hashId, keyString) {\n        if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n            w.destroy();\n            return {command: \"null\"};\n        }\n    };\n    \n    w.destroy = function() {\n        if (editor.$mouseHandler.isMousePressed)\n            return;\n        editor.keyBinding.removeKeyboardHandler(kb);\n        session.widgetManager.removeLineWidget(w);\n        editor.off(\"changeSelection\", w.destroy);\n        editor.off(\"changeSession\", w.destroy);\n        editor.off(\"mouseup\", w.destroy);\n        editor.off(\"change\", w.destroy);\n    };\n    \n    editor.keyBinding.addKeyboardHandler(kb);\n    editor.on(\"changeSelection\", w.destroy);\n    editor.on(\"changeSession\", w.destroy);\n    editor.on(\"mouseup\", w.destroy);\n    editor.on(\"change\", w.destroy);\n    \n    editor.session.widgetManager.addLineWidget(w);\n    \n    w.el.onmousedown = editor.focus.bind(editor);\n    \n    editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n    .error_widget_wrapper {\\\n        background: inherit;\\\n        color: inherit;\\\n        border:none\\\n    }\\\n    .error_widget {\\\n        border-top: solid 2px;\\\n        border-bottom: solid 2px;\\\n        margin: 5px 0;\\\n        padding: 10px 40px;\\\n        white-space: pre-wrap;\\\n    }\\\n    .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n        border-color: #ff5a5a\\\n    }\\\n    .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n        border-color: #F1D817\\\n    }\\\n    .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n        border-color: #5a5a5a\\\n    }\\\n    .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n        border-color: #5aaa5a\\\n    }\\\n    .error_widget_arrow {\\\n        position: absolute;\\\n        border: solid 5px;\\\n        border-top-color: transparent!important;\\\n        border-right-color: transparent!important;\\\n        border-left-color: transparent!important;\\\n        top: -5px;\\\n    }\\\n\", \"\");\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\n\nvar Editor = acequire(\"./editor\").Editor;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar UndoManager = acequire(\"./undomanager\").UndoManager;\nvar Renderer = acequire(\"./virtual_renderer\").VirtualRenderer;\nacequire(\"./worker/worker_client\");\nacequire(\"./keyboard/hash_handler\");\nacequire(\"./placeholder\");\nacequire(\"./multi_select\");\nacequire(\"./mode/folding/fold_mode\");\nacequire(\"./theme/textmate\");\nacequire(\"./ext/error_marker\");\n\nexports.config = acequire(\"./config\");\nexports.acequire = acequire;\n\nif (typeof define === \"function\")\n    exports.define = define;\nexports.edit = function(el) {\n    if (typeof el == \"string\") {\n        var _id = el;\n        el = document.getElementById(_id);\n        if (!el)\n            throw new Error(\"ace.edit can't find div #\" + _id);\n    }\n\n    if (el && el.env && el.env.editor instanceof Editor)\n        return el.env.editor;\n\n    var value = \"\";\n    if (el && /input|textarea/i.test(el.tagName)) {\n        var oldNode = el;\n        value = oldNode.value;\n        el = dom.createElement(\"pre\");\n        oldNode.parentNode.replaceChild(el, oldNode);\n    } else if (el) {\n        value = dom.getInnerText(el);\n        el.innerHTML = \"\";\n    }\n\n    var doc = exports.createEditSession(value);\n\n    var editor = new Editor(new Renderer(el));\n    editor.setSession(doc);\n\n    var env = {\n        document: doc,\n        editor: editor,\n        onResize: editor.resize.bind(editor, null)\n    };\n    if (oldNode) env.textarea = oldNode;\n    event.addListener(window, \"resize\", env.onResize);\n    editor.on(\"destroy\", function() {\n        event.removeListener(window, \"resize\", env.onResize);\n        env.editor.container.env = null; // prevent memory leak on old ie\n    });\n    editor.container.env = editor.env = env;\n    return editor;\n};\nexports.createEditSession = function(text, mode) {\n    var doc = new EditSession(text, mode);\n    doc.setUndoManager(new UndoManager());\n    return doc;\n}\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.version = \"1.2.6\";\n});\n            (function() {\n                ace.acequire([\"ace/ace\"], function(a) {\n                    if (a) {\n                        a.config.init(true);\n                        a.define = ace.define;\n                    }\n                    if (!window.ace)\n                        window.ace = a;\n                    for (var key in a) if (a.hasOwnProperty(key))\n                        window.ace[key] = a[key];\n                });\n            })();\n        \nmodule.exports = window.ace.acequire(\"ace/ace\");\n},{\"w3c-blob\":268}],147:[function(require,module,exports){\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar DocCommentHighlightRules = acequire(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\nvar identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\";\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|async|await|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"u{[0-9a-fA-F]{1,6}}|\" + // es6 unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-7][0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            comments(\"no_regex\"),\n            {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0(?:[xX][0-9a-fA-F]+|[bB][01]+)\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d[\\d_]*(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[.](?![.])/,\n                next  : \"property\"\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|\\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\\|\\||\\?:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        property: [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[.](?![.])/\n            }, {\n                token : \"support.function\",\n                regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : \"support.function.dom\",\n                regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token :  \"support.constant\",\n                regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : \"identifier\",\n                regex : identifierRe\n            }, {\n                regex: \"\",\n                token: \"empty\",\n                next: \"no_regex\"\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            comments(\"start\"),\n            {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                }\n                else if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1 || this.next.indexOf(\"jsx\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n        \n        if (!options || options.jsx != false)\n            JSX.call(this);\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nfunction JSX() {\n    var tagRegex = identifierRe.replace(\"\\\\d\", \"\\\\d\\\\-\");\n    var jsxTag = {\n        onMatch : function(val, state, stack) {\n            var offset = val.charAt(1) == \"/\" ? 2 : 1;\n            if (offset == 1) {\n                if (state != this.nextState)\n                    stack.unshift(this.next, this.nextState, 0);\n                else\n                    stack.unshift(this.next);\n                stack[2]++;\n            } else if (offset == 2) {\n                if (state == this.nextState) {\n                    stack[1]--;\n                    if (!stack[1] || stack[1] < 0) {\n                        stack.shift();\n                        stack.shift();\n                    }\n                }\n            }\n            return [{\n                type: \"meta.tag.punctuation.\" + (offset == 1 ? \"\" : \"end-\") + \"tag-open.xml\",\n                value: val.slice(0, offset)\n            }, {\n                type: \"meta.tag.tag-name.xml\",\n                value: val.substr(offset)\n            }];\n        },\n        regex : \"</?\" + tagRegex + \"\",\n        next: \"jsxAttributes\",\n        nextState: \"jsx\"\n    };\n    this.$rules.start.unshift(jsxTag);\n    var jsxJsRule = {\n        regex: \"{\",\n        token: \"paren.quasi.start\",\n        push: \"start\"\n    };\n    this.$rules.jsx = [\n        jsxJsRule,\n        jsxTag,\n        {include : \"reference\"},\n        {defaultToken: \"string\"}\n    ];\n    this.$rules.jsxAttributes = [{\n        token : \"meta.tag.punctuation.tag-close.xml\", \n        regex : \"/?>\", \n        onMatch : function(value, currentState, stack) {\n            if (currentState == stack[0])\n                stack.shift();\n            if (value.length == 2) {\n                if (stack[0] == this.nextState)\n                    stack[1]--;\n                if (!stack[1] || stack[1] < 0) {\n                    stack.splice(0, 2);\n                }\n            }\n            this.next = stack[0] || \"start\";\n            return [{type: this.token, value: value}];\n        },\n        nextState: \"jsx\"\n    }, \n    jsxJsRule,\n    comments(\"jsxAttributes\"),\n    {\n        token : \"entity.other.attribute-name.xml\",\n        regex : tagRegex\n    }, {\n        token : \"keyword.operator.attribute-equals.xml\",\n        regex : \"=\"\n    }, {\n        token : \"text.tag-whitespace.xml\",\n        regex : \"\\\\s+\"\n    }, {\n        token : \"string.attribute-value.xml\",\n        regex : \"'\",\n        stateName : \"jsx_attr_q\",\n        push : [\n            {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n            {include : \"reference\"},\n            {defaultToken : \"string.attribute-value.xml\"}\n        ]\n    }, {\n        token : \"string.attribute-value.xml\",\n        regex : '\"',\n        stateName : \"jsx_attr_qq\",\n        push : [\n            {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n            {include : \"reference\"},\n            {defaultToken : \"string.attribute-value.xml\"}\n        ]\n    },\n    jsxTag\n    ];\n    this.$rules.reference = [{\n        token : \"constant.language.escape.reference.xml\",\n        regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n    }];\n}\n\nfunction comments(next) {\n    return [\n        {\n            token : \"comment\", // multi line comment\n            regex : /\\/\\*/,\n            next: [\n                DocCommentHighlightRules.getTagRule(),\n                {token : \"comment\", regex : \"\\\\*\\\\/\", next : next || \"pop\"},\n                {defaultToken : \"comment\", caseInsensitive: true}\n            ]\n        }, {\n            token : \"comment\",\n            regex : \"\\\\/\\\\/\",\n            next: [\n                DocCommentHighlightRules.getTagRule(),\n                {token : \"comment\", regex : \"$|^\", next : next || \"pop\"},\n                {defaultToken : \"comment\", caseInsensitive: true}\n            ]\n        }\n    ];\n}\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../../lib/oop\");\nvar Range = acequire(\"../../range\").Range;\nvar BaseFoldMode = acequire(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar TextMode = acequire(\"./text\").Mode;\nvar JavaScriptHighlightRules = acequire(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = acequire(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = acequire(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = acequire(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], require(\"../worker/javascript\"), \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"annotate\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\n},{\"../worker/javascript\":150}],148:[function(require,module,exports){\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/scad_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar lang = acequire(\"../lib/lang\");\nvar DocCommentHighlightRules = acequire(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\nvar scadHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": \"module|if|else|for\",\n        \"constant.language\": \"NULL\"\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n              token : \"constant\", // <CONSTANT>\n              regex : \"<[a-zA-Z0-9.]+>\"\n            }, {\n              token : \"keyword\", // pre-compiler directivs\n              regex : \"(?:use|include)\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ]\n    };\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(scadHighlightRules, TextHighlightRules);\n\nexports.scadHighlightRules = scadHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../../lib/oop\");\nvar Range = acequire(\"../../range\").Range;\nvar BaseFoldMode = acequire(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/scad\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/scad_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar TextMode = acequire(\"./text\").Mode;\nvar scadHighlightRules = acequire(\"./scad_highlight_rules\").scadHighlightRules;\nvar MatchingBraceOutdent = acequire(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = acequire(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = scadHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/scad\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\n},{}],149:[function(require,module,exports){\nace.define(\"ace/theme/chrome\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-chrome\";\nexports.cssText = \".ace-chrome .ace_gutter {\\\nbackground: #ebebeb;\\\ncolor: #333;\\\noverflow : hidden;\\\n}\\\n.ace-chrome .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-chrome {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-chrome .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-chrome .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-chrome .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_invalid {\\\nbackground-color: rgb(153, 0, 0);\\\ncolor: white;\\\n}\\\n.ace-chrome .ace_fold {\\\n}\\\n.ace-chrome .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-chrome .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_support.ace_type,\\\n.ace-chrome .ace_support.ace_class\\\n.ace-chrome .ace_support.ace_other {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-chrome .ace_variable.ace_parameter {\\\nfont-style:italic;\\\ncolor:#FD971F;\\\n}\\\n.ace-chrome .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-chrome .ace_comment {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc.ace_tag {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-chrome .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-chrome .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-chrome .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-chrome .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-chrome .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-chrome .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-chrome .ace_storage,\\\n.ace-chrome .ace_keyword,\\\n.ace-chrome .ace_meta.ace_tag {\\\ncolor: rgb(147, 15, 128);\\\n}\\\n.ace-chrome .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-chrome .ace_string {\\\ncolor: #1A1AA6;\\\n}\\\n.ace-chrome .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #994409;\\\n}\\\n.ace-chrome .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\n},{}],150:[function(require,module,exports){\nmodule.exports.id = 'ace/mode/javascript_worker';\nmodule.exports.src = \"\\\"no use strict\\\";(function(window){function resolveModuleId(id,paths){for(var testPath=id,tail=\\\"\\\";testPath;){var alias=paths[testPath];if(\\\"string\\\"==typeof alias)return alias+tail;if(alias)return alias.location.replace(/\\\\/*$/,\\\"/\\\")+(tail||alias.main||alias.name);if(alias===!1)return\\\"\\\";var i=testPath.lastIndexOf(\\\"/\\\");if(-1===i)break;tail=testPath.substr(i)+tail,testPath=testPath.slice(0,i)}return id}if(!(void 0!==window.window&&window.document||window.acequire&&window.define)){window.console||(window.console=function(){var msgs=Array.prototype.slice.call(arguments,0);postMessage({type:\\\"log\\\",data:msgs})},window.console.error=window.console.warn=window.console.log=window.console.trace=window.console),window.window=window,window.ace=window,window.onerror=function(message,file,line,col,err){postMessage({type:\\\"error\\\",data:{message:message,data:err.data,file:file,line:line,col:col,stack:err.stack}})},window.normalizeModule=function(parentId,moduleName){if(-1!==moduleName.indexOf(\\\"!\\\")){var chunks=moduleName.split(\\\"!\\\");return window.normalizeModule(parentId,chunks[0])+\\\"!\\\"+window.normalizeModule(parentId,chunks[1])}if(\\\".\\\"==moduleName.charAt(0)){var base=parentId.split(\\\"/\\\").slice(0,-1).join(\\\"/\\\");for(moduleName=(base?base+\\\"/\\\":\\\"\\\")+moduleName;-1!==moduleName.indexOf(\\\".\\\")&&previous!=moduleName;){var previous=moduleName;moduleName=moduleName.replace(/^\\\\.\\\\//,\\\"\\\").replace(/\\\\/\\\\.\\\\//,\\\"/\\\").replace(/[^\\\\/]+\\\\/\\\\.\\\\.\\\\//,\\\"\\\")}}return moduleName},window.acequire=function acequire(parentId,id){if(id||(id=parentId,parentId=null),!id.charAt)throw Error(\\\"worker.js acequire() accepts only (parentId, id) as arguments\\\");id=window.normalizeModule(parentId,id);var module=window.acequire.modules[id];if(module)return module.initialized||(module.initialized=!0,module.exports=module.factory().exports),module.exports;if(!window.acequire.tlns)return console.log(\\\"unable to load \\\"+id);var path=resolveModuleId(id,window.acequire.tlns);return\\\".js\\\"!=path.slice(-3)&&(path+=\\\".js\\\"),window.acequire.id=id,window.acequire.modules[id]={},importScripts(path),window.acequire(parentId,id)},window.acequire.modules={},window.acequire.tlns={},window.define=function(id,deps,factory){if(2==arguments.length?(factory=deps,\\\"string\\\"!=typeof id&&(deps=id,id=window.acequire.id)):1==arguments.length&&(factory=id,deps=[],id=window.acequire.id),\\\"function\\\"!=typeof factory)return window.acequire.modules[id]={exports:factory,initialized:!0},void 0;deps.length||(deps=[\\\"require\\\",\\\"exports\\\",\\\"module\\\"]);var req=function(childId){return window.acequire(id,childId)};window.acequire.modules[id]={exports:{},factory:function(){var module=this,returnExports=factory.apply(this,deps.map(function(dep){switch(dep){case\\\"require\\\":return req;case\\\"exports\\\":return module.exports;case\\\"module\\\":return module;default:return req(dep)}}));return returnExports&&(module.exports=returnExports),module}}},window.define.amd={},acequire.tlns={},window.initBaseUrls=function(topLevelNamespaces){for(var i in topLevelNamespaces)acequire.tlns[i]=topLevelNamespaces[i]},window.initSender=function(){var EventEmitter=window.acequire(\\\"ace/lib/event_emitter\\\").EventEmitter,oop=window.acequire(\\\"ace/lib/oop\\\"),Sender=function(){};return function(){oop.implement(this,EventEmitter),this.callback=function(data,callbackId){postMessage({type:\\\"call\\\",id:callbackId,data:data})},this.emit=function(name,data){postMessage({type:\\\"event\\\",name:name,data:data})}}.call(Sender.prototype),new Sender};var main=window.main=null,sender=window.sender=null;window.onmessage=function(e){var msg=e.data;if(msg.event&&sender)sender._signal(msg.event,msg.data);else if(msg.command)if(main[msg.command])main[msg.command].apply(main,msg.args);else{if(!window[msg.command])throw Error(\\\"Unknown command:\\\"+msg.command);window[msg.command].apply(window,msg.args)}else if(msg.init){window.initBaseUrls(msg.tlns),acequire(\\\"ace/lib/es5-shim\\\"),sender=window.sender=window.initSender();var clazz=acequire(msg.module)[msg.classname];main=window.main=new clazz(sender)}}}})(this),ace.define(\\\"ace/lib/oop\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.inherits=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})},exports.mixin=function(obj,mixin){for(var key in mixin)obj[key]=mixin[key];return obj},exports.implement=function(proto,mixin){exports.mixin(proto,mixin)}}),ace.define(\\\"ace/range\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";var comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},Range=function(startRow,startColumn,endRow,endColumn){this.start={row:startRow,column:startColumn},this.end={row:endRow,column:endColumn}};(function(){this.isEqual=function(range){return this.start.row===range.start.row&&this.end.row===range.end.row&&this.start.column===range.start.column&&this.end.column===range.end.column},this.toString=function(){return\\\"Range: [\\\"+this.start.row+\\\"/\\\"+this.start.column+\\\"] -> [\\\"+this.end.row+\\\"/\\\"+this.end.column+\\\"]\\\"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){\\\"object\\\"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){\\\"object\\\"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define(\\\"ace/apply_delta\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||\\\"\\\";switch(delta.action){case\\\"insert\\\":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case\\\"remove\\\":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define(\\\"ace/lib/event_emitter\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){\\\"object\\\"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?\\\"unshift\\\":\\\"push\\\"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define(\\\"ace/anchor\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/event_emitter\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"./lib/oop\\\"),EventEmitter=acequire(\\\"./lib/event_emitter\\\").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.column<point2.column;return point1.row<point2.row||point1.row==point2.row&&bColIsAfter}function $getTransformedPoint(delta,point,moveIfEqual){var deltaIsInsert=\\\"insert\\\"==delta.action,deltaRowShift=(deltaIsInsert?1:-1)*(delta.end.row-delta.start.row),deltaColShift=(deltaIsInsert?1:-1)*(delta.end.column-delta.start.column),deltaStart=delta.start,deltaEnd=deltaIsInsert?deltaStart:delta.end;return $pointsInOrder(point,deltaStart,moveIfEqual)?{row:point.row,column:point.column}:$pointsInOrder(deltaEnd,point,!moveIfEqual)?{row:point.row+deltaRowShift,column:point.column+(point.row==deltaEnd.row?deltaColShift:0)}:{row:deltaStart.row,column:deltaStart.column}}oop.implement(this,EventEmitter),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(delta){if(!(delta.start.row==delta.end.row&&delta.start.row!=this.row||delta.start.row>this.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal(\\\"change\\\",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener(\\\"change\\\",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on(\\\"change\\\",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define(\\\"ace/document\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/apply_delta\\\",\\\"ace/lib/event_emitter\\\",\\\"ace/range\\\",\\\"ace/anchor\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"./lib/oop\\\"),applyDelta=acequire(\\\"./apply_delta\\\").applyDelta,EventEmitter=acequire(\\\"./lib/event_emitter\\\").EventEmitter,Range=acequire(\\\"./range\\\").Range,Anchor=acequire(\\\"./anchor\\\").Anchor,Document=function(textOrLines){this.$lines=[\\\"\\\"],0===textOrLines.length?this.$lines=[\\\"\\\"]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0===\\\"aaa\\\".split(/a/).length?function(text){return text.replace(/\\\\r\\\\n|\\\\r/g,\\\"\\\\n\\\").split(\\\"\\\\n\\\")}:function(text){return text.split(/\\\\r\\\\n|\\\\r|\\\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\\\r\\\\n|\\\\r|\\\\n)/m);this.$autoNewLine=match?match[1]:\\\"\\\\n\\\",this._signal(\\\"changeNewLineMode\\\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\\\"windows\\\":return\\\"\\\\r\\\\n\\\";case\\\"unix\\\":return\\\"\\\\n\\\";default:return this.$autoNewLine||\\\"\\\\n\\\"}},this.$autoNewLine=\\\"\\\",this.$newLineMode=\\\"auto\\\",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal(\\\"changeNewLineMode\\\"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return\\\"\\\\r\\\\n\\\"==text||\\\"\\\\r\\\"==text||\\\"\\\\n\\\"==text},this.getLine=function(row){return this.$lines[row]||\\\"\\\"},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||\\\"\\\").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn(\\\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\\\"),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn(\\\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\\\"),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn(\\\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\\\"),this.insertMergedLines(position,[\\\"\\\",\\\"\\\"])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:\\\"insert\\\",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([\\\"\\\"]),column=0):(lines=[\\\"\\\"].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:\\\"insert\\\",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:\\\"remove\\\",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:\\\"remove\\\",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:\\\"remove\\\",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:\\\"remove\\\",lines:[\\\"\\\",\\\"\\\"]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert=\\\"insert\\\"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal(\\\"change\\\",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(\\\"\\\"),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:\\\"insert\\\"==delta.action?\\\"remove\\\":\\\"insert\\\",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define(\\\"ace/lib/lang\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split(\\\"\\\").reverse().join(\\\"\\\")},exports.stringRepeat=function(string,count){for(var result=\\\"\\\";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\\\s\\\\s*/,trimEndRegexp=/\\\\s\\\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,\\\"\\\")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,\\\"\\\")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&\\\"object\\\"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if(\\\"object\\\"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}if(\\\"[object Object]\\\"!==Object.prototype.toString.call(obj))return obj;copy={};for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\\\]\\\\/\\\\\\\\])/g,\\\"\\\\\\\\$1\\\")},exports.escapeHTML=function(str){return str.replace(/&/g,\\\"&#38;\\\").replace(/\\\"/g,\\\"&#34;\\\").replace(/'/g,\\\"&#39;\\\").replace(/</g,\\\"&#60;\\\")},exports.getMatchOffsets=function(string,regExp){var matches=[];return string.replace(regExp,function(str){matches.push({offset:arguments[arguments.length-2],length:str.length})}),matches},exports.deferredCall=function(fcn){var timer=null,callback=function(){timer=null,fcn()},deferred=function(timeout){return deferred.cancel(),timer=setTimeout(callback,timeout||0),deferred};return deferred.schedule=deferred,deferred.call=function(){return this.cancel(),fcn(),deferred},deferred.cancel=function(){return clearTimeout(timer),timer=null,deferred},deferred.isPending=function(){return timer},deferred},exports.delayedCall=function(fcn,defaultTimeout){var timer=null,callback=function(){timer=null,fcn()},_self=function(timeout){null==timer&&(timer=setTimeout(callback,timeout||defaultTimeout))};return _self.delay=function(timeout){timer&&clearTimeout(timer),timer=setTimeout(callback,timeout||defaultTimeout)},_self.schedule=_self,_self.call=function(){this.cancel(),fcn()},_self.cancel=function(){timer&&clearTimeout(timer),timer=null},_self.isPending=function(){return timer},_self}}),ace.define(\\\"ace/worker/mirror\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/range\\\",\\\"ace/document\\\",\\\"ace/lib/lang\\\"],function(acequire,exports){\\\"use strict\\\";acequire(\\\"../range\\\").Range;var Document=acequire(\\\"../document\\\").Document,lang=acequire(\\\"../lib/lang\\\"),Mirror=exports.Mirror=function(sender){this.sender=sender;var doc=this.doc=new Document(\\\"\\\"),deferredUpdate=this.deferredUpdate=lang.delayedCall(this.onUpdate.bind(this)),_self=this;sender.on(\\\"change\\\",function(e){var data=e.data;if(data[0].start)doc.applyDeltas(data);else for(var i=0;data.length>i;i+=2){if(Array.isArray(data[i+1]))var d={action:\\\"insert\\\",start:data[i],lines:data[i+1]};else var d={action:\\\"remove\\\",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define(\\\"ace/mode/javascript/jshint\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports,module){module.exports=function outer(modules,cache,entry){function newRequire(name,jumped){if(!cache[name]){if(!modules[name]){var currentRequire=\\\"function\\\"==typeof acequire&&acequire;if(!jumped&&currentRequire)return currentRequire(name,!0);if(previousRequire)return previousRequire(name,!0);var err=Error(\\\"Cannot find module '\\\"+name+\\\"'\\\");throw err.code=\\\"MODULE_NOT_FOUND\\\",err}var m=cache[name]={exports:{}};modules[name][0].call(m.exports,function(x){var id=modules[name][1][x];return newRequire(id?id:x)},m,m.exports,outer,modules,cache,entry)}return cache[name].exports}for(var previousRequire=\\\"function\\\"==typeof acequire&&acequire,i=0;entry.length>i;i++)newRequire(entry[i]);return newRequire(entry[0])}({\\\"/node_modules/browserify/node_modules/events/events.js\\\":[function(_dereq_,module){function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(arg){return\\\"function\\\"==typeof arg}function isNumber(arg){return\\\"number\\\"==typeof arg}function isObject(arg){return\\\"object\\\"==typeof arg&&null!==arg}function isUndefined(arg){return void 0===arg}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||0>n||isNaN(n))throw TypeError(\\\"n must be a positive number\\\");return this._maxListeners=n,this},EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(this._events||(this._events={}),\\\"error\\\"===type&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(er=arguments[1],er instanceof Error)throw er;throw TypeError('Uncaught, unspecified \\\"error\\\" event.')}if(handler=this._events[type],isUndefined(handler))return!1;if(isFunction(handler))switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];handler.apply(this,args)}else if(isObject(handler)){for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];for(listeners=handler.slice(),len=listeners.length,i=0;len>i;i++)listeners[i].apply(this,args)}return!0},EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError(\\\"listener must be a function\\\");if(this._events||(this._events={}),this._events.newListener&&this.emit(\\\"newListener\\\",type,isFunction(listener.listener)?listener.listener:listener),this._events[type]?isObject(this._events[type])?this._events[type].push(listener):this._events[type]=[this._events[type],listener]:this._events[type]=listener,isObject(this._events[type])&&!this._events[type].warned){var m;m=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,m&&m>0&&this._events[type].length>m&&(this._events[type].warned=!0,console.error(\\\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\\\",this._events[type].length),\\\"function\\\"==typeof console.trace&&console.trace())}return this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(type,listener){function g(){this.removeListener(type,g),fired||(fired=!0,listener.apply(this,arguments))}if(!isFunction(listener))throw TypeError(\\\"listener must be a function\\\");var fired=!1;return g.listener=listener,this.on(type,g),this},EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError(\\\"listener must be a function\\\");if(!this._events||!this._events[type])return this;if(list=this._events[type],length=list.length,position=-1,list===listener||isFunction(list.listener)&&list.listener===listener)delete this._events[type],this._events.removeListener&&this.emit(\\\"removeListener\\\",type,listener);else if(isObject(list)){for(i=length;i-->0;)if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}if(0>position)return this;1===list.length?(list.length=0,delete this._events[type]):list.splice(position,1),this._events.removeListener&&this.emit(\\\"removeListener\\\",type,listener)}return this},EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[type]&&delete this._events[type],this;if(0===arguments.length){for(key in this._events)\\\"removeListener\\\"!==key&&this.removeAllListeners(key);return this.removeAllListeners(\\\"removeListener\\\"),this._events={},this\\n}if(listeners=this._events[type],isFunction(listeners))this.removeListener(type,listeners);else for(;listeners.length;)this.removeListener(type,listeners[listeners.length-1]);return delete this._events[type],this},EventEmitter.prototype.listeners=function(type){var ret;return ret=this._events&&this._events[type]?isFunction(this._events[type])?[this._events[type]]:this._events[type].slice():[]},EventEmitter.listenerCount=function(emitter,type){var ret;return ret=emitter._events&&emitter._events[type]?isFunction(emitter._events[type])?1:emitter._events[type].length:0}},{}],\\\"/node_modules/jshint/data/ascii-identifier-data.js\\\":[function(_dereq_,module){for(var identifierStartTable=[],i=0;128>i;i++)identifierStartTable[i]=36===i||i>=65&&90>=i||95===i||i>=97&&122>=i;for(var identifierPartTable=[],i=0;128>i;i++)identifierPartTable[i]=identifierStartTable[i]||i>=48&&57>=i;module.exports={asciiIdentifierStartTable:identifierStartTable,asciiIdentifierPartTable:identifierPartTable}},{}],\\\"/node_modules/jshint/lodash.js\\\":[function(_dereq_,module,exports){(function(global){(function(){function baseFindIndex(array,predicate,fromRight){for(var length=array.length,index=fromRight?length:-1;fromRight?index--:length>++index;)if(predicate(array[index],index,array))return index;return-1}function baseIndexOf(array,value,fromIndex){if(value!==value)return indexOfNaN(array,fromIndex);for(var index=fromIndex-1,length=array.length;length>++index;)if(array[index]===value)return index;return-1}function baseIsFunction(value){return\\\"function\\\"==typeof value||!1}function baseToString(value){return\\\"string\\\"==typeof value?value:null==value?\\\"\\\":value+\\\"\\\"}function indexOfNaN(array,fromIndex,fromRight){for(var length=array.length,index=fromIndex+(fromRight?0:-1);fromRight?index--:length>++index;){var other=array[index];if(other!==other)return index}return-1}function isObjectLike(value){return!!value&&\\\"object\\\"==typeof value}function lodash(){}function arrayCopy(source,array){var index=-1,length=source.length;for(array||(array=Array(length));length>++index;)array[index]=source[index];return array}function arrayEach(array,iteratee){for(var index=-1,length=array.length;length>++index&&iteratee(array[index],index,array)!==!1;);return array}function arrayFilter(array,predicate){for(var index=-1,length=array.length,resIndex=-1,result=[];length>++index;){var value=array[index];predicate(value,index,array)&&(result[++resIndex]=value)}return result}function arrayMap(array,iteratee){for(var index=-1,length=array.length,result=Array(length);length>++index;)result[index]=iteratee(array[index],index,array);return result}function arrayMax(array){for(var index=-1,length=array.length,result=NEGATIVE_INFINITY;length>++index;){var value=array[index];value>result&&(result=value)}return result}function arraySome(array,predicate){for(var index=-1,length=array.length;length>++index;)if(predicate(array[index],index,array))return!0;return!1}function assignWith(object,source,customizer){var props=keys(source);push.apply(props,getSymbols(source));for(var index=-1,length=props.length;length>++index;){var key=props[index],value=object[key],result=customizer(value,source[key],key,object,source);(result===result?result===value:value!==value)&&(value!==undefined||key in object)||(object[key]=result)}return object}function baseCopy(source,props,object){object||(object={});for(var index=-1,length=props.length;length>++index;){var key=props[index];object[key]=source[key]}return object}function baseCallback(func,thisArg,argCount){var type=typeof func;return\\\"function\\\"==type?thisArg===undefined?func:bindCallback(func,thisArg,argCount):null==func?identity:\\\"object\\\"==type?baseMatches(func):thisArg===undefined?property(func):baseMatchesProperty(func,thisArg)}function baseClone(value,isDeep,customizer,key,object,stackA,stackB){var result;if(customizer&&(result=object?customizer(value,key,object):customizer(value)),result!==undefined)return result;if(!isObject(value))return value;var isArr=isArray(value);if(isArr){if(result=initCloneArray(value),!isDeep)return arrayCopy(value,result)}else{var tag=objToString.call(value),isFunc=tag==funcTag;if(tag!=objectTag&&tag!=argsTag&&(!isFunc||object))return cloneableTags[tag]?initCloneByTag(value,tag,isDeep):object?value:{};if(result=initCloneObject(isFunc?{}:value),!isDeep)return baseAssign(result,value)}stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==value)return stackB[length];return stackA.push(value),stackB.push(result),(isArr?arrayEach:baseForOwn)(value,function(subValue,key){result[key]=baseClone(subValue,isDeep,customizer,key,value,stackA,stackB)}),result}function baseFilter(collection,predicate){var result=[];return baseEach(collection,function(value,index,collection){predicate(value,index,collection)&&result.push(value)}),result}function baseForIn(object,iteratee){return baseFor(object,iteratee,keysIn)}function baseForOwn(object,iteratee){return baseFor(object,iteratee,keys)}function baseGet(object,path,pathKey){if(null!=object){pathKey!==undefined&&pathKey in toObject(object)&&(path=[pathKey]);for(var index=-1,length=path.length;null!=object&&length>++index;)var result=object=object[path[index]];return result}}function baseIsEqual(value,other,customizer,isLoose,stackA,stackB){if(value===other)return 0!==value||1/value==1/other;var valType=typeof value,othType=typeof other;return\\\"function\\\"!=valType&&\\\"object\\\"!=valType&&\\\"function\\\"!=othType&&\\\"object\\\"!=othType||null==value||null==other?value!==value&&other!==other:baseIsEqualDeep(value,other,baseIsEqual,customizer,isLoose,stackA,stackB)}function baseIsEqualDeep(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=arrayTag,othTag=arrayTag;objIsArr||(objTag=objToString.call(object),objTag==argsTag?objTag=objectTag:objTag!=objectTag&&(objIsArr=isTypedArray(object))),othIsArr||(othTag=objToString.call(other),othTag==argsTag?othTag=objectTag:othTag!=objectTag&&(othIsArr=isTypedArray(other)));var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&!objIsArr&&!objIsObj)return equalByTag(object,other,objTag);if(!isLoose){var valWrapped=objIsObj&&hasOwnProperty.call(object,\\\"__wrapped__\\\"),othWrapped=othIsObj&&hasOwnProperty.call(other,\\\"__wrapped__\\\");if(valWrapped||othWrapped)return equalFunc(valWrapped?object.value():object,othWrapped?other.value():other,customizer,isLoose,stackA,stackB)}if(!isSameTag)return!1;stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==object)return stackB[length]==other;stackA.push(object),stackB.push(other);var result=(objIsArr?equalArrays:equalObjects)(object,other,equalFunc,customizer,isLoose,stackA,stackB);return stackA.pop(),stackB.pop(),result}function baseIsMatch(object,props,values,strictCompareFlags,customizer){for(var index=-1,length=props.length,noCustomizer=!customizer;length>++index;)if(noCustomizer&&strictCompareFlags[index]?values[index]!==object[props[index]]:!(props[index]in object))return!1;for(index=-1;length>++index;){var key=props[index],objValue=object[key],srcValue=values[index];if(noCustomizer&&strictCompareFlags[index])var result=objValue!==undefined||key in object;else result=customizer?customizer(objValue,srcValue,key):undefined,result===undefined&&(result=baseIsEqual(srcValue,objValue,customizer,!0));if(!result)return!1}return!0}function baseMatches(source){var props=keys(source),length=props.length;if(!length)return constant(!0);if(1==length){var key=props[0],value=source[key];if(isStrictComparable(value))return function(object){return null==object?!1:object[key]===value&&(value!==undefined||key in toObject(object))}}for(var values=Array(length),strictCompareFlags=Array(length);length--;)value=source[props[length]],values[length]=value,strictCompareFlags[length]=isStrictComparable(value);return function(object){return null!=object&&baseIsMatch(toObject(object),props,values,strictCompareFlags)}}function baseMatchesProperty(path,value){var isArr=isArray(path),isCommon=isKey(path)&&isStrictComparable(value),pathKey=path+\\\"\\\";return path=toPath(path),function(object){if(null==object)return!1;var key=pathKey;if(object=toObject(object),!(!isArr&&isCommon||key in object)){if(object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),null==object)return!1;key=last(path),object=toObject(object)}return object[key]===value?value!==undefined||key in object:baseIsEqual(value,object[key],null,!0)}}function baseMerge(object,source,customizer,stackA,stackB){if(!isObject(object))return object;var isSrcArr=isLength(source.length)&&(isArray(source)||isTypedArray(source));if(!isSrcArr){var props=keys(source);push.apply(props,getSymbols(source))}return arrayEach(props||source,function(srcValue,key){if(props&&(key=srcValue,srcValue=source[key]),isObjectLike(srcValue))stackA||(stackA=[]),stackB||(stackB=[]),baseMergeDeep(object,source,key,baseMerge,customizer,stackA,stackB);else{var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue),!isSrcArr&&result===undefined||!isCommon&&(result===result?result===value:value!==value)||(object[key]=result)}}),object}function baseMergeDeep(object,source,key,mergeFunc,customizer,stackA,stackB){for(var length=stackA.length,srcValue=source[key];length--;)if(stackA[length]==srcValue)return object[key]=stackB[length],undefined;var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue,isLength(srcValue.length)&&(isArray(srcValue)||isTypedArray(srcValue))?result=isArray(value)?value:getLength(value)?arrayCopy(value):[]:isPlainObject(srcValue)||isArguments(srcValue)?result=isArguments(value)?toPlainObject(value):isPlainObject(value)?value:{}:isCommon=!1),stackA.push(srcValue),stackB.push(result),isCommon?object[key]=mergeFunc(result,srcValue,customizer,stackA,stackB):(result===result?result!==value:value===value)&&(object[key]=result)}function baseProperty(key){return function(object){return null==object?undefined:object[key]}}function basePropertyDeep(path){var pathKey=path+\\\"\\\";return path=toPath(path),function(object){return baseGet(object,path,pathKey)}}function baseSlice(array,start,end){var index=-1,length=array.length;start=null==start?0:+start||0,0>start&&(start=-start>length?0:length+start),end=end===undefined||end>length?length:+end||0,0>end&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);length>++index;)result[index]=array[index+start];return result}function baseSome(collection,predicate){var result;return baseEach(collection,function(value,index,collection){return result=predicate(value,index,collection),!result}),!!result}function baseValues(object,props){for(var index=-1,length=props.length,result=Array(length);length>++index;)result[index]=object[props[index]];return result}function binaryIndex(array,value,retHighest){var low=0,high=array?array.length:low;if(\\\"number\\\"==typeof value&&value===value&&HALF_MAX_ARRAY_LENGTH>=high){for(;high>low;){var mid=low+high>>>1,computed=array[mid];(retHighest?value>=computed:value>computed)?low=mid+1:high=mid}return high}return binaryIndexBy(array,value,identity,retHighest)}function binaryIndexBy(array,value,iteratee,retHighest){value=iteratee(value);for(var low=0,high=array?array.length:0,valIsNaN=value!==value,valIsUndef=value===undefined;high>low;){var mid=floor((low+high)/2),computed=iteratee(array[mid]),isReflexive=computed===computed;if(valIsNaN)var setLow=isReflexive||retHighest;else setLow=valIsUndef?isReflexive&&(retHighest||computed!==undefined):retHighest?value>=computed:value>computed;setLow?low=mid+1:high=mid}return nativeMin(high,MAX_ARRAY_INDEX)}function bindCallback(func,thisArg,argCount){if(\\\"function\\\"!=typeof func)return identity;if(thisArg===undefined)return func;switch(argCount){case 1:return function(value){return func.call(thisArg,value)};case 3:return function(value,index,collection){return func.call(thisArg,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(thisArg,accumulator,value,index,collection)};case 5:return function(value,other,key,object,source){return func.call(thisArg,value,other,key,object,source)}}return function(){return func.apply(thisArg,arguments)}}function bufferClone(buffer){return bufferSlice.call(buffer,0)}function createAssigner(assigner){return restParam(function(object,sources){var index=-1,length=null==object?0:sources.length,customizer=length>2&&sources[length-2],guard=length>2&&sources[2],thisArg=length>1&&sources[length-1];for(\\\"function\\\"==typeof customizer?(customizer=bindCallback(customizer,thisArg,5),length-=2):(customizer=\\\"function\\\"==typeof thisArg?thisArg:null,length-=customizer?1:0),guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=3>length?null:customizer,length=1);length>++index;){var source=sources[index];source&&assigner(object,source,customizer)}return object})}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){var length=collection?getLength(collection):0;if(!isLength(length))return eachFunc(collection,iteratee);for(var index=fromRight?length:-1,iterable=toObject(collection);(fromRight?index--:length>++index)&&iteratee(iterable[index],index,iterable)!==!1;);return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var iterable=toObject(object),props=keysFunc(object),length=props.length,index=fromRight?length:-1;fromRight?index--:length>++index;){var key=props[index];if(iteratee(iterable[key],key,iterable)===!1)break}return object}}function createFindIndex(fromRight){return function(array,predicate,thisArg){return array&&array.length?(predicate=getCallback(predicate,thisArg,3),baseFindIndex(array,predicate,fromRight)):-1}}function createForEach(arrayFunc,eachFunc){return function(collection,iteratee,thisArg){return\\\"function\\\"==typeof iteratee&&thisArg===undefined&&isArray(collection)?arrayFunc(collection,iteratee):eachFunc(collection,bindCallback(iteratee,thisArg,3))}}function equalArrays(array,other,equalFunc,customizer,isLoose,stackA,stackB){var index=-1,arrLength=array.length,othLength=other.length,result=!0;if(arrLength!=othLength&&!(isLoose&&othLength>arrLength))return!1;for(;result&&arrLength>++index;){var arrValue=array[index],othValue=other[index];if(result=undefined,customizer&&(result=isLoose?customizer(othValue,arrValue,index):customizer(arrValue,othValue,index)),result===undefined)if(isLoose)for(var othIndex=othLength;othIndex--&&(othValue=other[othIndex],!(result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB))););else result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB)}return!!result}function equalByTag(object,other,tag){switch(tag){case boolTag:case dateTag:return+object==+other;case errorTag:return object.name==other.name&&object.message==other.message;case numberTag:return object!=+object?other!=+other:0==object?1/object==1/other:object==+other;case regexpTag:case stringTag:return object==other+\\\"\\\"}return!1}function equalObjects(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objProps=keys(object),objLength=objProps.length,othProps=keys(other),othLength=othProps.length;if(objLength!=othLength&&!isLoose)return!1;for(var skipCtor=isLoose,index=-1;objLength>++index;){var key=objProps[index],result=isLoose?key in other:hasOwnProperty.call(other,key);if(result){var objValue=object[key],othValue=other[key];result=undefined,customizer&&(result=isLoose?customizer(othValue,objValue,key):customizer(objValue,othValue,key)),result===undefined&&(result=objValue&&objValue===othValue||equalFunc(objValue,othValue,customizer,isLoose,stackA,stackB))}if(!result)return!1;skipCtor||(skipCtor=\\\"constructor\\\"==key)}if(!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;if(objCtor!=othCtor&&\\\"constructor\\\"in object&&\\\"constructor\\\"in other&&!(\\\"function\\\"==typeof objCtor&&objCtor instanceof objCtor&&\\\"function\\\"==typeof othCtor&&othCtor instanceof othCtor))return!1}return!0}function getCallback(func,thisArg,argCount){var result=lodash.callback||callback;return result=result===callback?baseCallback:result,argCount?result(func,thisArg,argCount):result}function getIndexOf(collection,target,fromIndex){var result=lodash.indexOf||indexOf;return result=result===indexOf?baseIndexOf:result,collection?result(collection,target,fromIndex):result}function initCloneArray(array){var length=array.length,result=new array.constructor(length);return length&&\\\"string\\\"==typeof array[0]&&hasOwnProperty.call(array,\\\"index\\\")&&(result.index=array.index,result.input=array.input),result}function initCloneObject(object){var Ctor=object.constructor;return\\\"function\\\"==typeof Ctor&&Ctor instanceof Ctor||(Ctor=Object),new Ctor}function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return bufferClone(object);case boolTag:case dateTag:return new Ctor(+object);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:var buffer=object.buffer;return new Ctor(isDeep?bufferClone(buffer):buffer,object.byteOffset,object.length);case numberTag:case stringTag:return new Ctor(object);case regexpTag:var result=new Ctor(object.source,reFlags.exec(object));result.lastIndex=object.lastIndex}return result}function isIndex(value,length){return value=+value,length=null==length?MAX_SAFE_INTEGER:length,value>-1&&0==value%1&&length>value}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;if(\\\"number\\\"==type)var length=getLength(object),prereq=isLength(length)&&isIndex(index,length);else prereq=\\\"string\\\"==type&&index in object;if(prereq){var other=object[index];return value===value?value===other:other!==other}return!1}function isKey(value,object){var type=typeof value;if(\\\"string\\\"==type&&reIsPlainProp.test(value)||\\\"number\\\"==type)return!0;if(isArray(value))return!1;var result=!reIsDeepProp.test(value);return result||null!=object&&value in toObject(object)}function isLength(value){return\\\"number\\\"==typeof value&&value>-1&&0==value%1&&MAX_SAFE_INTEGER>=value}function isStrictComparable(value){return value===value&&(0===value?1/value>0:!isObject(value))}function shimIsPlainObject(value){var Ctor;if(lodash.support,!isObjectLike(value)||objToString.call(value)!=objectTag||!hasOwnProperty.call(value,\\\"constructor\\\")&&(Ctor=value.constructor,\\\"function\\\"==typeof Ctor&&!(Ctor instanceof Ctor)))return!1;var result;return baseForIn(value,function(subValue,key){result=key}),result===undefined||hasOwnProperty.call(value,result)}function shimKeys(object){for(var props=keysIn(object),propsLength=props.length,length=propsLength&&object.length,support=lodash.support,allowIndexes=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object)),index=-1,result=[];propsLength>++index;){var key=props[index];(allowIndexes&&isIndex(key,length)||hasOwnProperty.call(object,key))&&result.push(key)}return result}function toObject(value){return isObject(value)?value:Object(value)}function toPath(value){if(isArray(value))return value;var result=[];return baseToString(value).replace(rePropName,function(match,number,quote,string){result.push(quote?string.replace(reEscapeChar,\\\"$1\\\"):number||match)}),result}function indexOf(array,value,fromIndex){var length=array?array.length:0;if(!length)return-1;if(\\\"number\\\"==typeof fromIndex)fromIndex=0>fromIndex?nativeMax(length+fromIndex,0):fromIndex;else if(fromIndex){var index=binaryIndex(array,value),other=array[index];return(value===value?value===other:other!==other)?index:-1}return baseIndexOf(array,value,fromIndex||0)}function last(array){var length=array?array.length:0;return length?array[length-1]:undefined}function slice(array,start,end){var length=array?array.length:0;return length?(end&&\\\"number\\\"!=typeof end&&isIterateeCall(array,start,end)&&(start=0,end=length),baseSlice(array,start,end)):[]}function unzip(array){for(var index=-1,length=(array&&array.length&&arrayMax(arrayMap(array,getLength)))>>>0,result=Array(length);length>++index;)result[index]=arrayMap(array,baseProperty(index));return result}function includes(collection,target,fromIndex,guard){var length=collection?getLength(collection):0;return isLength(length)||(collection=values(collection),length=collection.length),length?(fromIndex=\\\"number\\\"!=typeof fromIndex||guard&&isIterateeCall(target,fromIndex,guard)?0:0>fromIndex?nativeMax(length+fromIndex,0):fromIndex||0,\\\"string\\\"==typeof collection||!isArray(collection)&&isString(collection)?length>fromIndex&&collection.indexOf(target,fromIndex)>-1:getIndexOf(collection,target,fromIndex)>-1):!1}function reject(collection,predicate,thisArg){var func=isArray(collection)?arrayFilter:baseFilter;return predicate=getCallback(predicate,thisArg,3),func(collection,function(value,index,collection){return!predicate(value,index,collection)})}function some(collection,predicate,thisArg){var func=isArray(collection)?arraySome:baseSome;return thisArg&&isIterateeCall(collection,predicate,thisArg)&&(predicate=null),(\\\"function\\\"!=typeof predicate||thisArg!==undefined)&&(predicate=getCallback(predicate,thisArg,3)),func(collection,predicate)}function restParam(func,start){if(\\\"function\\\"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=nativeMax(start===undefined?func.length-1:+start||0,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),rest=Array(length);length>++index;)rest[index]=args[start+index];switch(start){case 0:return func.call(this,rest);case 1:return func.call(this,args[0],rest);case 2:return func.call(this,args[0],args[1],rest)}var otherArgs=Array(start+1);for(index=-1;start>++index;)otherArgs[index]=args[index];return otherArgs[start]=rest,func.apply(this,otherArgs)}}function clone(value,isDeep,customizer,thisArg){return isDeep&&\\\"boolean\\\"!=typeof isDeep&&isIterateeCall(value,isDeep,customizer)?isDeep=!1:\\\"function\\\"==typeof isDeep&&(thisArg=customizer,customizer=isDeep,isDeep=!1),customizer=\\\"function\\\"==typeof customizer&&bindCallback(customizer,thisArg,1),baseClone(value,isDeep,customizer)}function isArguments(value){var length=isObjectLike(value)?value.length:undefined;return isLength(length)&&objToString.call(value)==argsTag}function isEmpty(value){if(null==value)return!0;var length=getLength(value);return isLength(length)&&(isArray(value)||isString(value)||isArguments(value)||isObjectLike(value)&&isFunction(value.splice))?!length:!keys(value).length}function isObject(value){var type=typeof value;return\\\"function\\\"==type||!!value&&\\\"object\\\"==type}function isNative(value){return null==value?!1:objToString.call(value)==funcTag?reIsNative.test(fnToString.call(value)):isObjectLike(value)&&reIsHostCtor.test(value)}function isNumber(value){return\\\"number\\\"==typeof value||isObjectLike(value)&&objToString.call(value)==numberTag}function isString(value){return\\\"string\\\"==typeof value||isObjectLike(value)&&objToString.call(value)==stringTag}function isTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[objToString.call(value)]}function toPlainObject(value){return baseCopy(value,keysIn(value))}function has(object,path){if(null==object)return!1;var result=hasOwnProperty.call(object,path);return result||isKey(path)||(path=toPath(path),object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),path=last(path),result=null!=object&&hasOwnProperty.call(object,path)),result}function keysIn(object){if(null==object)return[];isObject(object)||(object=Object(object));var length=object.length;length=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object))&&length||0;for(var Ctor=object.constructor,index=-1,isProto=\\\"function\\\"==typeof Ctor&&Ctor.prototype===object,result=Array(length),skipIndexes=length>0;length>++index;)result[index]=index+\\\"\\\";for(var key in object)skipIndexes&&isIndex(key,length)||\\\"constructor\\\"==key&&(isProto||!hasOwnProperty.call(object,key))||result.push(key);return result}function values(object){return baseValues(object,keys(object))}function escapeRegExp(string){return string=baseToString(string),string&&reHasRegExpChars.test(string)?string.replace(reRegExpChars,\\\"\\\\\\\\$&\\\"):string}function callback(func,thisArg,guard){return guard&&isIterateeCall(func,thisArg,guard)&&(thisArg=null),baseCallback(func,thisArg)}function constant(value){return function(){return value}}function identity(value){return value}function property(path){return isKey(path)?baseProperty(path):basePropertyDeep(path)}var undefined,VERSION=\\\"3.7.0\\\",FUNC_ERROR_TEXT=\\\"Expected a function\\\",argsTag=\\\"[object Arguments]\\\",arrayTag=\\\"[object Array]\\\",boolTag=\\\"[object Boolean]\\\",dateTag=\\\"[object Date]\\\",errorTag=\\\"[object Error]\\\",funcTag=\\\"[object Function]\\\",mapTag=\\\"[object Map]\\\",numberTag=\\\"[object Number]\\\",objectTag=\\\"[object Object]\\\",regexpTag=\\\"[object RegExp]\\\",setTag=\\\"[object Set]\\\",stringTag=\\\"[object String]\\\",weakMapTag=\\\"[object WeakMap]\\\",arrayBufferTag=\\\"[object ArrayBuffer]\\\",float32Tag=\\\"[object Float32Array]\\\",float64Tag=\\\"[object Float64Array]\\\",int8Tag=\\\"[object Int8Array]\\\",int16Tag=\\\"[object Int16Array]\\\",int32Tag=\\\"[object Int32Array]\\\",uint8Tag=\\\"[object Uint8Array]\\\",uint8ClampedTag=\\\"[object Uint8ClampedArray]\\\",uint16Tag=\\\"[object Uint16Array]\\\",uint32Tag=\\\"[object Uint32Array]\\\",reIsDeepProp=/\\\\.|\\\\[(?:[^[\\\\]]+|([\\\"'])(?:(?!\\\\1)[^\\\\n\\\\\\\\]|\\\\\\\\.)*?)\\\\1\\\\]/,reIsPlainProp=/^\\\\w*$/,rePropName=/[^.[\\\\]]+|\\\\[(?:(-?\\\\d+(?:\\\\.\\\\d+)?)|([\\\"'])((?:(?!\\\\2)[^\\\\n\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]/g,reRegExpChars=/[.*+?^${}()|[\\\\]\\\\/\\\\\\\\]/g,reHasRegExpChars=RegExp(reRegExpChars.source),reEscapeChar=/\\\\\\\\(\\\\\\\\)?/g,reFlags=/\\\\w*$/,reIsHostCtor=/^\\\\[object .+?Constructor\\\\]$/,typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[stringTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=!0,cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[mapTag]=cloneableTags[setTag]=cloneableTags[weakMapTag]=!1;var objectTypes={\\\"function\\\":!0,object:!0},freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module,freeGlobal=freeExports&&freeModule&&\\\"object\\\"==typeof global&&global&&global.Object&&global,freeSelf=objectTypes[typeof self]&&self&&self.Object&&self,freeWindow=objectTypes[typeof window]&&window&&window.Object&&window,moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports,root=freeGlobal||freeWindow!==(this&&this.window)&&freeWindow||freeSelf||this,arrayProto=Array.prototype,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp(\\\"^\\\"+escapeRegExp(objToString).replace(/toString|(function).*?(?=\\\\\\\\\\\\()| for .+?(?=\\\\\\\\\\\\])/g,\\\"$1.*?\\\")+\\\"$\\\"),ArrayBuffer=isNative(ArrayBuffer=root.ArrayBuffer)&&ArrayBuffer,bufferSlice=isNative(bufferSlice=ArrayBuffer&&new ArrayBuffer(0).slice)&&bufferSlice,floor=Math.floor,getOwnPropertySymbols=isNative(getOwnPropertySymbols=Object.getOwnPropertySymbols)&&getOwnPropertySymbols,getPrototypeOf=isNative(getPrototypeOf=Object.getPrototypeOf)&&getPrototypeOf,push=arrayProto.push,preventExtensions=isNative(Object.preventExtensions=Object.preventExtensions)&&preventExtensions,propertyIsEnumerable=objectProto.propertyIsEnumerable,Uint8Array=isNative(Uint8Array=root.Uint8Array)&&Uint8Array,Float64Array=function(){try{var func=isNative(func=root.Float64Array)&&func,result=new func(new ArrayBuffer(10),0,1)&&func}catch(e){}return result}(),nativeAssign=function(){var object={1:0},func=preventExtensions&&isNative(func=Object.assign)&&func;try{func(preventExtensions(object),\\\"xo\\\")}catch(e){}return!object[1]&&func}(),nativeIsArray=isNative(nativeIsArray=Array.isArray)&&nativeIsArray,nativeKeys=isNative(nativeKeys=Object.keys)&&nativeKeys,nativeMax=Math.max,nativeMin=Math.min,NEGATIVE_INFINITY=Number.NEGATIVE_INFINITY,MAX_ARRAY_LENGTH=Math.pow(2,32)-1,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1,FLOAT64_BYTES_PER_ELEMENT=Float64Array?Float64Array.BYTES_PER_ELEMENT:0,MAX_SAFE_INTEGER=Math.pow(2,53)-1,support=lodash.support={};(function(x){var Ctor=function(){this.x=x},props=[];Ctor.prototype={valueOf:x,y:x};for(var key in new Ctor)props.push(key);support.funcDecomp=/\\\\bthis\\\\b/.test(function(){return this}),support.funcNames=\\\"string\\\"==typeof Function.name;try{support.nonEnumArgs=!propertyIsEnumerable.call(arguments,1)}catch(e){support.nonEnumArgs=!0}})(1,0);var baseAssign=nativeAssign||function(object,source){return null==source?object:baseCopy(source,getSymbols(source),baseCopy(source,keys(source),object))},baseEach=createBaseEach(baseForOwn),baseFor=createBaseFor();bufferSlice||(bufferClone=ArrayBuffer&&Uint8Array?function(buffer){var byteLength=buffer.byteLength,floatLength=Float64Array?floor(byteLength/FLOAT64_BYTES_PER_ELEMENT):0,offset=floatLength*FLOAT64_BYTES_PER_ELEMENT,result=new ArrayBuffer(byteLength);if(floatLength){var view=new Float64Array(result,0,floatLength);view.set(new Float64Array(buffer,0,floatLength))}return byteLength!=offset&&(view=new Uint8Array(result,offset),view.set(new Uint8Array(buffer,offset))),result}:constant(null));var getLength=baseProperty(\\\"length\\\"),getSymbols=getOwnPropertySymbols?function(object){return getOwnPropertySymbols(toObject(object))}:constant([]),findLastIndex=createFindIndex(!0),zip=restParam(unzip),forEach=createForEach(arrayEach,baseEach),isArray=nativeIsArray||function(value){return isObjectLike(value)&&isLength(value.length)&&objToString.call(value)==arrayTag},isFunction=baseIsFunction(/x/)||Uint8Array&&!baseIsFunction(Uint8Array)?function(value){return objToString.call(value)==funcTag}:baseIsFunction,isPlainObject=getPrototypeOf?function(value){if(!value||objToString.call(value)!=objectTag)return!1;var valueOf=value.valueOf,objProto=isNative(valueOf)&&(objProto=getPrototypeOf(valueOf))&&getPrototypeOf(objProto);return objProto?value==objProto||getPrototypeOf(value)==objProto:shimIsPlainObject(value)}:shimIsPlainObject,assign=createAssigner(function(object,source,customizer){return customizer?assignWith(object,source,customizer):baseAssign(object,source)}),keys=nativeKeys?function(object){if(object)var Ctor=object.constructor,length=object.length;return\\\"function\\\"==typeof Ctor&&Ctor.prototype===object||\\\"function\\\"!=typeof object&&isLength(length)?shimKeys(object):isObject(object)?nativeKeys(object):[]}:shimKeys,merge=createAssigner(baseMerge);lodash.assign=assign,lodash.callback=callback,lodash.constant=constant,lodash.forEach=forEach,lodash.keys=keys,lodash.keysIn=keysIn,lodash.merge=merge,lodash.property=property,lodash.reject=reject,lodash.restParam=restParam,lodash.slice=slice,lodash.toPlainObject=toPlainObject,lodash.unzip=unzip,lodash.values=values,lodash.zip=zip,lodash.each=forEach,lodash.extend=assign,lodash.iteratee=callback,lodash.clone=clone,lodash.escapeRegExp=escapeRegExp,lodash.findLastIndex=findLastIndex,lodash.has=has,lodash.identity=identity,lodash.includes=includes,lodash.indexOf=indexOf,lodash.isArguments=isArguments,lodash.isArray=isArray,lodash.isEmpty=isEmpty,lodash.isFunction=isFunction,lodash.isNative=isNative,lodash.isNumber=isNumber,lodash.isObject=isObject,lodash.isPlainObject=isPlainObject,lodash.isString=isString,lodash.isTypedArray=isTypedArray,lodash.last=last,lodash.some=some,lodash.any=some,lodash.contains=includes,lodash.include=includes,lodash.VERSION=VERSION,freeExports&&freeModule?moduleExports?(freeModule.exports=lodash)._=lodash:freeExports._=lodash:root._=lodash\\n}).call(this)}).call(this,\\\"undefined\\\"!=typeof global?global:\\\"undefined\\\"!=typeof self?self:\\\"undefined\\\"!=typeof window?window:{})},{}],\\\"/node_modules/jshint/src/jshint.js\\\":[function(_dereq_,module,exports){var _=_dereq_(\\\"../lodash\\\"),events=_dereq_(\\\"events\\\"),vars=_dereq_(\\\"./vars.js\\\"),messages=_dereq_(\\\"./messages.js\\\"),Lexer=_dereq_(\\\"./lex.js\\\").Lexer,reg=_dereq_(\\\"./reg.js\\\"),state=_dereq_(\\\"./state.js\\\").state,style=_dereq_(\\\"./style.js\\\"),options=_dereq_(\\\"./options.js\\\"),scopeManager=_dereq_(\\\"./scope-manager.js\\\"),JSHINT=function(){\\\"use strict\\\";function checkOption(name,t){return name=name.trim(),/^[+-]W\\\\d{3}$/g.test(name)?!0:-1!==options.validNames.indexOf(name)||\\\"jslint\\\"===t.type||_.has(options.removed,name)?!0:(error(\\\"E001\\\",t,name),!1)}function isString(obj){return\\\"[object String]\\\"===Object.prototype.toString.call(obj)}function isIdentifier(tkn,value){return tkn?tkn.identifier&&tkn.value===value?!0:!1:!1}function isReserved(token){if(!token.reserved)return!1;var meta=token.meta;if(meta&&meta.isFutureReservedWord&&state.inES5()){if(!meta.es5)return!1;if(meta.strictOnly&&!state.option.strict&&!state.isStrict())return!1;if(token.isProperty)return!1}return!0}function supplant(str,data){return str.replace(/\\\\{([^{}]*)\\\\}/g,function(a,b){var r=data[b];return\\\"string\\\"==typeof r||\\\"number\\\"==typeof r?r:a})}function combine(dest,src){Object.keys(src).forEach(function(name){_.has(JSHINT.blacklist,name)||(dest[name]=src[name])})}function processenforceall(){if(state.option.enforceall){for(var enforceopt in options.bool.enforcing)void 0!==state.option[enforceopt]||options.noenforceall[enforceopt]||(state.option[enforceopt]=!0);for(var relaxopt in options.bool.relaxing)void 0===state.option[relaxopt]&&(state.option[relaxopt]=!1)}}function assume(){processenforceall(),state.option.esversion||state.option.moz||(state.option.esversion=state.option.es3?3:state.option.esnext?6:5),state.inES5()&&combine(predefined,vars.ecmaIdentifiers[5]),state.inES6()&&combine(predefined,vars.ecmaIdentifiers[6]),state.option.module&&(state.option.strict===!0&&(state.option.strict=\\\"global\\\"),state.inES6()||warning(\\\"W134\\\",state.tokens.next,\\\"module\\\",6)),state.option.couch&&combine(predefined,vars.couch),state.option.qunit&&combine(predefined,vars.qunit),state.option.rhino&&combine(predefined,vars.rhino),state.option.shelljs&&(combine(predefined,vars.shelljs),combine(predefined,vars.node)),state.option.typed&&combine(predefined,vars.typed),state.option.phantom&&(combine(predefined,vars.phantom),state.option.strict===!0&&(state.option.strict=\\\"global\\\")),state.option.prototypejs&&combine(predefined,vars.prototypejs),state.option.node&&(combine(predefined,vars.node),combine(predefined,vars.typed),state.option.strict===!0&&(state.option.strict=\\\"global\\\")),state.option.devel&&combine(predefined,vars.devel),state.option.dojo&&combine(predefined,vars.dojo),state.option.browser&&(combine(predefined,vars.browser),combine(predefined,vars.typed)),state.option.browserify&&(combine(predefined,vars.browser),combine(predefined,vars.typed),combine(predefined,vars.browserify),state.option.strict===!0&&(state.option.strict=\\\"global\\\")),state.option.nonstandard&&combine(predefined,vars.nonstandard),state.option.jasmine&&combine(predefined,vars.jasmine),state.option.jquery&&combine(predefined,vars.jquery),state.option.mootools&&combine(predefined,vars.mootools),state.option.worker&&combine(predefined,vars.worker),state.option.wsh&&combine(predefined,vars.wsh),state.option.globalstrict&&state.option.strict!==!1&&(state.option.strict=\\\"global\\\"),state.option.yui&&combine(predefined,vars.yui),state.option.mocha&&combine(predefined,vars.mocha)}function quit(code,line,chr){var percentage=Math.floor(100*(line/state.lines.length)),message=messages.errors[code].desc;throw{name:\\\"JSHintError\\\",line:line,character:chr,message:message+\\\" (\\\"+percentage+\\\"% scanned).\\\",raw:message,code:code}}function removeIgnoredMessages(){var ignored=state.ignoredLines;_.isEmpty(ignored)||(JSHINT.errors=_.reject(JSHINT.errors,function(err){return ignored[err.line]}))}function warning(code,t,a,b,c,d){var ch,l,w,msg;if(/^W\\\\d{3}$/.test(code)){if(state.ignored[code])return;msg=messages.warnings[code]}else/E\\\\d{3}/.test(code)?msg=messages.errors[code]:/I\\\\d{3}/.test(code)&&(msg=messages.info[code]);return t=t||state.tokens.next||{},\\\"(end)\\\"===t.id&&(t=state.tokens.curr),l=t.line||0,ch=t.from||0,w={id:\\\"(error)\\\",raw:msg.desc,code:msg.code,evidence:state.lines[l-1]||\\\"\\\",line:l,character:ch,scope:JSHINT.scope,a:a,b:b,c:c,d:d},w.reason=supplant(msg.desc,w),JSHINT.errors.push(w),removeIgnoredMessages(),JSHINT.errors.length>=state.option.maxerr&&quit(\\\"E043\\\",l,ch),w}function warningAt(m,l,ch,a,b,c,d){return warning(m,{line:l,from:ch},a,b,c,d)}function error(m,t,a,b,c,d){warning(m,t,a,b,c,d)}function errorAt(m,l,ch,a,b,c,d){return error(m,{line:l,from:ch},a,b,c,d)}function addInternalSrc(elem,src){var i;return i={id:\\\"(internal)\\\",elem:elem,value:src},JSHINT.internals.push(i),i}function doOption(){var nt=state.tokens.next,body=nt.body.match(/(-\\\\s+)?[^\\\\s,:]+(?:\\\\s*:\\\\s*(-\\\\s+)?[^\\\\s,]+)?/g)||[],predef={};if(\\\"globals\\\"===nt.type){body.forEach(function(g,idx){g=g.split(\\\":\\\");var key=(g[0]||\\\"\\\").trim(),val=(g[1]||\\\"\\\").trim();if(\\\"-\\\"===key||!key.length){if(idx>0&&idx===body.length-1)return;return error(\\\"E002\\\",nt),void 0}\\\"-\\\"===key.charAt(0)?(key=key.slice(1),val=!1,JSHINT.blacklist[key]=key,delete predefined[key]):predef[key]=\\\"true\\\"===val}),combine(predefined,predef);for(var key in predef)_.has(predef,key)&&(declared[key]=nt)}\\\"exported\\\"===nt.type&&body.forEach(function(e,idx){if(!e.length){if(idx>0&&idx===body.length-1)return;return error(\\\"E002\\\",nt),void 0}state.funct[\\\"(scope)\\\"].addExported(e)}),\\\"members\\\"===nt.type&&(membersOnly=membersOnly||{},body.forEach(function(m){var ch1=m.charAt(0),ch2=m.charAt(m.length-1);ch1!==ch2||'\\\"'!==ch1&&\\\"'\\\"!==ch1||(m=m.substr(1,m.length-2).replace('\\\\\\\\\\\"','\\\"')),membersOnly[m]=!1}));var numvals=[\\\"maxstatements\\\",\\\"maxparams\\\",\\\"maxdepth\\\",\\\"maxcomplexity\\\",\\\"maxerr\\\",\\\"maxlen\\\",\\\"indent\\\"];(\\\"jshint\\\"===nt.type||\\\"jslint\\\"===nt.type)&&(body.forEach(function(g){g=g.split(\\\":\\\");var key=(g[0]||\\\"\\\").trim(),val=(g[1]||\\\"\\\").trim();if(checkOption(key,nt))if(numvals.indexOf(key)>=0)if(\\\"false\\\"!==val){if(val=+val,\\\"number\\\"!=typeof val||!isFinite(val)||0>=val||Math.floor(val)!==val)return error(\\\"E032\\\",nt,g[1].trim()),void 0;state.option[key]=val}else state.option[key]=\\\"indent\\\"===key?4:!1;else{if(\\\"validthis\\\"===key)return state.funct[\\\"(global)\\\"]?void error(\\\"E009\\\"):\\\"true\\\"!==val&&\\\"false\\\"!==val?void error(\\\"E002\\\",nt):(state.option.validthis=\\\"true\\\"===val,void 0);if(\\\"quotmark\\\"!==key)if(\\\"shadow\\\"!==key)if(\\\"unused\\\"!==key)if(\\\"latedef\\\"!==key)if(\\\"ignore\\\"!==key)if(\\\"strict\\\"!==key){\\\"module\\\"===key&&(hasParsedCode(state.funct)||error(\\\"E055\\\",state.tokens.next,\\\"module\\\"));var esversions={es3:3,es5:5,esnext:6};if(!_.has(esversions,key)){if(\\\"esversion\\\"===key){switch(val){case\\\"5\\\":state.inES5(!0)&&warning(\\\"I003\\\");case\\\"3\\\":case\\\"6\\\":state.option.moz=!1,state.option.esversion=+val;break;case\\\"2015\\\":state.option.moz=!1,state.option.esversion=6;break;default:error(\\\"E002\\\",nt)}return hasParsedCode(state.funct)||error(\\\"E055\\\",state.tokens.next,\\\"esversion\\\"),void 0}var match=/^([+-])(W\\\\d{3})$/g.exec(key);if(match)return state.ignored[match[2]]=\\\"-\\\"===match[1],void 0;var tn;return\\\"true\\\"===val||\\\"false\\\"===val?(\\\"jslint\\\"===nt.type?(tn=options.renamed[key]||key,state.option[tn]=\\\"true\\\"===val,void 0!==options.inverted[tn]&&(state.option[tn]=!state.option[tn])):state.option[key]=\\\"true\\\"===val,\\\"newcap\\\"===key&&(state.option[\\\"(explicitNewcap)\\\"]=!0),void 0):(error(\\\"E002\\\",nt),void 0)}switch(val){case\\\"true\\\":state.option.moz=!1,state.option.esversion=esversions[key];break;case\\\"false\\\":state.option.moz||(state.option.esversion=5);break;default:error(\\\"E002\\\",nt)}}else switch(val){case\\\"true\\\":state.option.strict=!0;break;case\\\"false\\\":state.option.strict=!1;break;case\\\"func\\\":case\\\"global\\\":case\\\"implied\\\":state.option.strict=val;break;default:error(\\\"E002\\\",nt)}else switch(val){case\\\"line\\\":state.ignoredLines[nt.line]=!0,removeIgnoredMessages();break;default:error(\\\"E002\\\",nt)}else switch(val){case\\\"true\\\":state.option.latedef=!0;break;case\\\"false\\\":state.option.latedef=!1;break;case\\\"nofunc\\\":state.option.latedef=\\\"nofunc\\\";break;default:error(\\\"E002\\\",nt)}else switch(val){case\\\"true\\\":state.option.unused=!0;break;case\\\"false\\\":state.option.unused=!1;break;case\\\"vars\\\":case\\\"strict\\\":state.option.unused=val;break;default:error(\\\"E002\\\",nt)}else switch(val){case\\\"true\\\":state.option.shadow=!0;break;case\\\"outer\\\":state.option.shadow=\\\"outer\\\";break;case\\\"false\\\":case\\\"inner\\\":state.option.shadow=\\\"inner\\\";break;default:error(\\\"E002\\\",nt)}else switch(val){case\\\"true\\\":case\\\"false\\\":state.option.quotmark=\\\"true\\\"===val;break;case\\\"double\\\":case\\\"single\\\":state.option.quotmark=val;break;default:error(\\\"E002\\\",nt)}}}),assume())}function peek(p){var t,i=p||0,j=lookahead.length;if(j>i)return lookahead[i];for(;i>=j;)t=lookahead[j],t||(t=lookahead[j]=lex.token()),j+=1;return t||\\\"(end)\\\"!==state.tokens.next.id?t:state.tokens.next}function peekIgnoreEOL(){var t,i=0;do t=peek(i++);while(\\\"(endline)\\\"===t.id);return t}function advance(id,t){switch(state.tokens.curr.id){case\\\"(number)\\\":\\\".\\\"===state.tokens.next.id&&warning(\\\"W005\\\",state.tokens.curr);break;case\\\"-\\\":(\\\"-\\\"===state.tokens.next.id||\\\"--\\\"===state.tokens.next.id)&&warning(\\\"W006\\\");break;case\\\"+\\\":(\\\"+\\\"===state.tokens.next.id||\\\"++\\\"===state.tokens.next.id)&&warning(\\\"W007\\\")}for(id&&state.tokens.next.id!==id&&(t?\\\"(end)\\\"===state.tokens.next.id?error(\\\"E019\\\",t,t.id):error(\\\"E020\\\",state.tokens.next,id,t.id,t.line,state.tokens.next.value):(\\\"(identifier)\\\"!==state.tokens.next.type||state.tokens.next.value!==id)&&warning(\\\"W116\\\",state.tokens.next,id,state.tokens.next.value)),state.tokens.prev=state.tokens.curr,state.tokens.curr=state.tokens.next;;){if(state.tokens.next=lookahead.shift()||lex.token(),state.tokens.next||quit(\\\"E041\\\",state.tokens.curr.line),\\\"(end)\\\"===state.tokens.next.id||\\\"(error)\\\"===state.tokens.next.id)return;if(state.tokens.next.check&&state.tokens.next.check(),state.tokens.next.isSpecial)\\\"falls through\\\"===state.tokens.next.type?state.tokens.curr.caseFallsThrough=!0:doOption();else if(\\\"(endline)\\\"!==state.tokens.next.id)break}}function isInfix(token){return token.infix||!token.identifier&&!token.template&&!!token.led}function isEndOfExpr(){var curr=state.tokens.curr,next=state.tokens.next;return\\\";\\\"===next.id||\\\"}\\\"===next.id||\\\":\\\"===next.id?!0:isInfix(next)===isInfix(curr)||\\\"yield\\\"===curr.id&&state.inMoz()?curr.line!==startLine(next):!1}function isBeginOfExpr(prev){return!prev.left&&\\\"unary\\\"!==prev.arity}function expression(rbp,initial){var left,isArray=!1,isObject=!1,isLetExpr=!1;state.nameStack.push(),initial||\\\"let\\\"!==state.tokens.next.value||\\\"(\\\"!==peek(0).value||(state.inMoz()||warning(\\\"W118\\\",state.tokens.next,\\\"let expressions\\\"),isLetExpr=!0,state.funct[\\\"(scope)\\\"].stack(),advance(\\\"let\\\"),advance(\\\"(\\\"),state.tokens.prev.fud(),advance(\\\")\\\")),\\\"(end)\\\"===state.tokens.next.id&&error(\\\"E006\\\",state.tokens.curr);var isDangerous=state.option.asi&&state.tokens.prev.line!==startLine(state.tokens.curr)&&_.contains([\\\"]\\\",\\\")\\\"],state.tokens.prev.id)&&_.contains([\\\"[\\\",\\\"(\\\"],state.tokens.curr.id);if(isDangerous&&warning(\\\"W014\\\",state.tokens.curr,state.tokens.curr.id),advance(),initial&&(state.funct[\\\"(verb)\\\"]=state.tokens.curr.value,state.tokens.curr.beginsStmt=!0),initial===!0&&state.tokens.curr.fud)left=state.tokens.curr.fud();else for(state.tokens.curr.nud?left=state.tokens.curr.nud():error(\\\"E030\\\",state.tokens.curr,state.tokens.curr.id);(state.tokens.next.lbp>rbp||\\\"(template)\\\"===state.tokens.next.type)&&!isEndOfExpr();)isArray=\\\"Array\\\"===state.tokens.curr.value,isObject=\\\"Object\\\"===state.tokens.curr.value,left&&(left.value||left.first&&left.first.value)&&(\\\"new\\\"!==left.value||left.first&&left.first.value&&\\\".\\\"===left.first.value)&&(isArray=!1,left.value!==state.tokens.curr.value&&(isObject=!1)),advance(),isArray&&\\\"(\\\"===state.tokens.curr.id&&\\\")\\\"===state.tokens.next.id&&warning(\\\"W009\\\",state.tokens.curr),isObject&&\\\"(\\\"===state.tokens.curr.id&&\\\")\\\"===state.tokens.next.id&&warning(\\\"W010\\\",state.tokens.curr),left&&state.tokens.curr.led?left=state.tokens.curr.led(left):error(\\\"E033\\\",state.tokens.curr,state.tokens.curr.id);return isLetExpr&&state.funct[\\\"(scope)\\\"].unstack(),state.nameStack.pop(),left}function startLine(token){return token.startLine||token.line}function nobreaknonadjacent(left,right){left=left||state.tokens.curr,right=right||state.tokens.next,state.option.laxbreak||left.line===startLine(right)||warning(\\\"W014\\\",right,right.value)}function nolinebreak(t){t=t||state.tokens.curr,t.line!==startLine(state.tokens.next)&&warning(\\\"E022\\\",t,t.value)}function nobreakcomma(left,right){left.line!==startLine(right)&&(state.option.laxcomma||(comma.first&&(warning(\\\"I001\\\"),comma.first=!1),warning(\\\"W014\\\",left,right.value)))}function comma(opts){if(opts=opts||{},opts.peek?nobreakcomma(state.tokens.prev,state.tokens.curr):(nobreakcomma(state.tokens.curr,state.tokens.next),advance(\\\",\\\")),state.tokens.next.identifier&&(!opts.property||!state.inES5()))switch(state.tokens.next.value){case\\\"break\\\":case\\\"case\\\":case\\\"catch\\\":case\\\"continue\\\":case\\\"default\\\":case\\\"do\\\":case\\\"else\\\":case\\\"finally\\\":case\\\"for\\\":case\\\"if\\\":case\\\"in\\\":case\\\"instanceof\\\":case\\\"return\\\":case\\\"switch\\\":case\\\"throw\\\":case\\\"try\\\":case\\\"var\\\":case\\\"let\\\":case\\\"while\\\":case\\\"with\\\":return error(\\\"E024\\\",state.tokens.next,state.tokens.next.value),!1}if(\\\"(punctuator)\\\"===state.tokens.next.type)switch(state.tokens.next.value){case\\\"}\\\":case\\\"]\\\":case\\\",\\\":if(opts.allowTrailing)return!0;case\\\")\\\":return error(\\\"E024\\\",state.tokens.next,state.tokens.next.value),!1}return!0}function symbol(s,p){var x=state.syntax[s];return x&&\\\"object\\\"==typeof x||(state.syntax[s]=x={id:s,lbp:p,value:s}),x}function delim(s){var x=symbol(s,0);return x.delim=!0,x}function stmt(s,f){var x=delim(s);return x.identifier=x.reserved=!0,x.fud=f,x}function blockstmt(s,f){var x=stmt(s,f);return x.block=!0,x}function reserveName(x){var c=x.id.charAt(0);return(c>=\\\"a\\\"&&\\\"z\\\">=c||c>=\\\"A\\\"&&\\\"Z\\\">=c)&&(x.identifier=x.reserved=!0),x}function prefix(s,f){var x=symbol(s,150);return reserveName(x),x.nud=\\\"function\\\"==typeof f?f:function(){return this.arity=\\\"unary\\\",this.right=expression(150),(\\\"++\\\"===this.id||\\\"--\\\"===this.id)&&(state.option.plusplus?warning(\\\"W016\\\",this,this.id):!this.right||this.right.identifier&&!isReserved(this.right)||\\\".\\\"===this.right.id||\\\"[\\\"===this.right.id||warning(\\\"W017\\\",this),this.right&&this.right.isMetaProperty?error(\\\"E031\\\",this):this.right&&this.right.identifier&&state.funct[\\\"(scope)\\\"].block.modify(this.right.value,this)),this},x}function type(s,f){var x=delim(s);return x.type=s,x.nud=f,x}function reserve(name,func){var x=type(name,func);return x.identifier=!0,x.reserved=!0,x}function FutureReservedWord(name,meta){var x=type(name,meta&&meta.nud||function(){return this});return meta=meta||{},meta.isFutureReservedWord=!0,x.value=name,x.identifier=!0,x.reserved=!0,x.meta=meta,x}function reservevar(s,v){return reserve(s,function(){return\\\"function\\\"==typeof v&&v(this),this})}function infix(s,f,p,w){var x=symbol(s,p);return reserveName(x),x.infix=!0,x.led=function(left){return w||nobreaknonadjacent(state.tokens.prev,state.tokens.curr),\\\"in\\\"!==s&&\\\"instanceof\\\"!==s||\\\"!\\\"!==left.id||warning(\\\"W018\\\",left,\\\"!\\\"),\\\"function\\\"==typeof f?f(left,this):(this.left=left,this.right=expression(p),this)},x}function application(s){var x=symbol(s,42);return x.led=function(left){return nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left,this.right=doFunction({type:\\\"arrow\\\",loneArg:left}),this},x}function relation(s,f){var x=symbol(s,100);return x.led=function(left){nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left;var right=this.right=expression(100);return isIdentifier(left,\\\"NaN\\\")||isIdentifier(right,\\\"NaN\\\")?warning(\\\"W019\\\",this):f&&f.apply(this,[left,right]),left&&right||quit(\\\"E041\\\",state.tokens.curr.line),\\\"!\\\"===left.id&&warning(\\\"W018\\\",left,\\\"!\\\"),\\\"!\\\"===right.id&&warning(\\\"W018\\\",right,\\\"!\\\"),this},x}function isPoorRelation(node){return node&&(\\\"(number)\\\"===node.type&&0===+node.value||\\\"(string)\\\"===node.type&&\\\"\\\"===node.value||\\\"null\\\"===node.type&&!state.option.eqnull||\\\"true\\\"===node.type||\\\"false\\\"===node.type||\\\"undefined\\\"===node.type)}function isTypoTypeof(left,right,state){var values;return state.option.notypeof?!1:left&&right?(values=state.inES6()?typeofValues.es6:typeofValues.es3,\\\"(identifier)\\\"===right.type&&\\\"typeof\\\"===right.value&&\\\"(string)\\\"===left.type?!_.contains(values,left.value):!1):!1}function isGlobalEval(left,state){var isGlobal=!1;return\\\"this\\\"===left.type&&null===state.funct[\\\"(context)\\\"]?isGlobal=!0:\\\"(identifier)\\\"===left.type&&(state.option.node&&\\\"global\\\"===left.value?isGlobal=!0:!state.option.browser||\\\"window\\\"!==left.value&&\\\"document\\\"!==left.value||(isGlobal=!0)),isGlobal}function findNativePrototype(left){function walkPrototype(obj){return\\\"object\\\"==typeof obj?\\\"prototype\\\"===obj.right?obj:walkPrototype(obj.left):void 0}function walkNative(obj){for(;!obj.identifier&&\\\"object\\\"==typeof obj.left;)obj=obj.left;return obj.identifier&&natives.indexOf(obj.value)>=0?obj.value:void 0}var natives=[\\\"Array\\\",\\\"ArrayBuffer\\\",\\\"Boolean\\\",\\\"Collator\\\",\\\"DataView\\\",\\\"Date\\\",\\\"DateTimeFormat\\\",\\\"Error\\\",\\\"EvalError\\\",\\\"Float32Array\\\",\\\"Float64Array\\\",\\\"Function\\\",\\\"Infinity\\\",\\\"Intl\\\",\\\"Int16Array\\\",\\\"Int32Array\\\",\\\"Int8Array\\\",\\\"Iterator\\\",\\\"Number\\\",\\\"NumberFormat\\\",\\\"Object\\\",\\\"RangeError\\\",\\\"ReferenceError\\\",\\\"RegExp\\\",\\\"StopIteration\\\",\\\"String\\\",\\\"SyntaxError\\\",\\\"TypeError\\\",\\\"Uint16Array\\\",\\\"Uint32Array\\\",\\\"Uint8Array\\\",\\\"Uint8ClampedArray\\\",\\\"URIError\\\"],prototype=walkPrototype(left);return prototype?walkNative(prototype):void 0}function checkLeftSideAssign(left,assignToken,options){var allowDestructuring=options&&options.allowDestructuring;if(assignToken=assignToken||left,state.option.freeze){var nativeObject=findNativePrototype(left);nativeObject&&warning(\\\"W121\\\",left,nativeObject)}return left.identifier&&!left.isMetaProperty&&state.funct[\\\"(scope)\\\"].block.reassign(left.value,left),\\\".\\\"===left.id?((!left.left||\\\"arguments\\\"===left.left.value&&!state.isStrict())&&warning(\\\"E031\\\",assignToken),state.nameStack.set(state.tokens.prev),!0):\\\"{\\\"===left.id||\\\"[\\\"===left.id?(allowDestructuring&&state.tokens.curr.left.destructAssign?state.tokens.curr.left.destructAssign.forEach(function(t){t.id&&state.funct[\\\"(scope)\\\"].block.modify(t.id,t.token)}):\\\"{\\\"!==left.id&&left.left?\\\"arguments\\\"!==left.left.value||state.isStrict()||warning(\\\"E031\\\",assignToken):warning(\\\"E031\\\",assignToken),\\\"[\\\"===left.id&&state.nameStack.set(left.right),!0):left.isMetaProperty?(error(\\\"E031\\\",assignToken),!0):left.identifier&&!isReserved(left)?(\\\"exception\\\"===state.funct[\\\"(scope)\\\"].labeltype(left.value)&&warning(\\\"W022\\\",left),state.nameStack.set(left),!0):(left===state.syntax[\\\"function\\\"]&&warning(\\\"W023\\\",state.tokens.curr),!1)}function assignop(s,f,p){var x=infix(s,\\\"function\\\"==typeof f?f:function(left,that){return that.left=left,left&&checkLeftSideAssign(left,that,{allowDestructuring:!0})?(that.right=expression(10),that):(error(\\\"E031\\\",that),void 0)},p);return x.exps=!0,x.assign=!0,x}function bitwise(s,f,p){var x=symbol(s,p);return reserveName(x),x.led=\\\"function\\\"==typeof f?f:function(left){return state.option.bitwise&&warning(\\\"W016\\\",this,this.id),this.left=left,this.right=expression(p),this},x}function bitwiseassignop(s){return assignop(s,function(left,that){return state.option.bitwise&&warning(\\\"W016\\\",that,that.id),left&&checkLeftSideAssign(left,that)?(that.right=expression(10),that):(error(\\\"E031\\\",that),void 0)},20)}function suffix(s){var x=symbol(s,150);return x.led=function(left){return state.option.plusplus?warning(\\\"W016\\\",this,this.id):left.identifier&&!isReserved(left)||\\\".\\\"===left.id||\\\"[\\\"===left.id||warning(\\\"W017\\\",this),left.isMetaProperty?error(\\\"E031\\\",this):left&&left.identifier&&state.funct[\\\"(scope)\\\"].block.modify(left.value,left),this.left=left,this},x}function optionalidentifier(fnparam,prop,preserve){if(state.tokens.next.identifier){preserve||advance();var curr=state.tokens.curr,val=state.tokens.curr.value;return isReserved(curr)?prop&&state.inES5()?val:fnparam&&\\\"undefined\\\"===val?val:(warning(\\\"W024\\\",state.tokens.curr,state.tokens.curr.id),val):val}}function identifier(fnparam,prop){var i=optionalidentifier(fnparam,prop,!1);if(i)return i;if(\\\"...\\\"===state.tokens.next.value){if(state.inES6(!0)||warning(\\\"W119\\\",state.tokens.next,\\\"spread/rest operator\\\",\\\"6\\\"),advance(),checkPunctuator(state.tokens.next,\\\"...\\\"))for(warning(\\\"E024\\\",state.tokens.next,\\\"...\\\");checkPunctuator(state.tokens.next,\\\"...\\\");)advance();return state.tokens.next.identifier?identifier(fnparam,prop):(warning(\\\"E024\\\",state.tokens.curr,\\\"...\\\"),void 0)}error(\\\"E030\\\",state.tokens.next,state.tokens.next.value),\\\";\\\"!==state.tokens.next.id&&advance()}function reachable(controlToken){var t,i=0;if(\\\";\\\"===state.tokens.next.id&&!controlToken.inBracelessBlock)for(;;){do t=peek(i),i+=1;while(\\\"(end)\\\"!==t.id&&\\\"(comment)\\\"===t.id);if(t.reach)return;if(\\\"(endline)\\\"!==t.id){if(\\\"function\\\"===t.id){state.option.latedef===!0&&warning(\\\"W026\\\",t);break}warning(\\\"W027\\\",t,t.value,controlToken.value);break}}}function parseFinalSemicolon(){if(\\\";\\\"!==state.tokens.next.id){if(state.tokens.next.isUnclosed)return advance();var sameLine=startLine(state.tokens.next)===state.tokens.curr.line&&\\\"(end)\\\"!==state.tokens.next.id,blockEnd=checkPunctuator(state.tokens.next,\\\"}\\\");sameLine&&!blockEnd?errorAt(\\\"E058\\\",state.tokens.curr.line,state.tokens.curr.character):state.option.asi||(blockEnd&&!state.option.lastsemic||!sameLine)&&warningAt(\\\"W033\\\",state.tokens.curr.line,state.tokens.curr.character)}else advance(\\\";\\\")}function statement(){var r,i=indent,t=state.tokens.next,hasOwnScope=!1;if(\\\";\\\"===t.id)return advance(\\\";\\\"),void 0;var res=isReserved(t);if(res&&t.meta&&t.meta.isFutureReservedWord&&\\\":\\\"===peek().id&&(warning(\\\"W024\\\",t,t.id),res=!1),t.identifier&&!res&&\\\":\\\"===peek().id&&(advance(),advance(\\\":\\\"),hasOwnScope=!0,state.funct[\\\"(scope)\\\"].stack(),state.funct[\\\"(scope)\\\"].block.addBreakLabel(t.value,{token:state.tokens.curr}),state.tokens.next.labelled||\\\"{\\\"===state.tokens.next.value||warning(\\\"W028\\\",state.tokens.next,t.value,state.tokens.next.value),state.tokens.next.label=t.value,t=state.tokens.next),\\\"{\\\"===t.id){var iscase=\\\"case\\\"===state.funct[\\\"(verb)\\\"]&&\\\":\\\"===state.tokens.curr.value;return block(!0,!0,!1,!1,iscase),void 0}return r=expression(0,!0),!r||r.identifier&&\\\"function\\\"===r.value||\\\"(punctuator)\\\"===r.type&&r.left&&r.left.identifier&&\\\"function\\\"===r.left.value||state.isStrict()||\\\"global\\\"!==state.option.strict||warning(\\\"E007\\\"),t.block||(state.option.expr||r&&r.exps?state.option.nonew&&r&&r.left&&\\\"(\\\"===r.id&&\\\"new\\\"===r.left.id&&warning(\\\"W031\\\",t):warning(\\\"W030\\\",state.tokens.curr),parseFinalSemicolon()),indent=i,hasOwnScope&&state.funct[\\\"(scope)\\\"].unstack(),r}function statements(){for(var p,a=[];!state.tokens.next.reach&&\\\"(end)\\\"!==state.tokens.next.id;)\\\";\\\"===state.tokens.next.id?(p=peek(),(!p||\\\"(\\\"!==p.id&&\\\"[\\\"!==p.id)&&warning(\\\"W032\\\"),advance(\\\";\\\")):a.push(statement());return a}function directives(){for(var i,p,pn;\\\"(string)\\\"===state.tokens.next.id;){if(p=peek(0),\\\"(endline)\\\"===p.id){i=1;do pn=peek(i++);while(\\\"(endline)\\\"===pn.id);if(\\\";\\\"===pn.id)p=pn;else{if(\\\"[\\\"===pn.value||\\\".\\\"===pn.value)break;state.option.asi&&\\\"(\\\"!==pn.value||warning(\\\"W033\\\",state.tokens.next)}}else{if(\\\".\\\"===p.id||\\\"[\\\"===p.id)break;\\\";\\\"!==p.id&&warning(\\\"W033\\\",p)}advance();var directive=state.tokens.curr.value;(state.directive[directive]||\\\"use strict\\\"===directive&&\\\"implied\\\"===state.option.strict)&&warning(\\\"W034\\\",state.tokens.curr,directive),state.directive[directive]=!0,\\\";\\\"===p.id&&advance(\\\";\\\")}state.isStrict()&&(state.option[\\\"(explicitNewcap)\\\"]||(state.option.newcap=!0),state.option.undef=!0)}function block(ordinary,stmt,isfunc,isfatarrow,iscase){var a,m,t,line,d,b=inblock,old_indent=indent;inblock=ordinary,t=state.tokens.next;var metrics=state.funct[\\\"(metrics)\\\"];if(metrics.nestedBlockDepth+=1,metrics.verifyMaxNestedBlockDepthPerFunction(),\\\"{\\\"===state.tokens.next.id){if(advance(\\\"{\\\"),state.funct[\\\"(scope)\\\"].stack(),line=state.tokens.curr.line,\\\"}\\\"!==state.tokens.next.id){for(indent+=state.option.indent;!ordinary&&state.tokens.next.from>indent;)indent+=state.option.indent;if(isfunc){m={};for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);directives(),state.option.strict&&state.funct[\\\"(context)\\\"][\\\"(global)\\\"]&&(m[\\\"use strict\\\"]||state.isStrict()||warning(\\\"E007\\\"))}a=statements(),metrics.statementCount+=a.length,indent-=state.option.indent}advance(\\\"}\\\",t),isfunc&&(state.funct[\\\"(scope)\\\"].validateParams(),m&&(state.directive=m)),state.funct[\\\"(scope)\\\"].unstack(),indent=old_indent}else if(ordinary)state.funct[\\\"(noblockscopedvar)\\\"]=\\\"for\\\"!==state.tokens.next.id,state.funct[\\\"(scope)\\\"].stack(),(!stmt||state.option.curly)&&warning(\\\"W116\\\",state.tokens.next,\\\"{\\\",state.tokens.next.value),state.tokens.next.inBracelessBlock=!0,indent+=state.option.indent,a=[statement()],indent-=state.option.indent,state.funct[\\\"(scope)\\\"].unstack(),delete state.funct[\\\"(noblockscopedvar)\\\"];else if(isfunc){if(state.funct[\\\"(scope)\\\"].stack(),m={},!stmt||isfatarrow||state.inMoz()||error(\\\"W118\\\",state.tokens.curr,\\\"function closure expressions\\\"),!stmt)for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);expression(10),state.option.strict&&state.funct[\\\"(context)\\\"][\\\"(global)\\\"]&&(m[\\\"use strict\\\"]||state.isStrict()||warning(\\\"E007\\\")),state.funct[\\\"(scope)\\\"].unstack()}else error(\\\"E021\\\",state.tokens.next,\\\"{\\\",state.tokens.next.value);switch(state.funct[\\\"(verb)\\\"]){case\\\"break\\\":case\\\"continue\\\":case\\\"return\\\":case\\\"throw\\\":if(iscase)break;default:state.funct[\\\"(verb)\\\"]=null}return inblock=b,!ordinary||!state.option.noempty||a&&0!==a.length||warning(\\\"W035\\\",state.tokens.prev),metrics.nestedBlockDepth-=1,a}function countMember(m){membersOnly&&\\\"boolean\\\"!=typeof membersOnly[m]&&warning(\\\"W036\\\",state.tokens.curr,m),\\\"number\\\"==typeof member[m]?member[m]+=1:member[m]=1}function comprehensiveArrayExpression(){var res={};res.exps=!0,state.funct[\\\"(comparray)\\\"].stack();var reversed=!1;return\\\"for\\\"!==state.tokens.next.value&&(reversed=!0,state.inMoz()||warning(\\\"W116\\\",state.tokens.next,\\\"for\\\",state.tokens.next.value),state.funct[\\\"(comparray)\\\"].setState(\\\"use\\\"),res.right=expression(10)),advance(\\\"for\\\"),\\\"each\\\"===state.tokens.next.value&&(advance(\\\"each\\\"),state.inMoz()||warning(\\\"W118\\\",state.tokens.curr,\\\"for each\\\")),advance(\\\"(\\\"),state.funct[\\\"(comparray)\\\"].setState(\\\"define\\\"),res.left=expression(130),_.contains([\\\"in\\\",\\\"of\\\"],state.tokens.next.value)?advance():error(\\\"E045\\\",state.tokens.curr),state.funct[\\\"(comparray)\\\"].setState(\\\"generate\\\"),expression(10),advance(\\\")\\\"),\\\"if\\\"===state.tokens.next.value&&(advance(\\\"if\\\"),advance(\\\"(\\\"),state.funct[\\\"(comparray)\\\"].setState(\\\"filter\\\"),res.filter=expression(10),advance(\\\")\\\")),reversed||(state.funct[\\\"(comparray)\\\"].setState(\\\"use\\\"),res.right=expression(10)),advance(\\\"]\\\"),state.funct[\\\"(comparray)\\\"].unstack(),res}function isMethod(){return state.funct[\\\"(statement)\\\"]&&\\\"class\\\"===state.funct[\\\"(statement)\\\"].type||state.funct[\\\"(context)\\\"]&&\\\"class\\\"===state.funct[\\\"(context)\\\"][\\\"(verb)\\\"]}function isPropertyName(token){return token.identifier||\\\"(string)\\\"===token.id||\\\"(number)\\\"===token.id}function propertyName(preserveOrToken){var id,preserve=!0;return\\\"object\\\"==typeof preserveOrToken?id=preserveOrToken:(preserve=preserveOrToken,id=optionalidentifier(!1,!0,preserve)),id?\\\"object\\\"==typeof id&&(\\\"(string)\\\"===id.id||\\\"(identifier)\\\"===id.id?id=id.value:\\\"(number)\\\"===id.id&&(id=\\\"\\\"+id.value)):\\\"(string)\\\"===state.tokens.next.id?(id=state.tokens.next.value,preserve||advance()):\\\"(number)\\\"===state.tokens.next.id&&(id=\\\"\\\"+state.tokens.next.value,preserve||advance()),\\\"hasOwnProperty\\\"===id&&warning(\\\"W001\\\"),id}function functionparams(options){function addParam(addParamArgs){state.funct[\\\"(scope)\\\"].addParam.apply(state.funct[\\\"(scope)\\\"],addParamArgs)}var next,ident,t,paramsIds=[],tokens=[],pastDefault=!1,pastRest=!1,arity=0,loneArg=options&&options.loneArg;if(loneArg&&loneArg.identifier===!0)return state.funct[\\\"(scope)\\\"].addParam(loneArg.value,loneArg),{arity:1,params:[loneArg.value]};if(next=state.tokens.next,options&&options.parsedOpening||advance(\\\"(\\\"),\\\")\\\"===state.tokens.next.id)return advance(\\\")\\\"),void 0;for(;;){arity++;var currentParams=[];if(_.contains([\\\"{\\\",\\\"[\\\"],state.tokens.next.id)){tokens=destructuringPattern();for(t in tokens)t=tokens[t],t.id&&(paramsIds.push(t.id),currentParams.push([t.id,t.token]))}else if(checkPunctuator(state.tokens.next,\\\"...\\\")&&(pastRest=!0),ident=identifier(!0))paramsIds.push(ident),currentParams.push([ident,state.tokens.curr]);else for(;!checkPunctuators(state.tokens.next,[\\\",\\\",\\\")\\\"]);)advance();if(pastDefault&&\\\"=\\\"!==state.tokens.next.id&&error(\\\"W138\\\",state.tokens.current),\\\"=\\\"===state.tokens.next.id&&(state.inES6()||warning(\\\"W119\\\",state.tokens.next,\\\"default parameters\\\",\\\"6\\\"),advance(\\\"=\\\"),pastDefault=!0,expression(10)),currentParams.forEach(addParam),\\\",\\\"!==state.tokens.next.id)return advance(\\\")\\\",next),{arity:arity,params:paramsIds};pastRest&&warning(\\\"W131\\\",state.tokens.next),comma()}}function functor(name,token,overwrites){var funct={\\\"(name)\\\":name,\\\"(breakage)\\\":0,\\\"(loopage)\\\":0,\\\"(tokens)\\\":{},\\\"(properties)\\\":{},\\\"(catch)\\\":!1,\\\"(global)\\\":!1,\\\"(line)\\\":null,\\\"(character)\\\":null,\\\"(metrics)\\\":null,\\\"(statement)\\\":null,\\\"(context)\\\":null,\\\"(scope)\\\":null,\\\"(comparray)\\\":null,\\\"(generator)\\\":null,\\\"(arrow)\\\":null,\\\"(params)\\\":null};return token&&_.extend(funct,{\\\"(line)\\\":token.line,\\\"(character)\\\":token.character,\\\"(metrics)\\\":createMetrics(token)}),_.extend(funct,overwrites),funct[\\\"(context)\\\"]&&(funct[\\\"(scope)\\\"]=funct[\\\"(context)\\\"][\\\"(scope)\\\"],funct[\\\"(comparray)\\\"]=funct[\\\"(context)\\\"][\\\"(comparray)\\\"]),funct}function isFunctor(token){return\\\"(scope)\\\"in token}function hasParsedCode(funct){return funct[\\\"(global)\\\"]&&!funct[\\\"(verb)\\\"]}function doTemplateLiteral(left){function end(){if(state.tokens.curr.template&&state.tokens.curr.tail&&state.tokens.curr.context===ctx)return!0;var complete=state.tokens.next.template&&state.tokens.next.tail&&state.tokens.next.context===ctx;return complete&&advance(),complete||state.tokens.next.isUnclosed}var ctx=this.context,noSubst=this.noSubst,depth=this.depth;if(!noSubst)for(;!end();)!state.tokens.next.template||state.tokens.next.depth>depth?expression(0):advance();return{id:\\\"(template)\\\",type:\\\"(template)\\\",tag:left}}function doFunction(options){var f,token,name,statement,classExprBinding,isGenerator,isArrow,ignoreLoopFunc,oldOption=state.option,oldIgnored=state.ignored;options&&(name=options.name,statement=options.statement,classExprBinding=options.classExprBinding,isGenerator=\\\"generator\\\"===options.type,isArrow=\\\"arrow\\\"===options.type,ignoreLoopFunc=options.ignoreLoopFunc),state.option=Object.create(state.option),state.ignored=Object.create(state.ignored),state.funct=functor(name||state.nameStack.infer(),state.tokens.next,{\\\"(statement)\\\":statement,\\\"(context)\\\":state.funct,\\\"(arrow)\\\":isArrow,\\\"(generator)\\\":isGenerator}),f=state.funct,token=state.tokens.curr,token.funct=state.funct,functions.push(state.funct),state.funct[\\\"(scope)\\\"].stack(\\\"functionouter\\\");var internallyAccessibleName=name||classExprBinding;internallyAccessibleName&&state.funct[\\\"(scope)\\\"].block.add(internallyAccessibleName,classExprBinding?\\\"class\\\":\\\"function\\\",state.tokens.curr,!1),state.funct[\\\"(scope)\\\"].stack(\\\"functionparams\\\");var paramsInfo=functionparams(options);return paramsInfo?(state.funct[\\\"(params)\\\"]=paramsInfo.params,state.funct[\\\"(metrics)\\\"].arity=paramsInfo.arity,state.funct[\\\"(metrics)\\\"].verifyMaxParametersPerFunction()):state.funct[\\\"(metrics)\\\"].arity=0,isArrow&&(state.inES6(!0)||warning(\\\"W119\\\",state.tokens.curr,\\\"arrow function syntax (=>)\\\",\\\"6\\\"),options.loneArg||advance(\\\"=>\\\")),block(!1,!0,!0,isArrow),!state.option.noyield&&isGenerator&&\\\"yielded\\\"!==state.funct[\\\"(generator)\\\"]&&warning(\\\"W124\\\",state.tokens.curr),state.funct[\\\"(metrics)\\\"].verifyMaxStatementsPerFunction(),state.funct[\\\"(metrics)\\\"].verifyMaxComplexityPerFunction(),state.funct[\\\"(unusedOption)\\\"]=state.option.unused,state.option=oldOption,state.ignored=oldIgnored,state.funct[\\\"(last)\\\"]=state.tokens.curr.line,state.funct[\\\"(lastcharacter)\\\"]=state.tokens.curr.character,state.funct[\\\"(scope)\\\"].unstack(),state.funct[\\\"(scope)\\\"].unstack(),state.funct=state.funct[\\\"(context)\\\"],ignoreLoopFunc||state.option.loopfunc||!state.funct[\\\"(loopage)\\\"]||f[\\\"(isCapturing)\\\"]&&warning(\\\"W083\\\",token),f}function createMetrics(functionStartToken){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){state.option.maxstatements&&this.statementCount>state.option.maxstatements&&warning(\\\"W071\\\",functionStartToken,this.statementCount)\\n},verifyMaxParametersPerFunction:function(){_.isNumber(state.option.maxparams)&&this.arity>state.option.maxparams&&warning(\\\"W072\\\",functionStartToken,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){state.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===state.option.maxdepth+1&&warning(\\\"W073\\\",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var max=state.option.maxcomplexity,cc=this.ComplexityCount;max&&cc>max&&warning(\\\"W074\\\",functionStartToken,cc)}}}function increaseComplexityCount(){state.funct[\\\"(metrics)\\\"].ComplexityCount+=1}function checkCondAssignment(expr){var id,paren;switch(expr&&(id=expr.id,paren=expr.paren,\\\",\\\"===id&&(expr=expr.exprs[expr.exprs.length-1])&&(id=expr.id,paren=paren||expr.paren)),id){case\\\"=\\\":case\\\"+=\\\":case\\\"-=\\\":case\\\"*=\\\":case\\\"%=\\\":case\\\"&=\\\":case\\\"|=\\\":case\\\"^=\\\":case\\\"/=\\\":paren||state.option.boss||warning(\\\"W084\\\")}}function checkProperties(props){if(state.inES5())for(var name in props)props[name]&&props[name].setterToken&&!props[name].getterToken&&warning(\\\"W078\\\",props[name].setterToken)}function metaProperty(name,c){if(checkPunctuator(state.tokens.next,\\\".\\\")){var left=state.tokens.curr.id;advance(\\\".\\\");var id=identifier();return state.tokens.curr.isMetaProperty=!0,name!==id?error(\\\"E057\\\",state.tokens.prev,left,id):c(),state.tokens.curr}}function destructuringPattern(options){var isAssignment=options&&options.assignment;return state.inES6()||warning(\\\"W104\\\",state.tokens.curr,isAssignment?\\\"destructuring assignment\\\":\\\"destructuring binding\\\",\\\"6\\\"),destructuringPatternRecursive(options)}function destructuringPatternRecursive(options){var ids,identifiers=[],openingParsed=options&&options.openingParsed,isAssignment=options&&options.assignment,recursiveOptions=isAssignment?{assignment:isAssignment}:null,firstToken=openingParsed?state.tokens.curr:state.tokens.next,nextInnerDE=function(){var ident;if(checkPunctuators(state.tokens.next,[\\\"[\\\",\\\"{\\\"])){ids=destructuringPatternRecursive(recursiveOptions);for(var id in ids)id=ids[id],identifiers.push({id:id.id,token:id.token})}else if(checkPunctuator(state.tokens.next,\\\",\\\"))identifiers.push({id:null,token:state.tokens.curr});else{if(!checkPunctuator(state.tokens.next,\\\"(\\\")){var is_rest=checkPunctuator(state.tokens.next,\\\"...\\\");if(isAssignment){var identifierToken=is_rest?peek(0):state.tokens.next;identifierToken.identifier||warning(\\\"E030\\\",identifierToken,identifierToken.value);var assignTarget=expression(155);assignTarget&&(checkLeftSideAssign(assignTarget),assignTarget.identifier&&(ident=assignTarget.value))}else ident=identifier();return ident&&identifiers.push({id:ident,token:state.tokens.curr}),is_rest}advance(\\\"(\\\"),nextInnerDE(),advance(\\\")\\\")}return!1},assignmentProperty=function(){var id;checkPunctuator(state.tokens.next,\\\"[\\\")?(advance(\\\"[\\\"),expression(10),advance(\\\"]\\\"),advance(\\\":\\\"),nextInnerDE()):\\\"(string)\\\"===state.tokens.next.id||\\\"(number)\\\"===state.tokens.next.id?(advance(),advance(\\\":\\\"),nextInnerDE()):(id=identifier(),checkPunctuator(state.tokens.next,\\\":\\\")?(advance(\\\":\\\"),nextInnerDE()):id&&(isAssignment&&checkLeftSideAssign(state.tokens.curr),identifiers.push({id:id,token:state.tokens.curr})))};if(checkPunctuator(firstToken,\\\"[\\\")){openingParsed||advance(\\\"[\\\"),checkPunctuator(state.tokens.next,\\\"]\\\")&&warning(\\\"W137\\\",state.tokens.curr);for(var element_after_rest=!1;!checkPunctuator(state.tokens.next,\\\"]\\\");)nextInnerDE()&&!element_after_rest&&checkPunctuator(state.tokens.next,\\\",\\\")&&(warning(\\\"W130\\\",state.tokens.next),element_after_rest=!0),checkPunctuator(state.tokens.next,\\\"=\\\")&&(checkPunctuator(state.tokens.prev,\\\"...\\\")?advance(\\\"]\\\"):advance(\\\"=\\\"),\\\"undefined\\\"===state.tokens.next.id&&warning(\\\"W080\\\",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,\\\"]\\\")||advance(\\\",\\\");advance(\\\"]\\\")}else if(checkPunctuator(firstToken,\\\"{\\\")){for(openingParsed||advance(\\\"{\\\"),checkPunctuator(state.tokens.next,\\\"}\\\")&&warning(\\\"W137\\\",state.tokens.curr);!checkPunctuator(state.tokens.next,\\\"}\\\")&&(assignmentProperty(),checkPunctuator(state.tokens.next,\\\"=\\\")&&(advance(\\\"=\\\"),\\\"undefined\\\"===state.tokens.next.id&&warning(\\\"W080\\\",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,\\\"}\\\")||(advance(\\\",\\\"),!checkPunctuator(state.tokens.next,\\\"}\\\"))););advance(\\\"}\\\")}return identifiers}function destructuringPatternMatch(tokens,value){var first=value.first;first&&_.zip(tokens,Array.isArray(first)?first:[first]).forEach(function(val){var token=val[0],value=val[1];token&&value?token.first=value:token&&token.first&&!value&&warning(\\\"W080\\\",token.first,token.first.value)})}function blockVariableStatement(type,statement,context){var tokens,lone,value,letblock,prefix=context&&context.prefix,inexport=context&&context.inexport,isLet=\\\"let\\\"===type,isConst=\\\"const\\\"===type;for(state.inES6()||warning(\\\"W104\\\",state.tokens.curr,type,\\\"6\\\"),isLet&&\\\"(\\\"===state.tokens.next.value?(state.inMoz()||warning(\\\"W118\\\",state.tokens.next,\\\"let block\\\"),advance(\\\"(\\\"),state.funct[\\\"(scope)\\\"].stack(),letblock=!0):state.funct[\\\"(noblockscopedvar)\\\"]&&error(\\\"E048\\\",state.tokens.curr,isConst?\\\"Const\\\":\\\"Let\\\"),statement.first=[];;){var names=[];_.contains([\\\"{\\\",\\\"[\\\"],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),!prefix&&isConst&&\\\"=\\\"!==state.tokens.next.id&&warning(\\\"E012\\\",state.tokens.curr,state.tokens.curr.value);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],state.funct[\\\"(scope)\\\"].block.isGlobal()&&predefined[t.id]===!1&&warning(\\\"W079\\\",t.token,t.id),t.id&&!state.funct[\\\"(noblockscopedvar)\\\"]&&(state.funct[\\\"(scope)\\\"].addlabel(t.id,{type:type,token:t.token}),names.push(t.token),lone&&inexport&&state.funct[\\\"(scope)\\\"].setExported(t.token.value,t.token)));if(\\\"=\\\"===state.tokens.next.id&&(advance(\\\"=\\\"),prefix||\\\"undefined\\\"!==state.tokens.next.id||warning(\\\"W080\\\",state.tokens.prev,state.tokens.prev.value),!prefix&&\\\"=\\\"===peek(0).id&&state.tokens.next.identifier&&warning(\\\"W120\\\",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),statement.first=statement.first.concat(names),\\\",\\\"!==state.tokens.next.id)break;comma()}return letblock&&(advance(\\\")\\\"),block(!0,!0),statement.block=!0,state.funct[\\\"(scope)\\\"].unstack()),statement}function classdef(isStatement){return state.inES6()||warning(\\\"W104\\\",state.tokens.curr,\\\"class\\\",\\\"6\\\"),isStatement?(this.name=identifier(),state.funct[\\\"(scope)\\\"].addlabel(this.name,{type:\\\"class\\\",token:state.tokens.curr})):state.tokens.next.identifier&&\\\"extends\\\"!==state.tokens.next.value?(this.name=identifier(),this.namedExpr=!0):this.name=state.nameStack.infer(),classtail(this),this}function classtail(c){var wasInClassBody=state.inClassBody;\\\"extends\\\"===state.tokens.next.value&&(advance(\\\"extends\\\"),c.heritage=expression(10)),state.inClassBody=!0,advance(\\\"{\\\"),c.body=classbody(c),advance(\\\"}\\\"),state.inClassBody=wasInClassBody}function classbody(c){for(var name,isStatic,isGenerator,getset,computed,props=Object.create(null),staticProps=Object.create(null),i=0;\\\"}\\\"!==state.tokens.next.id;++i)if(name=state.tokens.next,isStatic=!1,isGenerator=!1,getset=null,\\\";\\\"!==name.id){if(\\\"*\\\"===name.id&&(isGenerator=!0,advance(\\\"*\\\"),name=state.tokens.next),\\\"[\\\"===name.id)name=computedPropertyName(),computed=!0;else{if(!isPropertyName(name)){warning(\\\"W052\\\",state.tokens.next,state.tokens.next.value||state.tokens.next.type),advance();continue}advance(),computed=!1,name.identifier&&\\\"static\\\"===name.value&&(checkPunctuator(state.tokens.next,\\\"*\\\")&&(isGenerator=!0,advance(\\\"*\\\")),(isPropertyName(state.tokens.next)||\\\"[\\\"===state.tokens.next.id)&&(computed=\\\"[\\\"===state.tokens.next.id,isStatic=!0,name=state.tokens.next,\\\"[\\\"===state.tokens.next.id?name=computedPropertyName():advance())),!name.identifier||\\\"get\\\"!==name.value&&\\\"set\\\"!==name.value||(isPropertyName(state.tokens.next)||\\\"[\\\"===state.tokens.next.id)&&(computed=\\\"[\\\"===state.tokens.next.id,getset=name,name=state.tokens.next,\\\"[\\\"===state.tokens.next.id?name=computedPropertyName():advance())}if(!checkPunctuator(state.tokens.next,\\\"(\\\")){for(error(\\\"E054\\\",state.tokens.next,state.tokens.next.value);\\\"}\\\"!==state.tokens.next.id&&!checkPunctuator(state.tokens.next,\\\"(\\\");)advance();\\\"(\\\"!==state.tokens.next.value&&doFunction({statement:c})}if(computed||(getset?saveAccessor(getset.value,isStatic?staticProps:props,name.value,name,!0,isStatic):(\\\"constructor\\\"===name.value?state.nameStack.set(c):state.nameStack.set(name),saveProperty(isStatic?staticProps:props,name.value,name,!0,isStatic))),getset&&\\\"constructor\\\"===name.value){var propDesc=\\\"get\\\"===getset.value?\\\"class getter method\\\":\\\"class setter method\\\";error(\\\"E049\\\",name,propDesc,\\\"constructor\\\")}else\\\"prototype\\\"===name.value&&error(\\\"E049\\\",name,\\\"class method\\\",\\\"prototype\\\");propertyName(name),doFunction({statement:c,type:isGenerator?\\\"generator\\\":null,classExprBinding:c.namedExpr?c.name:null})}else warning(\\\"W032\\\"),advance(\\\";\\\");checkProperties(props)}function saveProperty(props,name,tkn,isClass,isStatic){var msg=[\\\"key\\\",\\\"class method\\\",\\\"static class method\\\"];msg=msg[(isClass||!1)+(isStatic||!1)],tkn.identifier&&(name=tkn.value),props[name]&&\\\"__proto__\\\"!==name?warning(\\\"W075\\\",state.tokens.next,msg,name):props[name]=Object.create(null),props[name].basic=!0,props[name].basictkn=tkn}function saveAccessor(accessorType,props,name,tkn,isClass,isStatic){var flagName=\\\"get\\\"===accessorType?\\\"getterToken\\\":\\\"setterToken\\\",msg=\\\"\\\";isClass?(isStatic&&(msg+=\\\"static \\\"),msg+=accessorType+\\\"ter method\\\"):msg=\\\"key\\\",state.tokens.curr.accessorType=accessorType,state.nameStack.set(tkn),props[name]?(props[name].basic||props[name][flagName])&&\\\"__proto__\\\"!==name&&warning(\\\"W075\\\",state.tokens.next,msg,name):props[name]=Object.create(null),props[name][flagName]=tkn}function computedPropertyName(){advance(\\\"[\\\"),state.inES6()||warning(\\\"W119\\\",state.tokens.curr,\\\"computed property names\\\",\\\"6\\\");var value=expression(10);return advance(\\\"]\\\"),value}function checkPunctuators(token,values){return\\\"(punctuator)\\\"===token.type?_.contains(values,token.value):!1}function checkPunctuator(token,value){return\\\"(punctuator)\\\"===token.type&&token.value===value}function destructuringAssignOrJsonValue(){var block=lookupBlockType();block.notJson?(!state.inES6()&&block.isDestAssign&&warning(\\\"W104\\\",state.tokens.curr,\\\"destructuring assignment\\\",\\\"6\\\"),statements()):(state.option.laxbreak=!0,state.jsonMode=!0,jsonValue())}function jsonValue(){function jsonObject(){var o={},t=state.tokens.next;if(advance(\\\"{\\\"),\\\"}\\\"!==state.tokens.next.id)for(;;){if(\\\"(end)\\\"===state.tokens.next.id)error(\\\"E026\\\",state.tokens.next,t.line);else{if(\\\"}\\\"===state.tokens.next.id){warning(\\\"W094\\\",state.tokens.curr);break}\\\",\\\"===state.tokens.next.id?error(\\\"E028\\\",state.tokens.next):\\\"(string)\\\"!==state.tokens.next.id&&warning(\\\"W095\\\",state.tokens.next,state.tokens.next.value)}if(o[state.tokens.next.value]===!0?warning(\\\"W075\\\",state.tokens.next,\\\"key\\\",state.tokens.next.value):\\\"__proto__\\\"===state.tokens.next.value&&!state.option.proto||\\\"__iterator__\\\"===state.tokens.next.value&&!state.option.iterator?warning(\\\"W096\\\",state.tokens.next,state.tokens.next.value):o[state.tokens.next.value]=!0,advance(),advance(\\\":\\\"),jsonValue(),\\\",\\\"!==state.tokens.next.id)break;advance(\\\",\\\")}advance(\\\"}\\\")}function jsonArray(){var t=state.tokens.next;if(advance(\\\"[\\\"),\\\"]\\\"!==state.tokens.next.id)for(;;){if(\\\"(end)\\\"===state.tokens.next.id)error(\\\"E027\\\",state.tokens.next,t.line);else{if(\\\"]\\\"===state.tokens.next.id){warning(\\\"W094\\\",state.tokens.curr);break}\\\",\\\"===state.tokens.next.id&&error(\\\"E028\\\",state.tokens.next)}if(jsonValue(),\\\",\\\"!==state.tokens.next.id)break;advance(\\\",\\\")}advance(\\\"]\\\")}switch(state.tokens.next.id){case\\\"{\\\":jsonObject();break;case\\\"[\\\":jsonArray();break;case\\\"true\\\":case\\\"false\\\":case\\\"null\\\":case\\\"(number)\\\":case\\\"(string)\\\":advance();break;case\\\"-\\\":advance(\\\"-\\\"),advance(\\\"(number)\\\");break;default:error(\\\"E003\\\",state.tokens.next)}}var api,declared,functions,inblock,indent,lookahead,lex,member,membersOnly,predefined,stack,urls,bang={\\\"<\\\":!0,\\\"<=\\\":!0,\\\"==\\\":!0,\\\"===\\\":!0,\\\"!==\\\":!0,\\\"!=\\\":!0,\\\">\\\":!0,\\\">=\\\":!0,\\\"+\\\":!0,\\\"-\\\":!0,\\\"*\\\":!0,\\\"/\\\":!0,\\\"%\\\":!0},functionicity=[\\\"closure\\\",\\\"exception\\\",\\\"global\\\",\\\"label\\\",\\\"outer\\\",\\\"unused\\\",\\\"var\\\"],extraModules=[],emitter=new events.EventEmitter,typeofValues={};typeofValues.legacy=[\\\"xml\\\",\\\"unknown\\\"],typeofValues.es3=[\\\"undefined\\\",\\\"boolean\\\",\\\"number\\\",\\\"string\\\",\\\"function\\\",\\\"object\\\"],typeofValues.es3=typeofValues.es3.concat(typeofValues.legacy),typeofValues.es6=typeofValues.es3.concat(\\\"symbol\\\"),type(\\\"(number)\\\",function(){return this}),type(\\\"(string)\\\",function(){return this}),state.syntax[\\\"(identifier)\\\"]={type:\\\"(identifier)\\\",lbp:0,identifier:!0,nud:function(){var v=this.value;return\\\"=>\\\"===state.tokens.next.id?this:(state.funct[\\\"(comparray)\\\"].check(v)||state.funct[\\\"(scope)\\\"].block.use(v,state.tokens.curr),this)},led:function(){error(\\\"E033\\\",state.tokens.next,state.tokens.next.value)}};var baseTemplateSyntax={lbp:0,identifier:!1,template:!0};state.syntax[\\\"(template)\\\"]=_.extend({type:\\\"(template)\\\",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!1},baseTemplateSyntax),state.syntax[\\\"(template middle)\\\"]=_.extend({type:\\\"(template middle)\\\",middle:!0,noSubst:!1},baseTemplateSyntax),state.syntax[\\\"(template tail)\\\"]=_.extend({type:\\\"(template tail)\\\",tail:!0,noSubst:!1},baseTemplateSyntax),state.syntax[\\\"(no subst template)\\\"]=_.extend({type:\\\"(template)\\\",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!0,tail:!0},baseTemplateSyntax),type(\\\"(regexp)\\\",function(){return this}),delim(\\\"(endline)\\\"),delim(\\\"(begin)\\\"),delim(\\\"(end)\\\").reach=!0,delim(\\\"(error)\\\").reach=!0,delim(\\\"}\\\").reach=!0,delim(\\\")\\\"),delim(\\\"]\\\"),delim('\\\"').reach=!0,delim(\\\"'\\\").reach=!0,delim(\\\";\\\"),delim(\\\":\\\").reach=!0,delim(\\\"#\\\"),reserve(\\\"else\\\"),reserve(\\\"case\\\").reach=!0,reserve(\\\"catch\\\"),reserve(\\\"default\\\").reach=!0,reserve(\\\"finally\\\"),reservevar(\\\"arguments\\\",function(x){state.isStrict()&&state.funct[\\\"(global)\\\"]&&warning(\\\"E008\\\",x)}),reservevar(\\\"eval\\\"),reservevar(\\\"false\\\"),reservevar(\\\"Infinity\\\"),reservevar(\\\"null\\\"),reservevar(\\\"this\\\",function(x){state.isStrict()&&!isMethod()&&!state.option.validthis&&(state.funct[\\\"(statement)\\\"]&&state.funct[\\\"(name)\\\"].charAt(0)>\\\"Z\\\"||state.funct[\\\"(global)\\\"])&&warning(\\\"W040\\\",x)}),reservevar(\\\"true\\\"),reservevar(\\\"undefined\\\"),assignop(\\\"=\\\",\\\"assign\\\",20),assignop(\\\"+=\\\",\\\"assignadd\\\",20),assignop(\\\"-=\\\",\\\"assignsub\\\",20),assignop(\\\"*=\\\",\\\"assignmult\\\",20),assignop(\\\"/=\\\",\\\"assigndiv\\\",20).nud=function(){error(\\\"E014\\\")},assignop(\\\"%=\\\",\\\"assignmod\\\",20),bitwiseassignop(\\\"&=\\\"),bitwiseassignop(\\\"|=\\\"),bitwiseassignop(\\\"^=\\\"),bitwiseassignop(\\\"<<=\\\"),bitwiseassignop(\\\">>=\\\"),bitwiseassignop(\\\">>>=\\\"),infix(\\\",\\\",function(left,that){var expr;if(that.exprs=[left],state.option.nocomma&&warning(\\\"W127\\\"),!comma({peek:!0}))return that;for(;;){if(!(expr=expression(10)))break;if(that.exprs.push(expr),\\\",\\\"!==state.tokens.next.value||!comma())break}return that},10,!0),infix(\\\"?\\\",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(10),advance(\\\":\\\"),that[\\\"else\\\"]=expression(10),that},30);var orPrecendence=40;infix(\\\"||\\\",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(orPrecendence),that},orPrecendence),infix(\\\"&&\\\",\\\"and\\\",50),bitwise(\\\"|\\\",\\\"bitor\\\",70),bitwise(\\\"^\\\",\\\"bitxor\\\",80),bitwise(\\\"&\\\",\\\"bitand\\\",90),relation(\\\"==\\\",function(left,right){var eqnull=state.option.eqnull&&(\\\"null\\\"===(left&&left.value)||\\\"null\\\"===(right&&right.value));switch(!0){case!eqnull&&state.option.eqeqeq:this.from=this.character,warning(\\\"W116\\\",this,\\\"===\\\",\\\"==\\\");break;case isPoorRelation(left):warning(\\\"W041\\\",this,\\\"===\\\",left.value);break;case isPoorRelation(right):warning(\\\"W041\\\",this,\\\"===\\\",right.value);break;case isTypoTypeof(right,left,state):warning(\\\"W122\\\",this,right.value);break;case isTypoTypeof(left,right,state):warning(\\\"W122\\\",this,left.value)}return this}),relation(\\\"===\\\",function(left,right){return isTypoTypeof(right,left,state)?warning(\\\"W122\\\",this,right.value):isTypoTypeof(left,right,state)&&warning(\\\"W122\\\",this,left.value),this}),relation(\\\"!=\\\",function(left,right){var eqnull=state.option.eqnull&&(\\\"null\\\"===(left&&left.value)||\\\"null\\\"===(right&&right.value));return!eqnull&&state.option.eqeqeq?(this.from=this.character,warning(\\\"W116\\\",this,\\\"!==\\\",\\\"!=\\\")):isPoorRelation(left)?warning(\\\"W041\\\",this,\\\"!==\\\",left.value):isPoorRelation(right)?warning(\\\"W041\\\",this,\\\"!==\\\",right.value):isTypoTypeof(right,left,state)?warning(\\\"W122\\\",this,right.value):isTypoTypeof(left,right,state)&&warning(\\\"W122\\\",this,left.value),this}),relation(\\\"!==\\\",function(left,right){return isTypoTypeof(right,left,state)?warning(\\\"W122\\\",this,right.value):isTypoTypeof(left,right,state)&&warning(\\\"W122\\\",this,left.value),this}),relation(\\\"<\\\"),relation(\\\">\\\"),relation(\\\"<=\\\"),relation(\\\">=\\\"),bitwise(\\\"<<\\\",\\\"shiftleft\\\",120),bitwise(\\\">>\\\",\\\"shiftright\\\",120),bitwise(\\\">>>\\\",\\\"shiftrightunsigned\\\",120),infix(\\\"in\\\",\\\"in\\\",120),infix(\\\"instanceof\\\",\\\"instanceof\\\",120),infix(\\\"+\\\",function(left,that){var right;return that.left=left,that.right=right=expression(130),left&&right&&\\\"(string)\\\"===left.id&&\\\"(string)\\\"===right.id?(left.value+=right.value,left.character=right.character,!state.option.scripturl&&reg.javascriptURL.test(left.value)&&warning(\\\"W050\\\",left),left):that},130),prefix(\\\"+\\\",\\\"num\\\"),prefix(\\\"+++\\\",function(){return warning(\\\"W007\\\"),this.arity=\\\"unary\\\",this.right=expression(150),this}),infix(\\\"+++\\\",function(left){return warning(\\\"W007\\\"),this.left=left,this.right=expression(130),this},130),infix(\\\"-\\\",\\\"sub\\\",130),prefix(\\\"-\\\",\\\"neg\\\"),prefix(\\\"---\\\",function(){return warning(\\\"W006\\\"),this.arity=\\\"unary\\\",this.right=expression(150),this}),infix(\\\"---\\\",function(left){return warning(\\\"W006\\\"),this.left=left,this.right=expression(130),this},130),infix(\\\"*\\\",\\\"mult\\\",140),infix(\\\"/\\\",\\\"div\\\",140),infix(\\\"%\\\",\\\"mod\\\",140),suffix(\\\"++\\\"),prefix(\\\"++\\\",\\\"preinc\\\"),state.syntax[\\\"++\\\"].exps=!0,suffix(\\\"--\\\"),prefix(\\\"--\\\",\\\"predec\\\"),state.syntax[\\\"--\\\"].exps=!0,prefix(\\\"delete\\\",function(){var p=expression(10);return p?(\\\".\\\"!==p.id&&\\\"[\\\"!==p.id&&warning(\\\"W051\\\"),this.first=p,p.identifier&&!state.isStrict()&&(p.forgiveUndef=!0),this):this}).exps=!0,prefix(\\\"~\\\",function(){return state.option.bitwise&&warning(\\\"W016\\\",this,\\\"~\\\"),this.arity=\\\"unary\\\",this.right=expression(150),this}),prefix(\\\"...\\\",function(){return state.inES6(!0)||warning(\\\"W119\\\",this,\\\"spread/rest operator\\\",\\\"6\\\"),state.tokens.next.identifier||\\\"(string)\\\"===state.tokens.next.type||checkPunctuators(state.tokens.next,[\\\"[\\\",\\\"(\\\"])||error(\\\"E030\\\",state.tokens.next,state.tokens.next.value),expression(150),this}),prefix(\\\"!\\\",function(){return this.arity=\\\"unary\\\",this.right=expression(150),this.right||quit(\\\"E041\\\",this.line||0),bang[this.right.id]===!0&&warning(\\\"W018\\\",this,\\\"!\\\"),this}),prefix(\\\"typeof\\\",function(){var p=expression(150);return this.first=this.right=p,p||quit(\\\"E041\\\",this.line||0,this.character||0),p.identifier&&(p.forgiveUndef=!0),this}),prefix(\\\"new\\\",function(){var mp=metaProperty(\\\"target\\\",function(){state.inES6(!0)||warning(\\\"W119\\\",state.tokens.prev,\\\"new.target\\\",\\\"6\\\");for(var inFunction,c=state.funct;c&&(inFunction=!c[\\\"(global)\\\"],c[\\\"(arrow)\\\"]);)c=c[\\\"(context)\\\"];inFunction||warning(\\\"W136\\\",state.tokens.prev,\\\"new.target\\\")});if(mp)return mp;var i,c=expression(155);if(c&&\\\"function\\\"!==c.id)if(c.identifier)switch(c[\\\"new\\\"]=!0,c.value){case\\\"Number\\\":case\\\"String\\\":case\\\"Boolean\\\":case\\\"Math\\\":case\\\"JSON\\\":warning(\\\"W053\\\",state.tokens.prev,c.value);break;case\\\"Symbol\\\":state.inES6()&&warning(\\\"W053\\\",state.tokens.prev,c.value);break;case\\\"Function\\\":state.option.evil||warning(\\\"W054\\\");break;case\\\"Date\\\":case\\\"RegExp\\\":case\\\"this\\\":break;default:\\\"function\\\"!==c.id&&(i=c.value.substr(0,1),state.option.newcap&&(\\\"A\\\">i||i>\\\"Z\\\")&&!state.funct[\\\"(scope)\\\"].isPredefined(c.value)&&warning(\\\"W055\\\",state.tokens.curr))}else\\\".\\\"!==c.id&&\\\"[\\\"!==c.id&&\\\"(\\\"!==c.id&&warning(\\\"W056\\\",state.tokens.curr);else state.option.supernew||warning(\\\"W057\\\",this);return\\\"(\\\"===state.tokens.next.id||state.option.supernew||warning(\\\"W058\\\",state.tokens.curr,state.tokens.curr.value),this.first=this.right=c,this}),state.syntax[\\\"new\\\"].exps=!0,prefix(\\\"void\\\").exps=!0,infix(\\\".\\\",function(left,that){var m=identifier(!1,!0);return\\\"string\\\"==typeof m&&countMember(m),that.left=left,that.right=m,m&&\\\"hasOwnProperty\\\"===m&&\\\"=\\\"===state.tokens.next.value&&warning(\\\"W001\\\"),!left||\\\"arguments\\\"!==left.value||\\\"callee\\\"!==m&&\\\"caller\\\"!==m?state.option.evil||!left||\\\"document\\\"!==left.value||\\\"write\\\"!==m&&\\\"writeln\\\"!==m||warning(\\\"W060\\\",left):state.option.noarg?warning(\\\"W059\\\",left,m):state.isStrict()&&error(\\\"E008\\\"),state.option.evil||\\\"eval\\\"!==m&&\\\"execScript\\\"!==m||isGlobalEval(left,state)&&warning(\\\"W061\\\"),that},160,!0),infix(\\\"(\\\",function(left,that){state.option.immed&&left&&!left.immed&&\\\"function\\\"===left.id&&warning(\\\"W062\\\");var n=0,p=[];if(left&&\\\"(identifier)\\\"===left.type&&left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&-1===\\\"Array Number String Boolean Date Object Error Symbol\\\".indexOf(left.value)&&(\\\"Math\\\"===left.value?warning(\\\"W063\\\",left):state.option.newcap&&warning(\\\"W064\\\",left)),\\\")\\\"!==state.tokens.next.id)for(;p[p.length]=expression(10),n+=1,\\\",\\\"===state.tokens.next.id;)comma();return advance(\\\")\\\"),\\\"object\\\"==typeof left&&(state.inES5()||\\\"parseInt\\\"!==left.value||1!==n||warning(\\\"W065\\\",state.tokens.curr),state.option.evil||(\\\"eval\\\"===left.value||\\\"Function\\\"===left.value||\\\"execScript\\\"===left.value?(warning(\\\"W061\\\",left),p[0]&&\\\"(string)\\\"===[0].id&&addInternalSrc(left,p[0].value)):!p[0]||\\\"(string)\\\"!==p[0].id||\\\"setTimeout\\\"!==left.value&&\\\"setInterval\\\"!==left.value?!p[0]||\\\"(string)\\\"!==p[0].id||\\\".\\\"!==left.value||\\\"window\\\"!==left.left.value||\\\"setTimeout\\\"!==left.right&&\\\"setInterval\\\"!==left.right||(warning(\\\"W066\\\",left),addInternalSrc(left,p[0].value)):(warning(\\\"W066\\\",left),addInternalSrc(left,p[0].value))),left.identifier||\\\".\\\"===left.id||\\\"[\\\"===left.id||\\\"=>\\\"===left.id||\\\"(\\\"===left.id||\\\"&&\\\"===left.id||\\\"||\\\"===left.id||\\\"?\\\"===left.id||state.inES6()&&left[\\\"(name)\\\"]||warning(\\\"W067\\\",that)),that.left=left,that},155,!0).exps=!0,prefix(\\\"(\\\",function(){var pn1,ret,triggerFnExpr,first,last,pn=state.tokens.next,i=-1,parens=1,opening=state.tokens.curr,preceeding=state.tokens.prev,isNecessary=!state.option.singleGroups;do\\\"(\\\"===pn.value?parens+=1:\\\")\\\"===pn.value&&(parens-=1),i+=1,pn1=pn,pn=peek(i);while((0!==parens||\\\")\\\"!==pn1.value)&&\\\";\\\"!==pn.value&&\\\"(end)\\\"!==pn.type);if(\\\"function\\\"===state.tokens.next.id&&(triggerFnExpr=state.tokens.next.immed=!0),\\\"=>\\\"===pn.value)return doFunction({type:\\\"arrow\\\",parsedOpening:!0});var exprs=[];if(\\\")\\\"!==state.tokens.next.id)for(;exprs.push(expression(10)),\\\",\\\"===state.tokens.next.id;)state.option.nocomma&&warning(\\\"W127\\\"),comma();return advance(\\\")\\\",this),state.option.immed&&exprs[0]&&\\\"function\\\"===exprs[0].id&&\\\"(\\\"!==state.tokens.next.id&&\\\".\\\"!==state.tokens.next.id&&\\\"[\\\"!==state.tokens.next.id&&warning(\\\"W068\\\",this),exprs.length?(exprs.length>1?(ret=Object.create(state.syntax[\\\",\\\"]),ret.exprs=exprs,first=exprs[0],last=exprs[exprs.length-1],isNecessary||(isNecessary=preceeding.assign||preceeding.delim)):(ret=first=last=exprs[0],isNecessary||(isNecessary=opening.beginsStmt&&(\\\"{\\\"===ret.id||triggerFnExpr||isFunctor(ret))||triggerFnExpr&&(!isEndOfExpr()||\\\"}\\\"!==state.tokens.prev.id)||isFunctor(ret)&&!isEndOfExpr()||\\\"{\\\"===ret.id&&\\\"=>\\\"===preceeding.id||\\\"(number)\\\"===ret.type&&checkPunctuator(pn,\\\".\\\")&&/^\\\\d+$/.test(ret.value))),ret&&(!isNecessary&&(first.left||first.right||ret.exprs)&&(isNecessary=!isBeginOfExpr(preceeding)&&first.lbp<=preceeding.lbp||!isEndOfExpr()&&last.lbp<state.tokens.next.lbp),isNecessary||warning(\\\"W126\\\",opening),ret.paren=!0),ret):void 0}),application(\\\"=>\\\"),infix(\\\"[\\\",function(left,that){var s,e=expression(10);return e&&\\\"(string)\\\"===e.type&&(state.option.evil||\\\"eval\\\"!==e.value&&\\\"execScript\\\"!==e.value||isGlobalEval(left,state)&&warning(\\\"W061\\\"),countMember(e.value),!state.option.sub&&reg.identifier.test(e.value)&&(s=state.syntax[e.value],s&&isReserved(s)||warning(\\\"W069\\\",state.tokens.prev,e.value))),advance(\\\"]\\\",that),e&&\\\"hasOwnProperty\\\"===e.value&&\\\"=\\\"===state.tokens.next.value&&warning(\\\"W001\\\"),that.left=left,that.right=e,that},160,!0),prefix(\\\"[\\\",function(){var blocktype=lookupBlockType();if(blocktype.isCompArray)return state.option.esnext||state.inMoz()||warning(\\\"W118\\\",state.tokens.curr,\\\"array comprehension\\\"),comprehensiveArrayExpression();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;var b=state.tokens.curr.line!==startLine(state.tokens.next);for(this.first=[],b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));\\\"(end)\\\"!==state.tokens.next.id;){for(;\\\",\\\"===state.tokens.next.id;){if(!state.option.elision){if(state.inES5()){warning(\\\"W128\\\");do advance(\\\",\\\");while(\\\",\\\"===state.tokens.next.id);continue}warning(\\\"W070\\\")}advance(\\\",\\\")}if(\\\"]\\\"===state.tokens.next.id)break;if(this.first.push(expression(10)),\\\",\\\"!==state.tokens.next.id)break;if(comma({allowTrailing:!0}),\\\"]\\\"===state.tokens.next.id&&!state.inES5()){warning(\\\"W070\\\",state.tokens.curr);break}}return b&&(indent-=state.option.indent),advance(\\\"]\\\",this),this}),function(x){x.nud=function(){var b,f,i,p,t,nextVal,isGeneratorMethod=!1,props=Object.create(null);b=state.tokens.curr.line!==startLine(state.tokens.next),b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));var blocktype=lookupBlockType();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;for(;\\\"}\\\"!==state.tokens.next.id;){if(nextVal=state.tokens.next.value,!state.tokens.next.identifier||\\\",\\\"!==peekIgnoreEOL().id&&\\\"}\\\"!==peekIgnoreEOL().id)if(\\\":\\\"===peek().id||\\\"get\\\"!==nextVal&&\\\"set\\\"!==nextVal){if(\\\"*\\\"===state.tokens.next.value&&\\\"(punctuator)\\\"===state.tokens.next.type?(state.inES6()||warning(\\\"W104\\\",state.tokens.next,\\\"generator functions\\\",\\\"6\\\"),advance(\\\"*\\\"),isGeneratorMethod=!0):isGeneratorMethod=!1,\\\"[\\\"===state.tokens.next.id)i=computedPropertyName(),state.nameStack.set(i);else if(state.nameStack.set(state.tokens.next),i=propertyName(),saveProperty(props,i,state.tokens.next),\\\"string\\\"!=typeof i)break;\\\"(\\\"===state.tokens.next.value?(state.inES6()||warning(\\\"W104\\\",state.tokens.curr,\\\"concise methods\\\",\\\"6\\\"),doFunction({type:isGeneratorMethod?\\\"generator\\\":null})):(advance(\\\":\\\"),expression(10))}else advance(nextVal),state.inES5()||error(\\\"E034\\\"),i=propertyName(),i||state.inES6()||error(\\\"E035\\\"),i&&saveAccessor(nextVal,props,i,state.tokens.curr),t=state.tokens.next,f=doFunction(),p=f[\\\"(params)\\\"],\\\"get\\\"===nextVal&&i&&p?warning(\\\"W076\\\",t,p[0],i):\\\"set\\\"!==nextVal||!i||p&&1===p.length||warning(\\\"W077\\\",t,i);else state.inES6()||warning(\\\"W104\\\",state.tokens.next,\\\"object short notation\\\",\\\"6\\\"),i=propertyName(!0),saveProperty(props,i,state.tokens.next),expression(10);if(countMember(i),\\\",\\\"!==state.tokens.next.id)break;comma({allowTrailing:!0,property:!0}),\\\",\\\"===state.tokens.next.id?warning(\\\"W070\\\",state.tokens.curr):\\\"}\\\"!==state.tokens.next.id||state.inES5()||warning(\\\"W070\\\",state.tokens.curr)}return b&&(indent-=state.option.indent),advance(\\\"}\\\",this),checkProperties(props),this},x.fud=function(){error(\\\"E036\\\",state.tokens.curr)}}(delim(\\\"{\\\"));var conststatement=stmt(\\\"const\\\",function(context){return blockVariableStatement(\\\"const\\\",this,context)});conststatement.exps=!0;var letstatement=stmt(\\\"let\\\",function(context){return blockVariableStatement(\\\"let\\\",this,context)});letstatement.exps=!0;var varstatement=stmt(\\\"var\\\",function(context){var tokens,lone,value,prefix=context&&context.prefix,inexport=context&&context.inexport,implied=context&&context.implied,report=!(context&&context.ignore);for(this.first=[];;){var names=[];_.contains([\\\"{\\\",\\\"[\\\"],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),prefix&&implied||!report||!state.option.varstmt||warning(\\\"W132\\\",this),this.first=this.first.concat(names);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],!implied&&state.funct[\\\"(global)\\\"]&&(predefined[t.id]===!1?warning(\\\"W079\\\",t.token,t.id):state.option.futurehostile===!1&&(!state.inES5()&&vars.ecmaIdentifiers[5][t.id]===!1||!state.inES6()&&vars.ecmaIdentifiers[6][t.id]===!1)&&warning(\\\"W129\\\",t.token,t.id)),t.id&&(\\\"for\\\"===implied?(state.funct[\\\"(scope)\\\"].has(t.id)||report&&warning(\\\"W088\\\",t.token,t.id),state.funct[\\\"(scope)\\\"].block.use(t.id,t.token)):(state.funct[\\\"(scope)\\\"].addlabel(t.id,{type:\\\"var\\\",token:t.token}),lone&&inexport&&state.funct[\\\"(scope)\\\"].setExported(t.id,t.token)),names.push(t.token)));if(\\\"=\\\"===state.tokens.next.id&&(state.nameStack.set(state.tokens.curr),advance(\\\"=\\\"),prefix||!report||state.funct[\\\"(loopage)\\\"]||\\\"undefined\\\"!==state.tokens.next.id||warning(\\\"W080\\\",state.tokens.prev,state.tokens.prev.value),\\\"=\\\"===peek(0).id&&state.tokens.next.identifier&&(!prefix&&report&&!state.funct[\\\"(params)\\\"]||-1===state.funct[\\\"(params)\\\"].indexOf(state.tokens.next.value))&&warning(\\\"W120\\\",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),\\\",\\\"!==state.tokens.next.id)break;comma()}return this});varstatement.exps=!0,blockstmt(\\\"class\\\",function(){return classdef.call(this,!0)}),blockstmt(\\\"function\\\",function(context){var inexport=context&&context.inexport,generator=!1;\\\"*\\\"===state.tokens.next.value&&(advance(\\\"*\\\"),state.inES6({strict:!0})?generator=!0:warning(\\\"W119\\\",state.tokens.curr,\\\"function*\\\",\\\"6\\\")),inblock&&warning(\\\"W082\\\",state.tokens.curr);var i=optionalidentifier();return state.funct[\\\"(scope)\\\"].addlabel(i,{type:\\\"function\\\",token:state.tokens.curr}),void 0===i?warning(\\\"W025\\\"):inexport&&state.funct[\\\"(scope)\\\"].setExported(i,state.tokens.prev),doFunction({name:i,statement:this,type:generator?\\\"generator\\\":null,ignoreLoopFunc:inblock}),\\\"(\\\"===state.tokens.next.id&&state.tokens.next.line===state.tokens.curr.line&&error(\\\"E039\\\"),this}),prefix(\\\"function\\\",function(){var generator=!1;\\\"*\\\"===state.tokens.next.value&&(state.inES6()||warning(\\\"W119\\\",state.tokens.curr,\\\"function*\\\",\\\"6\\\"),advance(\\\"*\\\"),generator=!0);var i=optionalidentifier();return doFunction({name:i,type:generator?\\\"generator\\\":null}),this}),blockstmt(\\\"if\\\",function(){var t=state.tokens.next;increaseComplexityCount(),state.condition=!0,advance(\\\"(\\\");var expr=expression(0);checkCondAssignment(expr);var forinifcheck=null;state.option.forin&&state.forinifcheckneeded&&(state.forinifcheckneeded=!1,forinifcheck=state.forinifchecks[state.forinifchecks.length-1],forinifcheck.type=\\\"(punctuator)\\\"===expr.type&&\\\"!\\\"===expr.value?\\\"(negative)\\\":\\\"(positive)\\\"),advance(\\\")\\\",t),state.condition=!1;var s=block(!0,!0);return forinifcheck&&\\\"(negative)\\\"===forinifcheck.type&&s&&s[0]&&\\\"(identifier)\\\"===s[0].type&&\\\"continue\\\"===s[0].value&&(forinifcheck.type=\\\"(negative-with-continue)\\\"),\\\"else\\\"===state.tokens.next.id&&(advance(\\\"else\\\"),\\\"if\\\"===state.tokens.next.id||\\\"switch\\\"===state.tokens.next.id?statement():block(!0,!0)),this}),blockstmt(\\\"try\\\",function(){function doCatch(){if(advance(\\\"catch\\\"),advance(\\\"(\\\"),state.funct[\\\"(scope)\\\"].stack(\\\"catchparams\\\"),checkPunctuators(state.tokens.next,[\\\"[\\\",\\\"{\\\"])){var tokens=destructuringPattern();_.each(tokens,function(token){token.id&&state.funct[\\\"(scope)\\\"].addParam(token.id,token,\\\"exception\\\")})}else\\\"(identifier)\\\"!==state.tokens.next.type?warning(\\\"E030\\\",state.tokens.next,state.tokens.next.value):state.funct[\\\"(scope)\\\"].addParam(identifier(),state.tokens.curr,\\\"exception\\\");\\\"if\\\"===state.tokens.next.value&&(state.inMoz()||warning(\\\"W118\\\",state.tokens.curr,\\\"catch filter\\\"),advance(\\\"if\\\"),expression(0)),advance(\\\")\\\"),block(!1),state.funct[\\\"(scope)\\\"].unstack()}var b;for(block(!0);\\\"catch\\\"===state.tokens.next.id;)increaseComplexityCount(),b&&!state.inMoz()&&warning(\\\"W118\\\",state.tokens.next,\\\"multiple catch blocks\\\"),doCatch(),b=!0;return\\\"finally\\\"===state.tokens.next.id?(advance(\\\"finally\\\"),block(!0),void 0):(b||error(\\\"E021\\\",state.tokens.next,\\\"catch\\\",state.tokens.next.value),this)}),blockstmt(\\\"while\\\",function(){var t=state.tokens.next;return state.funct[\\\"(breakage)\\\"]+=1,state.funct[\\\"(loopage)\\\"]+=1,increaseComplexityCount(),advance(\\\"(\\\"),checkCondAssignment(expression(0)),advance(\\\")\\\",t),block(!0,!0),state.funct[\\\"(breakage)\\\"]-=1,state.funct[\\\"(loopage)\\\"]-=1,this}).labelled=!0,blockstmt(\\\"with\\\",function(){var t=state.tokens.next;return state.isStrict()?error(\\\"E010\\\",state.tokens.curr):state.option.withstmt||warning(\\\"W085\\\",state.tokens.curr),advance(\\\"(\\\"),expression(0),advance(\\\")\\\",t),block(!0,!0),this}),blockstmt(\\\"switch\\\",function(){var t=state.tokens.next,g=!1,noindent=!1;\\nfor(state.funct[\\\"(breakage)\\\"]+=1,advance(\\\"(\\\"),checkCondAssignment(expression(0)),advance(\\\")\\\",t),t=state.tokens.next,advance(\\\"{\\\"),state.tokens.next.from===indent&&(noindent=!0),noindent||(indent+=state.option.indent),this.cases=[];;)switch(state.tokens.next.id){case\\\"case\\\":switch(state.funct[\\\"(verb)\\\"]){case\\\"yield\\\":case\\\"break\\\":case\\\"case\\\":case\\\"continue\\\":case\\\"return\\\":case\\\"switch\\\":case\\\"throw\\\":break;default:state.tokens.curr.caseFallsThrough||warning(\\\"W086\\\",state.tokens.curr,\\\"case\\\")}advance(\\\"case\\\"),this.cases.push(expression(0)),increaseComplexityCount(),g=!0,advance(\\\":\\\"),state.funct[\\\"(verb)\\\"]=\\\"case\\\";break;case\\\"default\\\":switch(state.funct[\\\"(verb)\\\"]){case\\\"yield\\\":case\\\"break\\\":case\\\"continue\\\":case\\\"return\\\":case\\\"throw\\\":break;default:this.cases.length&&(state.tokens.curr.caseFallsThrough||warning(\\\"W086\\\",state.tokens.curr,\\\"default\\\"))}advance(\\\"default\\\"),g=!0,advance(\\\":\\\");break;case\\\"}\\\":return noindent||(indent-=state.option.indent),advance(\\\"}\\\",t),state.funct[\\\"(breakage)\\\"]-=1,state.funct[\\\"(verb)\\\"]=void 0,void 0;case\\\"(end)\\\":return error(\\\"E023\\\",state.tokens.next,\\\"}\\\"),void 0;default:if(indent+=state.option.indent,g)switch(state.tokens.curr.id){case\\\",\\\":return error(\\\"E040\\\"),void 0;case\\\":\\\":g=!1,statements();break;default:return error(\\\"E025\\\",state.tokens.curr),void 0}else{if(\\\":\\\"!==state.tokens.curr.id)return error(\\\"E021\\\",state.tokens.next,\\\"case\\\",state.tokens.next.value),void 0;advance(\\\":\\\"),error(\\\"E024\\\",state.tokens.curr,\\\":\\\"),statements()}indent-=state.option.indent}return this}).labelled=!0,stmt(\\\"debugger\\\",function(){return state.option.debug||warning(\\\"W087\\\",this),this}).exps=!0,function(){var x=stmt(\\\"do\\\",function(){state.funct[\\\"(breakage)\\\"]+=1,state.funct[\\\"(loopage)\\\"]+=1,increaseComplexityCount(),this.first=block(!0,!0),advance(\\\"while\\\");var t=state.tokens.next;return advance(\\\"(\\\"),checkCondAssignment(expression(0)),advance(\\\")\\\",t),state.funct[\\\"(breakage)\\\"]-=1,state.funct[\\\"(loopage)\\\"]-=1,this});x.labelled=!0,x.exps=!0}(),blockstmt(\\\"for\\\",function(){var s,t=state.tokens.next,letscope=!1,foreachtok=null;\\\"each\\\"===t.value&&(foreachtok=t,advance(\\\"each\\\"),state.inMoz()||warning(\\\"W118\\\",state.tokens.curr,\\\"for each\\\")),increaseComplexityCount(),advance(\\\"(\\\");var nextop,comma,initializer,i=0,inof=[\\\"in\\\",\\\"of\\\"],level=0;checkPunctuators(state.tokens.next,[\\\"{\\\",\\\"[\\\"])&&++level;do{if(nextop=peek(i),++i,checkPunctuators(nextop,[\\\"{\\\",\\\"[\\\"])?++level:checkPunctuators(nextop,[\\\"}\\\",\\\"]\\\"])&&--level,0>level)break;0===level&&(!comma&&checkPunctuator(nextop,\\\",\\\")?comma=nextop:!initializer&&checkPunctuator(nextop,\\\"=\\\")&&(initializer=nextop))}while(level>0||!_.contains(inof,nextop.value)&&\\\";\\\"!==nextop.value&&\\\"(end)\\\"!==nextop.type);if(_.contains(inof,nextop.value)){state.inES6()||\\\"of\\\"!==nextop.value||warning(\\\"W104\\\",nextop,\\\"for of\\\",\\\"6\\\");var ok=!(initializer||comma);if(initializer&&error(\\\"W133\\\",comma,nextop.value,\\\"initializer is forbidden\\\"),comma&&error(\\\"W133\\\",comma,nextop.value,\\\"more than one ForBinding\\\"),\\\"var\\\"===state.tokens.next.id?(advance(\\\"var\\\"),state.tokens.curr.fud({prefix:!0})):\\\"let\\\"===state.tokens.next.id||\\\"const\\\"===state.tokens.next.id?(advance(state.tokens.next.id),letscope=!0,state.funct[\\\"(scope)\\\"].stack(),state.tokens.curr.fud({prefix:!0})):Object.create(varstatement).fud({prefix:!0,implied:\\\"for\\\",ignore:!ok}),advance(nextop.value),expression(20),advance(\\\")\\\",t),\\\"in\\\"===nextop.value&&state.option.forin&&(state.forinifcheckneeded=!0,void 0===state.forinifchecks&&(state.forinifchecks=[]),state.forinifchecks.push({type:\\\"(none)\\\"})),state.funct[\\\"(breakage)\\\"]+=1,state.funct[\\\"(loopage)\\\"]+=1,s=block(!0,!0),\\\"in\\\"===nextop.value&&state.option.forin){if(state.forinifchecks&&state.forinifchecks.length>0){var check=state.forinifchecks.pop();(s&&s.length>0&&(\\\"object\\\"!=typeof s[0]||\\\"if\\\"!==s[0].value)||\\\"(positive)\\\"===check.type&&s.length>1||\\\"(negative)\\\"===check.type)&&warning(\\\"W089\\\",this)}state.forinifcheckneeded=!1}state.funct[\\\"(breakage)\\\"]-=1,state.funct[\\\"(loopage)\\\"]-=1}else{if(foreachtok&&error(\\\"E045\\\",foreachtok),\\\";\\\"!==state.tokens.next.id)if(\\\"var\\\"===state.tokens.next.id)advance(\\\"var\\\"),state.tokens.curr.fud();else if(\\\"let\\\"===state.tokens.next.id)advance(\\\"let\\\"),letscope=!0,state.funct[\\\"(scope)\\\"].stack(),state.tokens.curr.fud();else for(;expression(0,\\\"for\\\"),\\\",\\\"===state.tokens.next.id;)comma();if(nolinebreak(state.tokens.curr),advance(\\\";\\\"),state.funct[\\\"(loopage)\\\"]+=1,\\\";\\\"!==state.tokens.next.id&&checkCondAssignment(expression(0)),nolinebreak(state.tokens.curr),advance(\\\";\\\"),\\\";\\\"===state.tokens.next.id&&error(\\\"E021\\\",state.tokens.next,\\\")\\\",\\\";\\\"),\\\")\\\"!==state.tokens.next.id)for(;expression(0,\\\"for\\\"),\\\",\\\"===state.tokens.next.id;)comma();advance(\\\")\\\",t),state.funct[\\\"(breakage)\\\"]+=1,block(!0,!0),state.funct[\\\"(breakage)\\\"]-=1,state.funct[\\\"(loopage)\\\"]-=1}return letscope&&state.funct[\\\"(scope)\\\"].unstack(),this}).labelled=!0,stmt(\\\"break\\\",function(){var v=state.tokens.next.value;return state.option.asi||nolinebreak(this),\\\";\\\"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line!==startLine(state.tokens.next)?0===state.funct[\\\"(breakage)\\\"]&&warning(\\\"W052\\\",state.tokens.next,this.value):(state.funct[\\\"(scope)\\\"].funct.hasBreakLabel(v)||warning(\\\"W090\\\",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt(\\\"continue\\\",function(){var v=state.tokens.next.value;return 0===state.funct[\\\"(breakage)\\\"]&&warning(\\\"W052\\\",state.tokens.next,this.value),state.funct[\\\"(loopage)\\\"]||warning(\\\"W052\\\",state.tokens.next,this.value),state.option.asi||nolinebreak(this),\\\";\\\"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line===startLine(state.tokens.next)&&(state.funct[\\\"(scope)\\\"].funct.hasBreakLabel(v)||warning(\\\"W090\\\",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt(\\\"return\\\",function(){return this.line===startLine(state.tokens.next)?\\\";\\\"===state.tokens.next.id||state.tokens.next.reach||(this.first=expression(0),!this.first||\\\"(punctuator)\\\"!==this.first.type||\\\"=\\\"!==this.first.value||this.first.paren||state.option.boss||warningAt(\\\"W093\\\",this.first.line,this.first.character)):\\\"(punctuator)\\\"===state.tokens.next.type&&[\\\"[\\\",\\\"{\\\",\\\"+\\\",\\\"-\\\"].indexOf(state.tokens.next.value)>-1&&nolinebreak(this),reachable(this),this}).exps=!0,function(x){x.exps=!0,x.lbp=25}(prefix(\\\"yield\\\",function(){var prev=state.tokens.prev;state.inES6(!0)&&!state.funct[\\\"(generator)\\\"]?\\\"(catch)\\\"===state.funct[\\\"(name)\\\"]&&state.funct[\\\"(context)\\\"][\\\"(generator)\\\"]||error(\\\"E046\\\",state.tokens.curr,\\\"yield\\\"):state.inES6()||warning(\\\"W104\\\",state.tokens.curr,\\\"yield\\\",\\\"6\\\"),state.funct[\\\"(generator)\\\"]=\\\"yielded\\\";var delegatingYield=!1;return\\\"*\\\"===state.tokens.next.value&&(delegatingYield=!0,advance(\\\"*\\\")),this.line!==startLine(state.tokens.next)&&state.inMoz()?state.option.asi||nolinebreak(this):((delegatingYield||\\\";\\\"!==state.tokens.next.id&&!state.option.asi&&!state.tokens.next.reach&&state.tokens.next.nud)&&(nobreaknonadjacent(state.tokens.curr,state.tokens.next),this.first=expression(10),\\\"(punctuator)\\\"!==this.first.type||\\\"=\\\"!==this.first.value||this.first.paren||state.option.boss||warningAt(\\\"W093\\\",this.first.line,this.first.character)),state.inMoz()&&\\\")\\\"!==state.tokens.next.id&&(prev.lbp>30||!prev.assign&&!isEndOfExpr()||\\\"yield\\\"===prev.id)&&error(\\\"E050\\\",this)),this})),stmt(\\\"throw\\\",function(){return nolinebreak(this),this.first=expression(20),reachable(this),this}).exps=!0,stmt(\\\"import\\\",function(){if(state.inES6()||warning(\\\"W119\\\",state.tokens.curr,\\\"import\\\",\\\"6\\\"),\\\"(string)\\\"===state.tokens.next.type)return advance(\\\"(string)\\\"),this;if(state.tokens.next.identifier){if(this.name=identifier(),state.funct[\\\"(scope)\\\"].addlabel(this.name,{type:\\\"const\\\",token:state.tokens.curr}),\\\",\\\"!==state.tokens.next.value)return advance(\\\"from\\\"),advance(\\\"(string)\\\"),this;advance(\\\",\\\")}if(\\\"*\\\"===state.tokens.next.id)advance(\\\"*\\\"),advance(\\\"as\\\"),state.tokens.next.identifier&&(this.name=identifier(),state.funct[\\\"(scope)\\\"].addlabel(this.name,{type:\\\"const\\\",token:state.tokens.curr}));else for(advance(\\\"{\\\");;){if(\\\"}\\\"===state.tokens.next.value){advance(\\\"}\\\");break}var importName;if(\\\"default\\\"===state.tokens.next.type?(importName=\\\"default\\\",advance(\\\"default\\\")):importName=identifier(),\\\"as\\\"===state.tokens.next.value&&(advance(\\\"as\\\"),importName=identifier()),state.funct[\\\"(scope)\\\"].addlabel(importName,{type:\\\"const\\\",token:state.tokens.curr}),\\\",\\\"!==state.tokens.next.value){if(\\\"}\\\"===state.tokens.next.value){advance(\\\"}\\\");break}error(\\\"E024\\\",state.tokens.next,state.tokens.next.value);break}advance(\\\",\\\")}return advance(\\\"from\\\"),advance(\\\"(string)\\\"),this}).exps=!0,stmt(\\\"export\\\",function(){var token,identifier,ok=!0;if(state.inES6()||(warning(\\\"W119\\\",state.tokens.curr,\\\"export\\\",\\\"6\\\"),ok=!1),state.funct[\\\"(scope)\\\"].block.isGlobal()||(error(\\\"E053\\\",state.tokens.curr),ok=!1),\\\"*\\\"===state.tokens.next.value)return advance(\\\"*\\\"),advance(\\\"from\\\"),advance(\\\"(string)\\\"),this;if(\\\"default\\\"===state.tokens.next.type){state.nameStack.set(state.tokens.next),advance(\\\"default\\\");var exportType=state.tokens.next.id;return(\\\"function\\\"===exportType||\\\"class\\\"===exportType)&&(this.block=!0),token=peek(),expression(10),identifier=token.value,this.block&&(state.funct[\\\"(scope)\\\"].addlabel(identifier,{type:exportType,token:token}),state.funct[\\\"(scope)\\\"].setExported(identifier,token)),this}if(\\\"{\\\"===state.tokens.next.value){advance(\\\"{\\\");for(var exportedTokens=[];;){if(state.tokens.next.identifier||error(\\\"E030\\\",state.tokens.next,state.tokens.next.value),advance(),exportedTokens.push(state.tokens.curr),\\\"as\\\"===state.tokens.next.value&&(advance(\\\"as\\\"),state.tokens.next.identifier||error(\\\"E030\\\",state.tokens.next,state.tokens.next.value),advance()),\\\",\\\"!==state.tokens.next.value){if(\\\"}\\\"===state.tokens.next.value){advance(\\\"}\\\");break}error(\\\"E024\\\",state.tokens.next,state.tokens.next.value);break}advance(\\\",\\\")}return\\\"from\\\"===state.tokens.next.value?(advance(\\\"from\\\"),advance(\\\"(string)\\\")):ok&&exportedTokens.forEach(function(token){state.funct[\\\"(scope)\\\"].setExported(token.value,token)}),this}if(\\\"var\\\"===state.tokens.next.id)advance(\\\"var\\\"),state.tokens.curr.fud({inexport:!0});else if(\\\"let\\\"===state.tokens.next.id)advance(\\\"let\\\"),state.tokens.curr.fud({inexport:!0});else if(\\\"const\\\"===state.tokens.next.id)advance(\\\"const\\\"),state.tokens.curr.fud({inexport:!0});else if(\\\"function\\\"===state.tokens.next.id)this.block=!0,advance(\\\"function\\\"),state.syntax[\\\"function\\\"].fud({inexport:!0});else if(\\\"class\\\"===state.tokens.next.id){this.block=!0,advance(\\\"class\\\");var classNameToken=state.tokens.next;state.syntax[\\\"class\\\"].fud(),state.funct[\\\"(scope)\\\"].setExported(classNameToken.value,classNameToken)}else error(\\\"E024\\\",state.tokens.next,state.tokens.next.value);return this}).exps=!0,FutureReservedWord(\\\"abstract\\\"),FutureReservedWord(\\\"boolean\\\"),FutureReservedWord(\\\"byte\\\"),FutureReservedWord(\\\"char\\\"),FutureReservedWord(\\\"class\\\",{es5:!0,nud:classdef}),FutureReservedWord(\\\"double\\\"),FutureReservedWord(\\\"enum\\\",{es5:!0}),FutureReservedWord(\\\"export\\\",{es5:!0}),FutureReservedWord(\\\"extends\\\",{es5:!0}),FutureReservedWord(\\\"final\\\"),FutureReservedWord(\\\"float\\\"),FutureReservedWord(\\\"goto\\\"),FutureReservedWord(\\\"implements\\\",{es5:!0,strictOnly:!0}),FutureReservedWord(\\\"import\\\",{es5:!0}),FutureReservedWord(\\\"int\\\"),FutureReservedWord(\\\"interface\\\",{es5:!0,strictOnly:!0}),FutureReservedWord(\\\"long\\\"),FutureReservedWord(\\\"native\\\"),FutureReservedWord(\\\"package\\\",{es5:!0,strictOnly:!0}),FutureReservedWord(\\\"private\\\",{es5:!0,strictOnly:!0}),FutureReservedWord(\\\"protected\\\",{es5:!0,strictOnly:!0}),FutureReservedWord(\\\"public\\\",{es5:!0,strictOnly:!0}),FutureReservedWord(\\\"short\\\"),FutureReservedWord(\\\"static\\\",{es5:!0,strictOnly:!0}),FutureReservedWord(\\\"super\\\",{es5:!0}),FutureReservedWord(\\\"synchronized\\\"),FutureReservedWord(\\\"transient\\\"),FutureReservedWord(\\\"volatile\\\");var lookupBlockType=function(){var pn,pn1,prev,i=-1,bracketStack=0,ret={};checkPunctuators(state.tokens.curr,[\\\"[\\\",\\\"{\\\"])&&(bracketStack+=1);do{if(prev=-1===i?state.tokens.curr:pn,pn=-1===i?state.tokens.next:peek(i),pn1=peek(i+1),i+=1,checkPunctuators(pn,[\\\"[\\\",\\\"{\\\"])?bracketStack+=1:checkPunctuators(pn,[\\\"]\\\",\\\"}\\\"])&&(bracketStack-=1),1===bracketStack&&pn.identifier&&\\\"for\\\"===pn.value&&!checkPunctuator(prev,\\\".\\\")){ret.isCompArray=!0,ret.notJson=!0;break}if(0===bracketStack&&checkPunctuators(pn,[\\\"}\\\",\\\"]\\\"])){if(\\\"=\\\"===pn1.value){ret.isDestAssign=!0,ret.notJson=!0;break}if(\\\".\\\"===pn1.value){ret.notJson=!0;break}}checkPunctuator(pn,\\\";\\\")&&(ret.isBlock=!0,ret.notJson=!0)}while(bracketStack>0&&\\\"(end)\\\"!==pn.id);return ret},arrayComprehension=function(){function declare(v){var l=_current.variables.filter(function(elt){return elt.value===v?(elt.undef=!1,v):void 0}).length;return 0!==l}function use(v){var l=_current.variables.filter(function(elt){return elt.value!==v||elt.undef?void 0:(elt.unused===!0&&(elt.unused=!1),v)}).length;return 0===l}var _current,CompArray=function(){this.mode=\\\"use\\\",this.variables=[]},_carrays=[];return{stack:function(){_current=new CompArray,_carrays.push(_current)},unstack:function(){_current.variables.filter(function(v){v.unused&&warning(\\\"W098\\\",v.token,v.raw_text||v.value),v.undef&&state.funct[\\\"(scope)\\\"].block.use(v.value,v.token)}),_carrays.splice(-1,1),_current=_carrays[_carrays.length-1]},setState:function(s){_.contains([\\\"use\\\",\\\"define\\\",\\\"generate\\\",\\\"filter\\\"],s)&&(_current.mode=s)},check:function(v){return _current?_current&&\\\"use\\\"===_current.mode?(use(v)&&_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!0,unused:!1}),!0):_current&&\\\"define\\\"===_current.mode?(declare(v)||_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!1,unused:!0}),!0):_current&&\\\"generate\\\"===_current.mode?(state.funct[\\\"(scope)\\\"].block.use(v,state.tokens.curr),!0):_current&&\\\"filter\\\"===_current.mode?(use(v)&&state.funct[\\\"(scope)\\\"].block.use(v,state.tokens.curr),!0):!1:void 0}}},escapeRegex=function(str){return str.replace(/[-\\\\/\\\\\\\\^$*+?.()|[\\\\]{}]/g,\\\"\\\\\\\\$&\\\")},itself=function(s,o,g){function each(obj,cb){obj&&(Array.isArray(obj)||\\\"object\\\"!=typeof obj||(obj=Object.keys(obj)),obj.forEach(cb))}var i,k,x,reIgnoreStr,reIgnore,optionKeys,newOptionObj={},newIgnoredObj={};o=_.clone(o),state.reset(),o&&o.scope?JSHINT.scope=o.scope:(JSHINT.errors=[],JSHINT.undefs=[],JSHINT.internals=[],JSHINT.blacklist={},JSHINT.scope=\\\"(main)\\\"),predefined=Object.create(null),combine(predefined,vars.ecmaIdentifiers[3]),combine(predefined,vars.reservedVars),combine(predefined,g||{}),declared=Object.create(null);var exported=Object.create(null);if(o)for(each(o.predef||null,function(item){var slice,prop;\\\"-\\\"===item[0]?(slice=item.slice(1),JSHINT.blacklist[slice]=slice,delete predefined[slice]):(prop=Object.getOwnPropertyDescriptor(o.predef,item),predefined[item]=prop?prop.value:!1)}),each(o.exported||null,function(item){exported[item]=!0}),delete o.predef,delete o.exported,optionKeys=Object.keys(o),x=0;optionKeys.length>x;x++)if(/^-W\\\\d{3}$/g.test(optionKeys[x]))newIgnoredObj[optionKeys[x].slice(1)]=!0;else{var optionKey=optionKeys[x];newOptionObj[optionKey]=o[optionKey],(\\\"esversion\\\"===optionKey&&5===o[optionKey]||\\\"es5\\\"===optionKey&&o[optionKey])&&warning(\\\"I003\\\"),\\\"newcap\\\"===optionKeys[x]&&o[optionKey]===!1&&(newOptionObj[\\\"(explicitNewcap)\\\"]=!0)}state.option=newOptionObj,state.ignored=newIgnoredObj,state.option.indent=state.option.indent||4,state.option.maxerr=state.option.maxerr||50,indent=1;var scopeManagerInst=scopeManager(state,predefined,exported,declared);if(scopeManagerInst.on(\\\"warning\\\",function(ev){warning.apply(null,[ev.code,ev.token].concat(ev.data))}),scopeManagerInst.on(\\\"error\\\",function(ev){error.apply(null,[ev.code,ev.token].concat(ev.data))}),state.funct=functor(\\\"(global)\\\",null,{\\\"(global)\\\":!0,\\\"(scope)\\\":scopeManagerInst,\\\"(comparray)\\\":arrayComprehension(),\\\"(metrics)\\\":createMetrics(state.tokens.next)}),functions=[state.funct],urls=[],stack=null,member={},membersOnly=null,inblock=!1,lookahead=[],!isString(s)&&!Array.isArray(s))return errorAt(\\\"E004\\\",0),!1;api={get isJSON(){return state.jsonMode},getOption:function(name){return state.option[name]||null},getCache:function(name){return state.cache[name]},setCache:function(name,value){state.cache[name]=value},warn:function(code,data){warningAt.apply(null,[code,data.line,data.char].concat(data.data))},on:function(names,listener){names.split(\\\" \\\").forEach(function(name){emitter.on(name,listener)}.bind(this))}},emitter.removeAllListeners(),(extraModules||[]).forEach(function(func){func(api)}),state.tokens.prev=state.tokens.curr=state.tokens.next=state.syntax[\\\"(begin)\\\"],o&&o.ignoreDelimiters&&(Array.isArray(o.ignoreDelimiters)||(o.ignoreDelimiters=[o.ignoreDelimiters]),o.ignoreDelimiters.forEach(function(delimiterPair){delimiterPair.start&&delimiterPair.end&&(reIgnoreStr=escapeRegex(delimiterPair.start)+\\\"[\\\\\\\\s\\\\\\\\S]*?\\\"+escapeRegex(delimiterPair.end),reIgnore=RegExp(reIgnoreStr,\\\"ig\\\"),s=s.replace(reIgnore,function(match){return match.replace(/./g,\\\" \\\")}))})),lex=new Lexer(s),lex.on(\\\"warning\\\",function(ev){warningAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on(\\\"error\\\",function(ev){errorAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on(\\\"fatal\\\",function(ev){quit(\\\"E041\\\",ev.line,ev.from)}),lex.on(\\\"Identifier\\\",function(ev){emitter.emit(\\\"Identifier\\\",ev)}),lex.on(\\\"String\\\",function(ev){emitter.emit(\\\"String\\\",ev)}),lex.on(\\\"Number\\\",function(ev){emitter.emit(\\\"Number\\\",ev)}),lex.start();for(var name in o)_.has(o,name)&&checkOption(name,state.tokens.curr);assume(),combine(predefined,g||{}),comma.first=!0;try{switch(advance(),state.tokens.next.id){case\\\"{\\\":case\\\"[\\\":destructuringAssignOrJsonValue();break;default:directives(),state.directive[\\\"use strict\\\"]&&\\\"global\\\"!==state.option.strict&&warning(\\\"W097\\\",state.tokens.prev),statements()}\\\"(end)\\\"!==state.tokens.next.id&&quit(\\\"E041\\\",state.tokens.curr.line),state.funct[\\\"(scope)\\\"].unstack()}catch(err){if(!err||\\\"JSHintError\\\"!==err.name)throw err;var nt=state.tokens.next||{};JSHINT.errors.push({scope:\\\"(main)\\\",raw:err.raw,code:err.code,reason:err.message,line:err.line||nt.line,character:err.character||nt.from},null)}if(\\\"(main)\\\"===JSHINT.scope)for(o=o||{},i=0;JSHINT.internals.length>i;i+=1)k=JSHINT.internals[i],o.scope=k.elem,itself(k.value,o,g);return 0===JSHINT.errors.length};return itself.addModule=function(func){extraModules.push(func)},itself.addModule(style.register),itself.data=function(){var fu,f,i,j,n,globals,data={functions:[],options:state.option};itself.errors.length&&(data.errors=itself.errors),state.jsonMode&&(data.json=!0);var impliedGlobals=state.funct[\\\"(scope)\\\"].getImpliedGlobals();for(impliedGlobals.length>0&&(data.implieds=impliedGlobals),urls.length>0&&(data.urls=urls),globals=state.funct[\\\"(scope)\\\"].getUsedOrDefinedGlobals(),globals.length>0&&(data.globals=globals),i=1;functions.length>i;i+=1){for(f=functions[i],fu={},j=0;functionicity.length>j;j+=1)fu[functionicity[j]]=[];for(j=0;functionicity.length>j;j+=1)0===fu[functionicity[j]].length&&delete fu[functionicity[j]];fu.name=f[\\\"(name)\\\"],fu.param=f[\\\"(params)\\\"],fu.line=f[\\\"(line)\\\"],fu.character=f[\\\"(character)\\\"],fu.last=f[\\\"(last)\\\"],fu.lastcharacter=f[\\\"(lastcharacter)\\\"],fu.metrics={complexity:f[\\\"(metrics)\\\"].ComplexityCount,parameters:f[\\\"(metrics)\\\"].arity,statements:f[\\\"(metrics)\\\"].statementCount},data.functions.push(fu)}var unuseds=state.funct[\\\"(scope)\\\"].getUnuseds();unuseds.length>0&&(data.unused=unuseds);for(n in member)if(\\\"number\\\"==typeof member[n]){data.member=member;break}return data},itself.jshint=itself,itself}();\\\"object\\\"==typeof exports&&exports&&(exports.JSHINT=JSHINT)},{\\\"../lodash\\\":\\\"/node_modules/jshint/lodash.js\\\",\\\"./lex.js\\\":\\\"/node_modules/jshint/src/lex.js\\\",\\\"./messages.js\\\":\\\"/node_modules/jshint/src/messages.js\\\",\\\"./options.js\\\":\\\"/node_modules/jshint/src/options.js\\\",\\\"./reg.js\\\":\\\"/node_modules/jshint/src/reg.js\\\",\\\"./scope-manager.js\\\":\\\"/node_modules/jshint/src/scope-manager.js\\\",\\\"./state.js\\\":\\\"/node_modules/jshint/src/state.js\\\",\\\"./style.js\\\":\\\"/node_modules/jshint/src/style.js\\\",\\\"./vars.js\\\":\\\"/node_modules/jshint/src/vars.js\\\",events:\\\"/node_modules/browserify/node_modules/events/events.js\\\"}],\\\"/node_modules/jshint/src/lex.js\\\":[function(_dereq_,module,exports){\\\"use strict\\\";function asyncTrigger(){var _checks=[];return{push:function(fn){_checks.push(fn)},check:function(){for(var check=0;_checks.length>check;++check)_checks[check]();_checks.splice(0,_checks.length)}}}function Lexer(source){var lines=source;\\\"string\\\"==typeof lines&&(lines=lines.replace(/\\\\r\\\\n/g,\\\"\\\\n\\\").replace(/\\\\r/g,\\\"\\\\n\\\").split(\\\"\\\\n\\\")),lines[0]&&\\\"#!\\\"===lines[0].substr(0,2)&&(-1!==lines[0].indexOf(\\\"node\\\")&&(state.option.node=!0),lines[0]=\\\"\\\"),this.emitter=new events.EventEmitter,this.source=source,this.setLines(lines),this.prereg=!0,this.line=0,this.char=1,this.from=1,this.input=\\\"\\\",this.inComment=!1,this.context=[],this.templateStarts=[];for(var i=0;state.option.indent>i;i+=1)state.tab+=\\\" \\\";this.ignoreLinterErrors=!1}var _=_dereq_(\\\"../lodash\\\"),events=_dereq_(\\\"events\\\"),reg=_dereq_(\\\"./reg.js\\\"),state=_dereq_(\\\"./state.js\\\").state,unicodeData=_dereq_(\\\"../data/ascii-identifier-data.js\\\"),asciiIdentifierStartTable=unicodeData.asciiIdentifierStartTable,asciiIdentifierPartTable=unicodeData.asciiIdentifierPartTable,Token={Identifier:1,Punctuator:2,NumericLiteral:3,StringLiteral:4,Comment:5,Keyword:6,NullLiteral:7,BooleanLiteral:8,RegExp:9,TemplateHead:10,TemplateMiddle:11,TemplateTail:12,NoSubstTemplate:13},Context={Block:1,Template:2};Lexer.prototype={_lines:[],inContext:function(ctxType){return this.context.length>0&&this.context[this.context.length-1].type===ctxType},pushContext:function(ctxType){this.context.push({type:ctxType})},popContext:function(){return this.context.pop()},isContext:function(context){return this.context.length>0&&this.context[this.context.length-1]===context},currentContext:function(){return this.context.length>0&&this.context[this.context.length-1]},getLines:function(){return this._lines=state.lines,this._lines},setLines:function(val){this._lines=val,state.lines=this._lines},peek:function(i){return this.input.charAt(i||0)},skip:function(i){i=i||1,this.char+=i,this.input=this.input.slice(i)},on:function(names,listener){names.split(\\\" \\\").forEach(function(name){this.emitter.on(name,listener)}.bind(this))},trigger:function(){this.emitter.emit.apply(this.emitter,Array.prototype.slice.call(arguments))},triggerAsync:function(type,args,checks,fn){checks.push(function(){fn()&&this.trigger(type,args)}.bind(this))},scanPunctuator:function(){var ch2,ch3,ch4,ch1=this.peek();switch(ch1){case\\\".\\\":if(/^[0-9]$/.test(this.peek(1)))return null;if(\\\".\\\"===this.peek(1)&&\\\".\\\"===this.peek(2))return{type:Token.Punctuator,value:\\\"...\\\"};case\\\"(\\\":case\\\")\\\":case\\\";\\\":case\\\",\\\":case\\\"[\\\":case\\\"]\\\":case\\\":\\\":case\\\"~\\\":case\\\"?\\\":return{type:Token.Punctuator,value:ch1};case\\\"{\\\":return this.pushContext(Context.Block),{type:Token.Punctuator,value:ch1};case\\\"}\\\":return this.inContext(Context.Block)&&this.popContext(),{type:Token.Punctuator,value:ch1};case\\\"#\\\":return{type:Token.Punctuator,value:ch1};case\\\"\\\":return null}return ch2=this.peek(1),ch3=this.peek(2),ch4=this.peek(3),\\\">\\\"===ch1&&\\\">\\\"===ch2&&\\\">\\\"===ch3&&\\\"=\\\"===ch4?{type:Token.Punctuator,value:\\\">>>=\\\"}:\\\"=\\\"===ch1&&\\\"=\\\"===ch2&&\\\"=\\\"===ch3?{type:Token.Punctuator,value:\\\"===\\\"}:\\\"!\\\"===ch1&&\\\"=\\\"===ch2&&\\\"=\\\"===ch3?{type:Token.Punctuator,value:\\\"!==\\\"}:\\\">\\\"===ch1&&\\\">\\\"===ch2&&\\\">\\\"===ch3?{type:Token.Punctuator,value:\\\">>>\\\"}:\\\"<\\\"===ch1&&\\\"<\\\"===ch2&&\\\"=\\\"===ch3?{type:Token.Punctuator,value:\\\"<<=\\\"}:\\\">\\\"===ch1&&\\\">\\\"===ch2&&\\\"=\\\"===ch3?{type:Token.Punctuator,value:\\\">>=\\\"}:\\\"=\\\"===ch1&&\\\">\\\"===ch2?{type:Token.Punctuator,value:ch1+ch2}:ch1===ch2&&\\\"+-<>&|\\\".indexOf(ch1)>=0?{type:Token.Punctuator,value:ch1+ch2}:\\\"<>=!+-*%&|^\\\".indexOf(ch1)>=0?\\\"=\\\"===ch2?{type:Token.Punctuator,value:ch1+ch2}:{type:Token.Punctuator,value:ch1}:\\\"/\\\"===ch1?\\\"=\\\"===ch2?{type:Token.Punctuator,value:\\\"/=\\\"}:{type:Token.Punctuator,value:\\\"/\\\"}:null},scanComments:function(){function commentToken(label,body,opt){var special=[\\\"jshint\\\",\\\"jslint\\\",\\\"members\\\",\\\"member\\\",\\\"globals\\\",\\\"global\\\",\\\"exported\\\"],isSpecial=!1,value=label+body,commentType=\\\"plain\\\";return opt=opt||{},opt.isMultiline&&(value+=\\\"*/\\\"),body=body.replace(/\\\\n/g,\\\" \\\"),\\\"/*\\\"===label&&reg.fallsThrough.test(body)&&(isSpecial=!0,commentType=\\\"falls through\\\"),special.forEach(function(str){if(!isSpecial&&(\\\"//\\\"!==label||\\\"jshint\\\"===str)&&(\\\" \\\"===body.charAt(str.length)&&body.substr(0,str.length)===str&&(isSpecial=!0,label+=str,body=body.substr(str.length)),isSpecial||\\\" \\\"!==body.charAt(0)||\\\" \\\"!==body.charAt(str.length+1)||body.substr(1,str.length)!==str||(isSpecial=!0,label=label+\\\" \\\"+str,body=body.substr(str.length+1)),isSpecial))switch(str){case\\\"member\\\":commentType=\\\"members\\\";break;case\\\"global\\\":commentType=\\\"globals\\\";break;default:var options=body.split(\\\":\\\").map(function(v){return v.replace(/^\\\\s+/,\\\"\\\").replace(/\\\\s+$/,\\\"\\\")});if(2===options.length)switch(options[0]){case\\\"ignore\\\":switch(options[1]){case\\\"start\\\":self.ignoringLinterErrors=!0,isSpecial=!1;break;case\\\"end\\\":self.ignoringLinterErrors=!1,isSpecial=!1}}commentType=str}}),{type:Token.Comment,commentType:commentType,value:value,body:body,isSpecial:isSpecial,isMultiline:opt.isMultiline||!1,isMalformed:opt.isMalformed||!1}}var ch1=this.peek(),ch2=this.peek(1),rest=this.input.substr(2),startLine=this.line,startChar=this.char,self=this;if(\\\"*\\\"===ch1&&\\\"/\\\"===ch2)return this.trigger(\\\"error\\\",{code:\\\"E018\\\",line:startLine,character:startChar}),this.skip(2),null;if(\\\"/\\\"!==ch1||\\\"*\\\"!==ch2&&\\\"/\\\"!==ch2)return null;if(\\\"/\\\"===ch2)return this.skip(this.input.length),commentToken(\\\"//\\\",rest);var body=\\\"\\\";if(\\\"*\\\"===ch2){for(this.inComment=!0,this.skip(2);\\\"*\\\"!==this.peek()||\\\"/\\\"!==this.peek(1);)if(\\\"\\\"===this.peek()){if(body+=\\\"\\\\n\\\",!this.nextLine())return this.trigger(\\\"error\\\",{code:\\\"E017\\\",line:startLine,character:startChar}),this.inComment=!1,commentToken(\\\"/*\\\",body,{isMultiline:!0,isMalformed:!0})}else body+=this.peek(),this.skip();return this.skip(2),this.inComment=!1,commentToken(\\\"/*\\\",body,{isMultiline:!0})}},scanKeyword:function(){var result=/^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),keywords=[\\\"if\\\",\\\"in\\\",\\\"do\\\",\\\"var\\\",\\\"for\\\",\\\"new\\\",\\\"try\\\",\\\"let\\\",\\\"this\\\",\\\"else\\\",\\\"case\\\",\\\"void\\\",\\\"with\\\",\\\"enum\\\",\\\"while\\\",\\\"break\\\",\\\"catch\\\",\\\"throw\\\",\\\"const\\\",\\\"yield\\\",\\\"class\\\",\\\"super\\\",\\\"return\\\",\\\"typeof\\\",\\\"delete\\\",\\\"switch\\\",\\\"export\\\",\\\"import\\\",\\\"default\\\",\\\"finally\\\",\\\"extends\\\",\\\"function\\\",\\\"continue\\\",\\\"debugger\\\",\\\"instanceof\\\"];return result&&keywords.indexOf(result[0])>=0?{type:Token.Keyword,value:result[0]}:null},scanIdentifier:function(){function isNonAsciiIdentifierStart(code){return code>256}function isNonAsciiIdentifierPart(code){return code>256}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function removeEscapeSequences(id){return id.replace(/\\\\\\\\u([0-9a-fA-F]{4})/g,function(m0,codepoint){return String.fromCharCode(parseInt(codepoint,16))})}var type,char,id=\\\"\\\",index=0,readUnicodeEscapeSequence=function(){if(index+=1,\\\"u\\\"!==this.peek(index))return null;var code,ch1=this.peek(index+1),ch2=this.peek(index+2),ch3=this.peek(index+3),ch4=this.peek(index+4);return isHexDigit(ch1)&&isHexDigit(ch2)&&isHexDigit(ch3)&&isHexDigit(ch4)?(code=parseInt(ch1+ch2+ch3+ch4,16),asciiIdentifierPartTable[code]||isNonAsciiIdentifierPart(code)?(index+=5,\\\"\\\\\\\\u\\\"+ch1+ch2+ch3+ch4):null):null}.bind(this),getIdentifierStart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierStartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierStart(code)?(index+=1,chr):null}.bind(this),getIdentifierPart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierPartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierPart(code)?(index+=1,chr):null}.bind(this);if(char=getIdentifierStart(),null===char)return null;for(id=char;char=getIdentifierPart(),null!==char;)id+=char;switch(id){case\\\"true\\\":case\\\"false\\\":type=Token.BooleanLiteral;break;case\\\"null\\\":type=Token.NullLiteral;break;default:type=Token.Identifier}return{type:type,value:removeEscapeSequences(id),text:id,tokenLength:id.length}},scanNumericLiteral:function(){function isDecimalDigit(str){return/^[0-9]$/.test(str)}function isOctalDigit(str){return/^[0-7]$/.test(str)}function isBinaryDigit(str){return/^[01]$/.test(str)}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function isIdentifierStart(ch){return\\\"$\\\"===ch||\\\"_\\\"===ch||\\\"\\\\\\\\\\\"===ch||ch>=\\\"a\\\"&&\\\"z\\\">=ch||ch>=\\\"A\\\"&&\\\"Z\\\">=ch}var bad,index=0,value=\\\"\\\",length=this.input.length,char=this.peek(index),isAllowedDigit=isDecimalDigit,base=10,isLegacy=!1;if(\\\".\\\"!==char&&!isDecimalDigit(char))return null;if(\\\".\\\"!==char){for(value=this.peek(index),index+=1,char=this.peek(index),\\\"0\\\"===value&&((\\\"x\\\"===char||\\\"X\\\"===char)&&(isAllowedDigit=isHexDigit,base=16,index+=1,value+=char),(\\\"o\\\"===char||\\\"O\\\"===char)&&(isAllowedDigit=isOctalDigit,base=8,state.inES6(!0)||this.trigger(\\\"warning\\\",{code:\\\"W119\\\",line:this.line,character:this.char,data:[\\\"Octal integer literal\\\",\\\"6\\\"]}),index+=1,value+=char),(\\\"b\\\"===char||\\\"B\\\"===char)&&(isAllowedDigit=isBinaryDigit,base=2,state.inES6(!0)||this.trigger(\\\"warning\\\",{code:\\\"W119\\\",line:this.line,character:this.char,data:[\\\"Binary integer literal\\\",\\\"6\\\"]}),index+=1,value+=char),isOctalDigit(char)&&(isAllowedDigit=isOctalDigit,base=8,isLegacy=!0,bad=!1,index+=1,value+=char),!isOctalDigit(char)&&isDecimalDigit(char)&&(index+=1,value+=char));length>index;){if(char=this.peek(index),isLegacy&&isDecimalDigit(char))bad=!0;else if(!isAllowedDigit(char))break;value+=char,index+=1}if(isAllowedDigit!==isDecimalDigit)return!isLegacy&&2>=value.length?{type:Token.NumericLiteral,value:value,isMalformed:!0}:length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isLegacy:isLegacy,isMalformed:!1}}if(\\\".\\\"===char)for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1;if(\\\"e\\\"===char||\\\"E\\\"===char){if(value+=char,index+=1,char=this.peek(index),(\\\"+\\\"===char||\\\"-\\\"===char)&&(value+=this.peek(index),index+=1),char=this.peek(index),!isDecimalDigit(char))return null;for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1}return length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isMalformed:!isFinite(value)}},scanEscapeSequence:function(checks){var allowNewLine=!1,jump=1;this.skip();var char=this.peek();switch(char){case\\\"'\\\":this.triggerAsync(\\\"warning\\\",{code:\\\"W114\\\",line:this.line,character:this.char,data:[\\\"\\\\\\\\'\\\"]},checks,function(){return state.jsonMode});break;case\\\"b\\\":char=\\\"\\\\\\\\b\\\";break;case\\\"f\\\":char=\\\"\\\\\\\\f\\\";break;case\\\"n\\\":char=\\\"\\\\\\\\n\\\";break;case\\\"r\\\":char=\\\"\\\\\\\\r\\\";break;case\\\"t\\\":char=\\\"\\\\\\\\t\\\";break;case\\\"0\\\":char=\\\"\\\\\\\\0\\\";var n=parseInt(this.peek(1),10);this.triggerAsync(\\\"warning\\\",{code:\\\"W115\\\",line:this.line,character:this.char},checks,function(){return n>=0&&7>=n&&state.isStrict()});break;case\\\"u\\\":var hexCode=this.input.substr(1,4),code=parseInt(hexCode,16);isNaN(code)&&this.trigger(\\\"warning\\\",{code:\\\"W052\\\",line:this.line,character:this.char,data:[\\\"u\\\"+hexCode]}),char=String.fromCharCode(code),jump=5;break;case\\\"v\\\":this.triggerAsync(\\\"warning\\\",{code:\\\"W114\\\",line:this.line,character:this.char,data:[\\\"\\\\\\\\v\\\"]},checks,function(){return state.jsonMode}),char=\\\"\\u000b\\\";break;case\\\"x\\\":var x=parseInt(this.input.substr(1,2),16);this.triggerAsync(\\\"warning\\\",{code:\\\"W114\\\",line:this.line,character:this.char,data:[\\\"\\\\\\\\x-\\\"]},checks,function(){return state.jsonMode}),char=String.fromCharCode(x),jump=3;break;case\\\"\\\\\\\\\\\":char=\\\"\\\\\\\\\\\\\\\\\\\";break;case'\\\"':char='\\\\\\\\\\\"';break;case\\\"/\\\":break;case\\\"\\\":allowNewLine=!0,char=\\\"\\\"}return{\\\"char\\\":char,jump:jump,allowNewLine:allowNewLine}},scanTemplateLiteral:function(checks){var tokenType,ch,value=\\\"\\\",startLine=this.line,startChar=this.char,depth=this.templateStarts.length;if(!state.inES6(!0))return null;if(\\\"`\\\"===this.peek())tokenType=Token.TemplateHead,this.templateStarts.push({line:this.line,\\\"char\\\":this.char}),depth=this.templateStarts.length,this.skip(1),this.pushContext(Context.Template);else{if(!this.inContext(Context.Template)||\\\"}\\\"!==this.peek())return null;tokenType=Token.TemplateMiddle}for(;\\\"`\\\"!==this.peek();){for(;\\\"\\\"===(ch=this.peek());)if(value+=\\\"\\\\n\\\",!this.nextLine()){var startPos=this.templateStarts.pop();return this.trigger(\\\"error\\\",{code:\\\"E052\\\",line:startPos.line,character:startPos.char}),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,depth:depth,context:this.popContext()}}if(\\\"$\\\"===ch&&\\\"{\\\"===this.peek(1))return value+=\\\"${\\\",this.skip(2),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.currentContext()};\\nif(\\\"\\\\\\\\\\\"===ch){var escape=this.scanEscapeSequence(checks);value+=escape.char,this.skip(escape.jump)}else\\\"`\\\"!==ch&&(value+=ch,this.skip(1))}return tokenType=tokenType===Token.TemplateHead?Token.NoSubstTemplate:Token.TemplateTail,this.skip(1),this.templateStarts.pop(),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.popContext()}},scanStringLiteral:function(checks){var quote=this.peek();if('\\\"'!==quote&&\\\"'\\\"!==quote)return null;this.triggerAsync(\\\"warning\\\",{code:\\\"W108\\\",line:this.line,character:this.char},checks,function(){return state.jsonMode&&'\\\"'!==quote});var value=\\\"\\\",startLine=this.line,startChar=this.char,allowNewLine=!1;for(this.skip();this.peek()!==quote;)if(\\\"\\\"===this.peek()){if(allowNewLine?(allowNewLine=!1,this.triggerAsync(\\\"warning\\\",{code:\\\"W043\\\",line:this.line,character:this.char},checks,function(){return!state.option.multistr}),this.triggerAsync(\\\"warning\\\",{code:\\\"W042\\\",line:this.line,character:this.char},checks,function(){return state.jsonMode&&state.option.multistr})):this.trigger(\\\"warning\\\",{code:\\\"W112\\\",line:this.line,character:this.char}),!this.nextLine())return this.trigger(\\\"error\\\",{code:\\\"E029\\\",line:startLine,character:startChar}),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,quote:quote}}else{allowNewLine=!1;var char=this.peek(),jump=1;if(\\\" \\\">char&&this.trigger(\\\"warning\\\",{code:\\\"W113\\\",line:this.line,character:this.char,data:[\\\"<non-printable>\\\"]}),\\\"\\\\\\\\\\\"===char){var parsed=this.scanEscapeSequence(checks);char=parsed.char,jump=parsed.jump,allowNewLine=parsed.allowNewLine}value+=char,this.skip(jump)}return this.skip(),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,quote:quote}},scanRegExp:function(){var terminated,index=0,length=this.input.length,char=this.peek(),value=char,body=\\\"\\\",flags=[],malformed=!1,isCharSet=!1,scanUnexpectedChars=function(){\\\" \\\">char&&(malformed=!0,this.trigger(\\\"warning\\\",{code:\\\"W048\\\",line:this.line,character:this.char})),\\\"<\\\"===char&&(malformed=!0,this.trigger(\\\"warning\\\",{code:\\\"W049\\\",line:this.line,character:this.char,data:[char]}))}.bind(this);if(!this.prereg||\\\"/\\\"!==char)return null;for(index+=1,terminated=!1;length>index;)if(char=this.peek(index),value+=char,body+=char,isCharSet)\\\"]\\\"===char&&(\\\"\\\\\\\\\\\"!==this.peek(index-1)||\\\"\\\\\\\\\\\"===this.peek(index-2))&&(isCharSet=!1),\\\"\\\\\\\\\\\"===char&&(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars()),index+=1;else{if(\\\"\\\\\\\\\\\"===char){if(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars(),\\\"/\\\"===char){index+=1;continue}if(\\\"[\\\"===char){index+=1;continue}}if(\\\"[\\\"!==char){if(\\\"/\\\"===char){body=body.substr(0,body.length-1),terminated=!0,index+=1;break}index+=1}else isCharSet=!0,index+=1}if(!terminated)return this.trigger(\\\"error\\\",{code:\\\"E015\\\",line:this.line,character:this.from}),void this.trigger(\\\"fatal\\\",{line:this.line,from:this.from});for(;length>index&&(char=this.peek(index),/[gim]/.test(char));)flags.push(char),value+=char,index+=1;try{RegExp(body,flags.join(\\\"\\\"))}catch(err){malformed=!0,this.trigger(\\\"error\\\",{code:\\\"E016\\\",line:this.line,character:this.char,data:[err.message]})}return{type:Token.RegExp,value:value,flags:flags,isMalformed:malformed}},scanNonBreakingSpaces:function(){return state.option.nonbsp?this.input.search(/(\\\\u00A0)/):-1},scanUnsafeChars:function(){return this.input.search(reg.unsafeChars)},next:function(checks){this.from=this.char;var start;if(/\\\\s/.test(this.peek()))for(start=this.char;/\\\\s/.test(this.peek());)this.from+=1,this.skip();var match=this.scanComments()||this.scanStringLiteral(checks)||this.scanTemplateLiteral(checks);return match?match:(match=this.scanRegExp()||this.scanPunctuator()||this.scanKeyword()||this.scanIdentifier()||this.scanNumericLiteral(),match?(this.skip(match.tokenLength||match.value.length),match):null)},nextLine:function(){var char;if(this.line>=this.getLines().length)return!1;this.input=this.getLines()[this.line],this.line+=1,this.char=1,this.from=1;var inputTrimmed=this.input.trim(),startsWith=function(){return _.some(arguments,function(prefix){return 0===inputTrimmed.indexOf(prefix)})},endsWith=function(){return _.some(arguments,function(suffix){return-1!==inputTrimmed.indexOf(suffix,inputTrimmed.length-suffix.length)})};if(this.ignoringLinterErrors===!0&&(startsWith(\\\"/*\\\",\\\"//\\\")||this.inComment&&endsWith(\\\"*/\\\")||(this.input=\\\"\\\")),char=this.scanNonBreakingSpaces(),char>=0&&this.trigger(\\\"warning\\\",{code:\\\"W125\\\",line:this.line,character:char+1}),this.input=this.input.replace(/\\\\t/g,state.tab),char=this.scanUnsafeChars(),char>=0&&this.trigger(\\\"warning\\\",{code:\\\"W100\\\",line:this.line,character:char}),!this.ignoringLinterErrors&&state.option.maxlen&&state.option.maxlen<this.input.length){var inComment=this.inComment||startsWith.call(inputTrimmed,\\\"//\\\")||startsWith.call(inputTrimmed,\\\"/*\\\"),shouldTriggerError=!inComment||!reg.maxlenException.test(inputTrimmed);shouldTriggerError&&this.trigger(\\\"warning\\\",{code:\\\"W101\\\",line:this.line,character:this.input.length})}return!0},start:function(){this.nextLine()},token:function(){function isReserved(token,isProperty){if(!token.reserved)return!1;var meta=token.meta;if(meta&&meta.isFutureReservedWord&&state.inES5()){if(!meta.es5)return!1;if(meta.strictOnly&&!state.option.strict&&!state.isStrict())return!1;if(isProperty)return!1}return!0}for(var token,checks=asyncTrigger(),create=function(type,value,isProperty,token){var obj;if(\\\"(endline)\\\"!==type&&\\\"(end)\\\"!==type&&(this.prereg=!1),\\\"(punctuator)\\\"===type){switch(value){case\\\".\\\":case\\\")\\\":case\\\"~\\\":case\\\"#\\\":case\\\"]\\\":case\\\"++\\\":case\\\"--\\\":this.prereg=!1;break;default:this.prereg=!0}obj=Object.create(state.syntax[value]||state.syntax[\\\"(error)\\\"])}return\\\"(identifier)\\\"===type&&((\\\"return\\\"===value||\\\"case\\\"===value||\\\"typeof\\\"===value)&&(this.prereg=!0),_.has(state.syntax,value)&&(obj=Object.create(state.syntax[value]||state.syntax[\\\"(error)\\\"]),isReserved(obj,isProperty&&\\\"(identifier)\\\"===type)||(obj=null))),obj||(obj=Object.create(state.syntax[type])),obj.identifier=\\\"(identifier)\\\"===type,obj.type=obj.type||type,obj.value=value,obj.line=this.line,obj.character=this.char,obj.from=this.from,obj.identifier&&token&&(obj.raw_text=token.text||token.value),token&&token.startLine&&token.startLine!==this.line&&(obj.startLine=token.startLine),token&&token.context&&(obj.context=token.context),token&&token.depth&&(obj.depth=token.depth),token&&token.isUnclosed&&(obj.isUnclosed=token.isUnclosed),isProperty&&obj.identifier&&(obj.isProperty=isProperty),obj.check=checks.check,obj}.bind(this);;){if(!this.input.length)return this.nextLine()?create(\\\"(endline)\\\",\\\"\\\"):this.exhausted?null:(this.exhausted=!0,create(\\\"(end)\\\",\\\"\\\"));if(token=this.next(checks))switch(token.type){case Token.StringLiteral:return this.triggerAsync(\\\"String\\\",{line:this.line,\\\"char\\\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value,quote:token.quote},checks,function(){return!0}),create(\\\"(string)\\\",token.value,null,token);case Token.TemplateHead:return this.trigger(\\\"TemplateHead\\\",{line:this.line,\\\"char\\\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\\\"(template)\\\",token.value,null,token);case Token.TemplateMiddle:return this.trigger(\\\"TemplateMiddle\\\",{line:this.line,\\\"char\\\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\\\"(template middle)\\\",token.value,null,token);case Token.TemplateTail:return this.trigger(\\\"TemplateTail\\\",{line:this.line,\\\"char\\\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\\\"(template tail)\\\",token.value,null,token);case Token.NoSubstTemplate:return this.trigger(\\\"NoSubstTemplate\\\",{line:this.line,\\\"char\\\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\\\"(no subst template)\\\",token.value,null,token);case Token.Identifier:this.triggerAsync(\\\"Identifier\\\",{line:this.line,\\\"char\\\":this.char,from:this.form,name:token.value,raw_name:token.text,isProperty:\\\".\\\"===state.tokens.curr.id},checks,function(){return!0});case Token.Keyword:case Token.NullLiteral:case Token.BooleanLiteral:return create(\\\"(identifier)\\\",token.value,\\\".\\\"===state.tokens.curr.id,token);case Token.NumericLiteral:return token.isMalformed&&this.trigger(\\\"warning\\\",{code:\\\"W045\\\",line:this.line,character:this.char,data:[token.value]}),this.triggerAsync(\\\"warning\\\",{code:\\\"W114\\\",line:this.line,character:this.char,data:[\\\"0x-\\\"]},checks,function(){return 16===token.base&&state.jsonMode}),this.triggerAsync(\\\"warning\\\",{code:\\\"W115\\\",line:this.line,character:this.char},checks,function(){return state.isStrict()&&8===token.base&&token.isLegacy}),this.trigger(\\\"Number\\\",{line:this.line,\\\"char\\\":this.char,from:this.from,value:token.value,base:token.base,isMalformed:token.malformed}),create(\\\"(number)\\\",token.value);case Token.RegExp:return create(\\\"(regexp)\\\",token.value);case Token.Comment:if(state.tokens.curr.comment=!0,token.isSpecial)return{id:\\\"(comment)\\\",value:token.value,body:token.body,type:token.commentType,isSpecial:token.isSpecial,line:this.line,character:this.char,from:this.from};break;case\\\"\\\":break;default:return create(\\\"(punctuator)\\\",token.value)}else this.input.length&&(this.trigger(\\\"error\\\",{code:\\\"E024\\\",line:this.line,character:this.char,data:[this.peek()]}),this.input=\\\"\\\")}}},exports.Lexer=Lexer,exports.Context=Context},{\\\"../data/ascii-identifier-data.js\\\":\\\"/node_modules/jshint/data/ascii-identifier-data.js\\\",\\\"../lodash\\\":\\\"/node_modules/jshint/lodash.js\\\",\\\"./reg.js\\\":\\\"/node_modules/jshint/src/reg.js\\\",\\\"./state.js\\\":\\\"/node_modules/jshint/src/state.js\\\",events:\\\"/node_modules/browserify/node_modules/events/events.js\\\"}],\\\"/node_modules/jshint/src/messages.js\\\":[function(_dereq_,module,exports){\\\"use strict\\\";var _=_dereq_(\\\"../lodash\\\"),errors={E001:\\\"Bad option: '{a}'.\\\",E002:\\\"Bad option value.\\\",E003:\\\"Expected a JSON value.\\\",E004:\\\"Input is neither a string nor an array of strings.\\\",E005:\\\"Input is empty.\\\",E006:\\\"Unexpected early end of program.\\\",E007:'Missing \\\"use strict\\\" statement.',E008:\\\"Strict violation.\\\",E009:\\\"Option 'validthis' can't be used in a global scope.\\\",E010:\\\"'with' is not allowed in strict mode.\\\",E011:\\\"'{a}' has already been declared.\\\",E012:\\\"const '{a}' is initialized to 'undefined'.\\\",E013:\\\"Attempting to override '{a}' which is a constant.\\\",E014:\\\"A regular expression literal can be confused with '/='.\\\",E015:\\\"Unclosed regular expression.\\\",E016:\\\"Invalid regular expression.\\\",E017:\\\"Unclosed comment.\\\",E018:\\\"Unbegun comment.\\\",E019:\\\"Unmatched '{a}'.\\\",E020:\\\"Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.\\\",E021:\\\"Expected '{a}' and instead saw '{b}'.\\\",E022:\\\"Line breaking error '{a}'.\\\",E023:\\\"Missing '{a}'.\\\",E024:\\\"Unexpected '{a}'.\\\",E025:\\\"Missing ':' on a case clause.\\\",E026:\\\"Missing '}' to match '{' from line {a}.\\\",E027:\\\"Missing ']' to match '[' from line {a}.\\\",E028:\\\"Illegal comma.\\\",E029:\\\"Unclosed string.\\\",E030:\\\"Expected an identifier and instead saw '{a}'.\\\",E031:\\\"Bad assignment.\\\",E032:\\\"Expected a small integer or 'false' and instead saw '{a}'.\\\",E033:\\\"Expected an operator and instead saw '{a}'.\\\",E034:\\\"get/set are ES5 features.\\\",E035:\\\"Missing property name.\\\",E036:\\\"Expected to see a statement and instead saw a block.\\\",E037:null,E038:null,E039:\\\"Function declarations are not invocable. Wrap the whole function invocation in parens.\\\",E040:\\\"Each value should have its own case label.\\\",E041:\\\"Unrecoverable syntax error.\\\",E042:\\\"Stopping.\\\",E043:\\\"Too many errors.\\\",E044:null,E045:\\\"Invalid for each loop.\\\",E046:\\\"A yield statement shall be within a generator function (with syntax: `function*`)\\\",E047:null,E048:\\\"{a} declaration not directly within block.\\\",E049:\\\"A {a} cannot be named '{b}'.\\\",E050:\\\"Mozilla acequires the yield expression to be parenthesized here.\\\",E051:null,E052:\\\"Unclosed template literal.\\\",E053:\\\"Export declaration must be in global scope.\\\",E054:\\\"Class properties must be methods. Expected '(' but instead saw '{a}'.\\\",E055:\\\"The '{a}' option cannot be set after any executable code.\\\",E056:\\\"'{a}' was used before it was declared, which is illegal for '{b}' variables.\\\",E057:\\\"Invalid meta property: '{a}.{b}'.\\\",E058:\\\"Missing semicolon.\\\"},warnings={W001:\\\"'hasOwnProperty' is a really bad name.\\\",W002:\\\"Value of '{a}' may be overwritten in IE 8 and earlier.\\\",W003:\\\"'{a}' was used before it was defined.\\\",W004:\\\"'{a}' is already defined.\\\",W005:\\\"A dot following a number can be confused with a decimal point.\\\",W006:\\\"Confusing minuses.\\\",W007:\\\"Confusing plusses.\\\",W008:\\\"A leading decimal point can be confused with a dot: '{a}'.\\\",W009:\\\"The array literal notation [] is preferable.\\\",W010:\\\"The object literal notation {} is preferable.\\\",W011:null,W012:null,W013:null,W014:\\\"Bad line breaking before '{a}'.\\\",W015:null,W016:\\\"Unexpected use of '{a}'.\\\",W017:\\\"Bad operand.\\\",W018:\\\"Confusing use of '{a}'.\\\",W019:\\\"Use the isNaN function to compare with NaN.\\\",W020:\\\"Read only.\\\",W021:\\\"Reassignment of '{a}', which is is a {b}. Use 'var' or 'let' to declare bindings that may change.\\\",W022:\\\"Do not assign to the exception parameter.\\\",W023:\\\"Expected an identifier in an assignment and instead saw a function invocation.\\\",W024:\\\"Expected an identifier and instead saw '{a}' (a reserved word).\\\",W025:\\\"Missing name in function declaration.\\\",W026:\\\"Inner functions should be listed at the top of the outer function.\\\",W027:\\\"Unreachable '{a}' after '{b}'.\\\",W028:\\\"Label '{a}' on {b} statement.\\\",W030:\\\"Expected an assignment or function call and instead saw an expression.\\\",W031:\\\"Do not use 'new' for side effects.\\\",W032:\\\"Unnecessary semicolon.\\\",W033:\\\"Missing semicolon.\\\",W034:'Unnecessary directive \\\"{a}\\\".',W035:\\\"Empty block.\\\",W036:\\\"Unexpected /*member '{a}'.\\\",W037:\\\"'{a}' is a statement label.\\\",W038:\\\"'{a}' used out of scope.\\\",W039:\\\"'{a}' is not allowed.\\\",W040:\\\"Possible strict violation.\\\",W041:\\\"Use '{a}' to compare with '{b}'.\\\",W042:\\\"Avoid EOL escaping.\\\",W043:\\\"Bad escaping of EOL. Use option multistr if needed.\\\",W044:\\\"Bad or unnecessary escaping.\\\",W045:\\\"Bad number '{a}'.\\\",W046:\\\"Don't use extra leading zeros '{a}'.\\\",W047:\\\"A trailing decimal point can be confused with a dot: '{a}'.\\\",W048:\\\"Unexpected control character in regular expression.\\\",W049:\\\"Unexpected escaped character '{a}' in regular expression.\\\",W050:\\\"JavaScript URL.\\\",W051:\\\"Variables should not be deleted.\\\",W052:\\\"Unexpected '{a}'.\\\",W053:\\\"Do not use {a} as a constructor.\\\",W054:\\\"The Function constructor is a form of eval.\\\",W055:\\\"A constructor name should start with an uppercase letter.\\\",W056:\\\"Bad constructor.\\\",W057:\\\"Weird construction. Is 'new' necessary?\\\",W058:\\\"Missing '()' invoking a constructor.\\\",W059:\\\"Avoid arguments.{a}.\\\",W060:\\\"document.write can be a form of eval.\\\",W061:\\\"eval can be harmful.\\\",W062:\\\"Wrap an immediate function invocation in parens to assist the reader in understanding that the expression is the result of a function, and not the function itself.\\\",W063:\\\"Math is not a function.\\\",W064:\\\"Missing 'new' prefix when invoking a constructor.\\\",W065:\\\"Missing radix parameter.\\\",W066:\\\"Implied eval. Consider passing a function instead of a string.\\\",W067:\\\"Bad invocation.\\\",W068:\\\"Wrapping non-IIFE function literals in parens is unnecessary.\\\",W069:\\\"['{a}'] is better written in dot notation.\\\",W070:\\\"Extra comma. (it breaks older versions of IE)\\\",W071:\\\"This function has too many statements. ({a})\\\",W072:\\\"This function has too many parameters. ({a})\\\",W073:\\\"Blocks are nested too deeply. ({a})\\\",W074:\\\"This function's cyclomatic complexity is too high. ({a})\\\",W075:\\\"Duplicate {a} '{b}'.\\\",W076:\\\"Unexpected parameter '{a}' in get {b} function.\\\",W077:\\\"Expected a single parameter in set {a} function.\\\",W078:\\\"Setter is defined without getter.\\\",W079:\\\"Redefinition of '{a}'.\\\",W080:\\\"It's not necessary to initialize '{a}' to 'undefined'.\\\",W081:null,W082:\\\"Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.\\\",W083:\\\"Don't make functions within a loop.\\\",W084:\\\"Assignment in conditional expression\\\",W085:\\\"Don't use 'with'.\\\",W086:\\\"Expected a 'break' statement before '{a}'.\\\",W087:\\\"Forgotten 'debugger' statement?\\\",W088:\\\"Creating global 'for' variable. Should be 'for (var {a} ...'.\\\",W089:\\\"The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.\\\",W090:\\\"'{a}' is not a statement label.\\\",W091:null,W093:\\\"Did you mean to return a conditional instead of an assignment?\\\",W094:\\\"Unexpected comma.\\\",W095:\\\"Expected a string and instead saw {a}.\\\",W096:\\\"The '{a}' key may produce unexpected results.\\\",W097:'Use the function form of \\\"use strict\\\".',W098:\\\"'{a}' is defined but never used.\\\",W099:null,W100:\\\"This character may get silently deleted by one or more browsers.\\\",W101:\\\"Line is too long.\\\",W102:null,W103:\\\"The '{a}' property is deprecated.\\\",W104:\\\"'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).\\\",W105:\\\"Unexpected {a} in '{b}'.\\\",W106:\\\"Identifier '{a}' is not in camel case.\\\",W107:\\\"Script URL.\\\",W108:\\\"Strings must use doublequote.\\\",W109:\\\"Strings must use singlequote.\\\",W110:\\\"Mixed double and single quotes.\\\",W112:\\\"Unclosed string.\\\",W113:\\\"Control character in string: {a}.\\\",W114:\\\"Avoid {a}.\\\",W115:\\\"Octal literals are not allowed in strict mode.\\\",W116:\\\"Expected '{a}' and instead saw '{b}'.\\\",W117:\\\"'{a}' is not defined.\\\",W118:\\\"'{a}' is only available in Mozilla JavaScript extensions (use moz option).\\\",W119:\\\"'{a}' is only available in ES{b} (use 'esversion: {b}').\\\",W120:\\\"You might be leaking a variable ({a}) here.\\\",W121:\\\"Extending prototype of native object: '{a}'.\\\",W122:\\\"Invalid typeof value '{a}'\\\",W123:\\\"'{a}' is already defined in outer scope.\\\",W124:\\\"A generator function shall contain a yield statement.\\\",W125:\\\"This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp\\\",W126:\\\"Unnecessary grouping operator.\\\",W127:\\\"Unexpected use of a comma operator.\\\",W128:\\\"Empty array elements acequire elision=true.\\\",W129:\\\"'{a}' is defined in a future version of JavaScript. Use a different variable name to avoid migration issues.\\\",W130:\\\"Invalid element after rest element.\\\",W131:\\\"Invalid parameter after rest parameter.\\\",W132:\\\"`var` declarations are forbidden. Use `let` or `const` instead.\\\",W133:\\\"Invalid for-{a} loop left-hand-side: {b}.\\\",W134:\\\"The '{a}' option is only available when linting ECMAScript {b} code.\\\",W135:\\\"{a} may not be supported by non-browser environments.\\\",W136:\\\"'{a}' must be in function scope.\\\",W137:\\\"Empty destructuring.\\\",W138:\\\"Regular parameters should not come after default parameters.\\\"},info={I001:\\\"Comma warnings can be turned off with 'laxcomma'.\\\",I002:null,I003:\\\"ES5 option is now set per default\\\"};exports.errors={},exports.warnings={},exports.info={},_.each(errors,function(desc,code){exports.errors[code]={code:code,desc:desc}}),_.each(warnings,function(desc,code){exports.warnings[code]={code:code,desc:desc}}),_.each(info,function(desc,code){exports.info[code]={code:code,desc:desc}})},{\\\"../lodash\\\":\\\"/node_modules/jshint/lodash.js\\\"}],\\\"/node_modules/jshint/src/name-stack.js\\\":[function(_dereq_,module){\\\"use strict\\\";function NameStack(){this._stack=[]}Object.defineProperty(NameStack.prototype,\\\"length\\\",{get:function(){return this._stack.length}}),NameStack.prototype.push=function(){this._stack.push(null)},NameStack.prototype.pop=function(){this._stack.pop()},NameStack.prototype.set=function(token){this._stack[this.length-1]=token},NameStack.prototype.infer=function(){var type,nameToken=this._stack[this.length-1],prefix=\\\"\\\";return nameToken&&\\\"class\\\"!==nameToken.type||(nameToken=this._stack[this.length-2]),nameToken?(type=nameToken.type,\\\"(string)\\\"!==type&&\\\"(number)\\\"!==type&&\\\"(identifier)\\\"!==type&&\\\"default\\\"!==type?\\\"(expression)\\\":(nameToken.accessorType&&(prefix=nameToken.accessorType+\\\" \\\"),prefix+nameToken.value)):\\\"(empty)\\\"},module.exports=NameStack},{}],\\\"/node_modules/jshint/src/options.js\\\":[function(_dereq_,module,exports){\\\"use strict\\\";exports.bool={enforcing:{bitwise:!0,freeze:!0,camelcase:!0,curly:!0,eqeqeq:!0,futurehostile:!0,notypeof:!0,es3:!0,es5:!0,forin:!0,funcscope:!0,immed:!0,iterator:!0,newcap:!0,noarg:!0,nocomma:!0,noempty:!0,nonbsp:!0,nonew:!0,undef:!0,singleGroups:!1,varstmt:!1,enforceall:!1},relaxing:{asi:!0,multistr:!0,debug:!0,boss:!0,evil:!0,globalstrict:!0,plusplus:!0,proto:!0,scripturl:!0,sub:!0,supernew:!0,laxbreak:!0,laxcomma:!0,validthis:!0,withstmt:!0,moz:!0,noyield:!0,eqnull:!0,lastsemic:!0,loopfunc:!0,expr:!0,esnext:!0,elision:!0},environments:{mootools:!0,couch:!0,jasmine:!0,jquery:!0,node:!0,qunit:!0,rhino:!0,shelljs:!0,prototypejs:!0,yui:!0,mocha:!0,module:!0,wsh:!0,worker:!0,nonstandard:!0,browser:!0,browserify:!0,devel:!0,dojo:!0,typed:!0,phantom:!0},obsolete:{onecase:!0,regexp:!0,regexdash:!0}},exports.val={maxlen:!1,indent:!1,maxerr:!1,predef:!1,globals:!1,quotmark:!1,scope:!1,maxstatements:!1,maxdepth:!1,maxparams:!1,maxcomplexity:!1,shadow:!1,strict:!0,unused:!0,latedef:!1,ignore:!1,ignoreDelimiters:!1,esversion:5},exports.inverted={bitwise:!0,forin:!0,newcap:!0,plusplus:!0,regexp:!0,undef:!0,eqeqeq:!0,strict:!0},exports.validNames=Object.keys(exports.val).concat(Object.keys(exports.bool.relaxing)).concat(Object.keys(exports.bool.enforcing)).concat(Object.keys(exports.bool.obsolete)).concat(Object.keys(exports.bool.environments)),exports.renamed={eqeq:\\\"eqeqeq\\\",windows:\\\"wsh\\\",sloppy:\\\"strict\\\"},exports.removed={nomen:!0,onevar:!0,passfail:!0,white:!0,gcl:!0,smarttabs:!0,trailing:!0},exports.noenforceall={varstmt:!0,strict:!0}},{}],\\\"/node_modules/jshint/src/reg.js\\\":[function(_dereq_,module,exports){\\\"use strict\\\";exports.unsafeString=/@cc|<\\\\/?|script|\\\\]\\\\s*\\\\]|<\\\\s*!|&lt/i,exports.unsafeChars=/[\\\\u0000-\\\\u001f\\\\u007f-\\\\u009f\\\\u00ad\\\\u0600-\\\\u0604\\\\u070f\\\\u17b4\\\\u17b5\\\\u200c-\\\\u200f\\\\u2028-\\\\u202f\\\\u2060-\\\\u206f\\\\ufeff\\\\ufff0-\\\\uffff]/,exports.needEsc=/[\\\\u0000-\\\\u001f&<\\\"\\\\/\\\\\\\\\\\\u007f-\\\\u009f\\\\u00ad\\\\u0600-\\\\u0604\\\\u070f\\\\u17b4\\\\u17b5\\\\u200c-\\\\u200f\\\\u2028-\\\\u202f\\\\u2060-\\\\u206f\\\\ufeff\\\\ufff0-\\\\uffff]/,exports.needEscGlobal=/[\\\\u0000-\\\\u001f&<\\\"\\\\/\\\\\\\\\\\\u007f-\\\\u009f\\\\u00ad\\\\u0600-\\\\u0604\\\\u070f\\\\u17b4\\\\u17b5\\\\u200c-\\\\u200f\\\\u2028-\\\\u202f\\\\u2060-\\\\u206f\\\\ufeff\\\\ufff0-\\\\uffff]/g,exports.starSlash=/\\\\*\\\\//,exports.identifier=/^([a-zA-Z_$][a-zA-Z0-9_$]*)$/,exports.javascriptURL=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\\\s*:/i,exports.fallsThrough=/^\\\\s*falls?\\\\sthrough\\\\s*$/,exports.maxlenException=/^(?:(?:\\\\/\\\\/|\\\\/\\\\*|\\\\*) ?)?[^ ]+$/},{}],\\\"/node_modules/jshint/src/scope-manager.js\\\":[function(_dereq_,module){\\\"use strict\\\";var _=_dereq_(\\\"../lodash\\\"),events=_dereq_(\\\"events\\\"),marker={},scopeManager=function(state,predefined,exported,declared){function _newScope(type){_current={\\\"(labels)\\\":Object.create(null),\\\"(usages)\\\":Object.create(null),\\\"(breakLabels)\\\":Object.create(null),\\\"(parent)\\\":_current,\\\"(type)\\\":type,\\\"(params)\\\":\\\"functionparams\\\"===type||\\\"catchparams\\\"===type?[]:null},_scopeStack.push(_current)}function warning(code,token){emitter.emit(\\\"warning\\\",{code:code,token:token,data:_.slice(arguments,2)})}function error(code,token){emitter.emit(\\\"warning\\\",{code:code,token:token,data:_.slice(arguments,2)})}function _setupUsages(labelName){_current[\\\"(usages)\\\"][labelName]||(_current[\\\"(usages)\\\"][labelName]={\\\"(modified)\\\":[],\\\"(reassigned)\\\":[],\\\"(tokens)\\\":[]})}function _checkForUnused(){if(\\\"functionparams\\\"===_current[\\\"(type)\\\"])return _checkParams(),void 0;var curentLabels=_current[\\\"(labels)\\\"];for(var labelName in curentLabels)curentLabels[labelName]&&\\\"exception\\\"!==curentLabels[labelName][\\\"(type)\\\"]&&curentLabels[labelName][\\\"(unused)\\\"]&&_warnUnused(labelName,curentLabels[labelName][\\\"(token)\\\"],\\\"var\\\")}function _checkParams(){var params=_current[\\\"(params)\\\"];if(params)for(var unused_opt,param=params.pop();param;){var label=_current[\\\"(labels)\\\"][param];if(unused_opt=_getUnusedOption(state.funct[\\\"(unusedOption)\\\"]),\\\"undefined\\\"===param)return;if(label[\\\"(unused)\\\"])_warnUnused(param,label[\\\"(token)\\\"],\\\"param\\\",state.funct[\\\"(unusedOption)\\\"]);else if(\\\"last-param\\\"===unused_opt)return;param=params.pop()}}function _getLabel(labelName){for(var i=_scopeStack.length-1;i>=0;--i){var scopeLabels=_scopeStack[i][\\\"(labels)\\\"];if(scopeLabels[labelName])return scopeLabels}}function usedSoFarInCurrentFunction(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current[\\\"(usages)\\\"][labelName])return current[\\\"(usages)\\\"][labelName];if(current===_currentFunctBody)break}return!1}function _checkOuterShadow(labelName,token){if(\\\"outer\\\"===state.option.shadow)for(var isGlobal=\\\"global\\\"===_currentFunctBody[\\\"(type)\\\"],isNewFunction=\\\"functionparams\\\"===_current[\\\"(type)\\\"],outsideCurrentFunction=!isGlobal,i=0;_scopeStack.length>i;i++){var stackItem=_scopeStack[i];isNewFunction||_scopeStack[i+1]!==_currentFunctBody||(outsideCurrentFunction=!1),outsideCurrentFunction&&stackItem[\\\"(labels)\\\"][labelName]&&warning(\\\"W123\\\",token,labelName),stackItem[\\\"(breakLabels)\\\"][labelName]&&warning(\\\"W123\\\",token,labelName)}}function _latedefWarning(type,labelName,token){state.option.latedef&&(state.option.latedef===!0&&\\\"function\\\"===type||\\\"function\\\"!==type)&&warning(\\\"W003\\\",token,labelName)}var _current,_scopeStack=[];_newScope(\\\"global\\\"),_current[\\\"(predefined)\\\"]=predefined;var _currentFunctBody=_current,usedPredefinedAndGlobals=Object.create(null),impliedGlobals=Object.create(null),unuseds=[],emitter=new events.EventEmitter,_getUnusedOption=function(unused_opt){return void 0===unused_opt&&(unused_opt=state.option.unused),unused_opt===!0&&(unused_opt=\\\"last-param\\\"),unused_opt},_warnUnused=function(name,tkn,type,unused_opt){var line=tkn.line,chr=tkn.from,raw_name=tkn.raw_text||name;unused_opt=_getUnusedOption(unused_opt);var warnable_types={vars:[\\\"var\\\"],\\\"last-param\\\":[\\\"var\\\",\\\"param\\\"],strict:[\\\"var\\\",\\\"param\\\",\\\"last-param\\\"]};unused_opt&&warnable_types[unused_opt]&&-1!==warnable_types[unused_opt].indexOf(type)&&warning(\\\"W098\\\",{line:line,from:chr},raw_name),(unused_opt||\\\"var\\\"===type)&&unuseds.push({name:name,line:line,character:chr})},scopeManagerInst={on:function(names,listener){names.split(\\\" \\\").forEach(function(name){emitter.on(name,listener)})},isPredefined:function(labelName){return!this.has(labelName)&&_.has(_scopeStack[0][\\\"(predefined)\\\"],labelName)},stack:function(type){var previousScope=_current;_newScope(type),type||\\\"functionparams\\\"!==previousScope[\\\"(type)\\\"]||(_current[\\\"(isFuncBody)\\\"]=!0,_current[\\\"(context)\\\"]=_currentFunctBody,_currentFunctBody=_current)},unstack:function(){var i,j,subScope=_scopeStack.length>1?_scopeStack[_scopeStack.length-2]:null,isUnstackingFunctionBody=_current===_currentFunctBody,isUnstackingFunctionParams=\\\"functionparams\\\"===_current[\\\"(type)\\\"],isUnstackingFunctionOuter=\\\"functionouter\\\"===_current[\\\"(type)\\\"],currentUsages=_current[\\\"(usages)\\\"],currentLabels=_current[\\\"(labels)\\\"],usedLabelNameList=Object.keys(currentUsages);for(currentUsages.__proto__&&-1===usedLabelNameList.indexOf(\\\"__proto__\\\")&&usedLabelNameList.push(\\\"__proto__\\\"),i=0;usedLabelNameList.length>i;i++){var usedLabelName=usedLabelNameList[i],usage=currentUsages[usedLabelName],usedLabel=currentLabels[usedLabelName];if(usedLabel){var usedLabelType=usedLabel[\\\"(type)\\\"];if(usedLabel[\\\"(useOutsideOfScope)\\\"]&&!state.option.funcscope){var usedTokens=usage[\\\"(tokens)\\\"];if(usedTokens)for(j=0;usedTokens.length>j;j++)usedLabel[\\\"(function)\\\"]===usedTokens[j][\\\"(function)\\\"]&&error(\\\"W038\\\",usedTokens[j],usedLabelName)}if(_current[\\\"(labels)\\\"][usedLabelName][\\\"(unused)\\\"]=!1,\\\"const\\\"===usedLabelType&&usage[\\\"(modified)\\\"])for(j=0;usage[\\\"(modified)\\\"].length>j;j++)error(\\\"E013\\\",usage[\\\"(modified)\\\"][j],usedLabelName);if((\\\"function\\\"===usedLabelType||\\\"class\\\"===usedLabelType)&&usage[\\\"(reassigned)\\\"])for(j=0;usage[\\\"(reassigned)\\\"].length>j;j++)error(\\\"W021\\\",usage[\\\"(reassigned)\\\"][j],usedLabelName,usedLabelType)}else if(isUnstackingFunctionOuter&&(state.funct[\\\"(isCapturing)\\\"]=!0),subScope)if(subScope[\\\"(usages)\\\"][usedLabelName]){var subScopeUsage=subScope[\\\"(usages)\\\"][usedLabelName];subScopeUsage[\\\"(modified)\\\"]=subScopeUsage[\\\"(modified)\\\"].concat(usage[\\\"(modified)\\\"]),subScopeUsage[\\\"(tokens)\\\"]=subScopeUsage[\\\"(tokens)\\\"].concat(usage[\\\"(tokens)\\\"]),subScopeUsage[\\\"(reassigned)\\\"]=subScopeUsage[\\\"(reassigned)\\\"].concat(usage[\\\"(reassigned)\\\"]),subScopeUsage[\\\"(onlyUsedSubFunction)\\\"]=!1}else subScope[\\\"(usages)\\\"][usedLabelName]=usage,isUnstackingFunctionBody&&(subScope[\\\"(usages)\\\"][usedLabelName][\\\"(onlyUsedSubFunction)\\\"]=!0);else if(\\\"boolean\\\"==typeof _current[\\\"(predefined)\\\"][usedLabelName]){if(delete declared[usedLabelName],usedPredefinedAndGlobals[usedLabelName]=marker,_current[\\\"(predefined)\\\"][usedLabelName]===!1&&usage[\\\"(reassigned)\\\"])for(j=0;usage[\\\"(reassigned)\\\"].length>j;j++)warning(\\\"W020\\\",usage[\\\"(reassigned)\\\"][j])}else if(usage[\\\"(tokens)\\\"])for(j=0;usage[\\\"(tokens)\\\"].length>j;j++){var undefinedToken=usage[\\\"(tokens)\\\"][j];undefinedToken.forgiveUndef||(state.option.undef&&!undefinedToken.ignoreUndef&&warning(\\\"W117\\\",undefinedToken,usedLabelName),impliedGlobals[usedLabelName]?impliedGlobals[usedLabelName].line.push(undefinedToken.line):impliedGlobals[usedLabelName]={name:usedLabelName,line:[undefinedToken.line]})}}if(subScope||Object.keys(declared).forEach(function(labelNotUsed){_warnUnused(labelNotUsed,declared[labelNotUsed],\\\"var\\\")}),subScope&&!isUnstackingFunctionBody&&!isUnstackingFunctionParams&&!isUnstackingFunctionOuter){var labelNames=Object.keys(currentLabels);for(i=0;labelNames.length>i;i++){var defLabelName=labelNames[i];currentLabels[defLabelName][\\\"(blockscoped)\\\"]||\\\"exception\\\"===currentLabels[defLabelName][\\\"(type)\\\"]||this.funct.has(defLabelName,{excludeCurrent:!0})||(subScope[\\\"(labels)\\\"][defLabelName]=currentLabels[defLabelName],\\\"global\\\"!==_currentFunctBody[\\\"(type)\\\"]&&(subScope[\\\"(labels)\\\"][defLabelName][\\\"(useOutsideOfScope)\\\"]=!0),delete currentLabels[defLabelName])}}_checkForUnused(),_scopeStack.pop(),isUnstackingFunctionBody&&(_currentFunctBody=_scopeStack[_.findLastIndex(_scopeStack,function(scope){return scope[\\\"(isFuncBody)\\\"]||\\\"global\\\"===scope[\\\"(type)\\\"]})]),_current=subScope},addParam:function(labelName,token,type){if(type=type||\\\"param\\\",\\\"exception\\\"===type){var previouslyDefinedLabelType=this.funct.labeltype(labelName);previouslyDefinedLabelType&&\\\"exception\\\"!==previouslyDefinedLabelType&&(state.option.node||warning(\\\"W002\\\",state.tokens.next,labelName))}if(_.has(_current[\\\"(labels)\\\"],labelName)?_current[\\\"(labels)\\\"][labelName].duplicated=!0:(_checkOuterShadow(labelName,token,type),_current[\\\"(labels)\\\"][labelName]={\\\"(type)\\\":type,\\\"(token)\\\":token,\\\"(unused)\\\":!0},_current[\\\"(params)\\\"].push(labelName)),_.has(_current[\\\"(usages)\\\"],labelName)){var usage=_current[\\\"(usages)\\\"][labelName];usage[\\\"(onlyUsedSubFunction)\\\"]?_latedefWarning(type,labelName,token):warning(\\\"E056\\\",token,labelName,type)}},validateParams:function(){if(\\\"global\\\"!==_currentFunctBody[\\\"(type)\\\"]){var isStrict=state.isStrict(),currentFunctParamScope=_currentFunctBody[\\\"(parent)\\\"];currentFunctParamScope[\\\"(params)\\\"]&&currentFunctParamScope[\\\"(params)\\\"].forEach(function(labelName){var label=currentFunctParamScope[\\\"(labels)\\\"][labelName];label&&label.duplicated&&(isStrict?warning(\\\"E011\\\",label[\\\"(token)\\\"],labelName):state.option.shadow!==!0&&warning(\\\"W004\\\",label[\\\"(token)\\\"],labelName))})}},getUsedOrDefinedGlobals:function(){var list=Object.keys(usedPredefinedAndGlobals);return usedPredefinedAndGlobals.__proto__===marker&&-1===list.indexOf(\\\"__proto__\\\")&&list.push(\\\"__proto__\\\"),list},getImpliedGlobals:function(){var values=_.values(impliedGlobals),hasProto=!1;return impliedGlobals.__proto__&&(hasProto=values.some(function(value){return\\\"__proto__\\\"===value.name}),hasProto||values.push(impliedGlobals.__proto__)),values},getUnuseds:function(){return unuseds},has:function(labelName){return Boolean(_getLabel(labelName))},labeltype:function(labelName){var scopeLabels=_getLabel(labelName);return scopeLabels?scopeLabels[labelName][\\\"(type)\\\"]:null},addExported:function(labelName){var globalLabels=_scopeStack[0][\\\"(labels)\\\"];if(_.has(declared,labelName))delete declared[labelName];else if(_.has(globalLabels,labelName))globalLabels[labelName][\\\"(unused)\\\"]=!1;else{for(var i=1;_scopeStack.length>i;i++){var scope=_scopeStack[i];if(scope[\\\"(type)\\\"])break;if(_.has(scope[\\\"(labels)\\\"],labelName)&&!scope[\\\"(labels)\\\"][labelName][\\\"(blockscoped)\\\"])return scope[\\\"(labels)\\\"][labelName][\\\"(unused)\\\"]=!1,void 0}exported[labelName]=!0}},setExported:function(labelName,token){this.block.use(labelName,token)\\n},addlabel:function(labelName,opts){var type=opts.type,token=opts.token,isblockscoped=\\\"let\\\"===type||\\\"const\\\"===type||\\\"class\\\"===type,isexported=\\\"global\\\"===(isblockscoped?_current:_currentFunctBody)[\\\"(type)\\\"]&&_.has(exported,labelName);if(_checkOuterShadow(labelName,token,type),isblockscoped){var declaredInCurrentScope=_current[\\\"(labels)\\\"][labelName];if(declaredInCurrentScope||_current!==_currentFunctBody||\\\"global\\\"===_current[\\\"(type)\\\"]||(declaredInCurrentScope=!!_currentFunctBody[\\\"(parent)\\\"][\\\"(labels)\\\"][labelName]),!declaredInCurrentScope&&_current[\\\"(usages)\\\"][labelName]){var usage=_current[\\\"(usages)\\\"][labelName];usage[\\\"(onlyUsedSubFunction)\\\"]?_latedefWarning(type,labelName,token):warning(\\\"E056\\\",token,labelName,type)}declaredInCurrentScope?warning(\\\"E011\\\",token,labelName):\\\"outer\\\"===state.option.shadow&&scopeManagerInst.funct.has(labelName)&&warning(\\\"W004\\\",token,labelName),scopeManagerInst.block.add(labelName,type,token,!isexported)}else{var declaredInCurrentFunctionScope=scopeManagerInst.funct.has(labelName);!declaredInCurrentFunctionScope&&usedSoFarInCurrentFunction(labelName)&&_latedefWarning(type,labelName,token),scopeManagerInst.funct.has(labelName,{onlyBlockscoped:!0})?warning(\\\"E011\\\",token,labelName):state.option.shadow!==!0&&declaredInCurrentFunctionScope&&\\\"__proto__\\\"!==labelName&&\\\"global\\\"!==_currentFunctBody[\\\"(type)\\\"]&&warning(\\\"W004\\\",token,labelName),scopeManagerInst.funct.add(labelName,type,token,!isexported),\\\"global\\\"===_currentFunctBody[\\\"(type)\\\"]&&(usedPredefinedAndGlobals[labelName]=marker)}},funct:{labeltype:function(labelName,options){for(var onlyBlockscoped=options&&options.onlyBlockscoped,excludeParams=options&&options.excludeParams,currentScopeIndex=_scopeStack.length-(options&&options.excludeCurrent?2:1),i=currentScopeIndex;i>=0;i--){var current=_scopeStack[i];if(current[\\\"(labels)\\\"][labelName]&&(!onlyBlockscoped||current[\\\"(labels)\\\"][labelName][\\\"(blockscoped)\\\"]))return current[\\\"(labels)\\\"][labelName][\\\"(type)\\\"];var scopeCheck=excludeParams?_scopeStack[i-1]:current;if(scopeCheck&&\\\"functionparams\\\"===scopeCheck[\\\"(type)\\\"])return null}return null},hasBreakLabel:function(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current[\\\"(breakLabels)\\\"][labelName])return!0;if(\\\"functionparams\\\"===current[\\\"(type)\\\"])return!1}return!1},has:function(labelName,options){return Boolean(this.labeltype(labelName,options))},add:function(labelName,type,tok,unused){_current[\\\"(labels)\\\"][labelName]={\\\"(type)\\\":type,\\\"(token)\\\":tok,\\\"(blockscoped)\\\":!1,\\\"(function)\\\":_currentFunctBody,\\\"(unused)\\\":unused}}},block:{isGlobal:function(){return\\\"global\\\"===_current[\\\"(type)\\\"]},use:function(labelName,token){var paramScope=_currentFunctBody[\\\"(parent)\\\"];paramScope&&paramScope[\\\"(labels)\\\"][labelName]&&\\\"param\\\"===paramScope[\\\"(labels)\\\"][labelName][\\\"(type)\\\"]&&(scopeManagerInst.funct.has(labelName,{excludeParams:!0,onlyBlockscoped:!0})||(paramScope[\\\"(labels)\\\"][labelName][\\\"(unused)\\\"]=!1)),token&&(state.ignored.W117||state.option.undef===!1)&&(token.ignoreUndef=!0),_setupUsages(labelName),token&&(token[\\\"(function)\\\"]=_currentFunctBody,_current[\\\"(usages)\\\"][labelName][\\\"(tokens)\\\"].push(token))},reassign:function(labelName,token){this.modify(labelName,token),_current[\\\"(usages)\\\"][labelName][\\\"(reassigned)\\\"].push(token)},modify:function(labelName,token){_setupUsages(labelName),_current[\\\"(usages)\\\"][labelName][\\\"(modified)\\\"].push(token)},add:function(labelName,type,tok,unused){_current[\\\"(labels)\\\"][labelName]={\\\"(type)\\\":type,\\\"(token)\\\":tok,\\\"(blockscoped)\\\":!0,\\\"(unused)\\\":unused}},addBreakLabel:function(labelName,opts){var token=opts.token;scopeManagerInst.funct.hasBreakLabel(labelName)?warning(\\\"E011\\\",token,labelName):\\\"outer\\\"===state.option.shadow&&(scopeManagerInst.funct.has(labelName)?warning(\\\"W004\\\",token,labelName):_checkOuterShadow(labelName,token)),_current[\\\"(breakLabels)\\\"][labelName]=token}}};return scopeManagerInst};module.exports=scopeManager},{\\\"../lodash\\\":\\\"/node_modules/jshint/lodash.js\\\",events:\\\"/node_modules/browserify/node_modules/events/events.js\\\"}],\\\"/node_modules/jshint/src/state.js\\\":[function(_dereq_,module,exports){\\\"use strict\\\";var NameStack=_dereq_(\\\"./name-stack.js\\\"),state={syntax:{},isStrict:function(){return this.directive[\\\"use strict\\\"]||this.inClassBody||this.option.module||\\\"implied\\\"===this.option.strict},inMoz:function(){return this.option.moz},inES6:function(){return this.option.moz||this.option.esversion>=6},inES5:function(strict){return strict?!(this.option.esversion&&5!==this.option.esversion||this.option.moz):!this.option.esversion||this.option.esversion>=5||this.option.moz},reset:function(){this.tokens={prev:null,next:null,curr:null},this.option={},this.funct=null,this.ignored={},this.directive={},this.jsonMode=!1,this.jsonWarnings=[],this.lines=[],this.tab=\\\"\\\",this.cache={},this.ignoredLines={},this.forinifcheckneeded=!1,this.nameStack=new NameStack,this.inClassBody=!1}};exports.state=state},{\\\"./name-stack.js\\\":\\\"/node_modules/jshint/src/name-stack.js\\\"}],\\\"/node_modules/jshint/src/style.js\\\":[function(_dereq_,module,exports){\\\"use strict\\\";exports.register=function(linter){linter.on(\\\"Identifier\\\",function(data){linter.getOption(\\\"proto\\\")||\\\"__proto__\\\"===data.name&&linter.warn(\\\"W103\\\",{line:data.line,\\\"char\\\":data.char,data:[data.name,\\\"6\\\"]})}),linter.on(\\\"Identifier\\\",function(data){linter.getOption(\\\"iterator\\\")||\\\"__iterator__\\\"===data.name&&linter.warn(\\\"W103\\\",{line:data.line,\\\"char\\\":data.char,data:[data.name]})}),linter.on(\\\"Identifier\\\",function(data){linter.getOption(\\\"camelcase\\\")&&data.name.replace(/^_+|_+$/g,\\\"\\\").indexOf(\\\"_\\\")>-1&&!data.name.match(/^[A-Z0-9_]*$/)&&linter.warn(\\\"W106\\\",{line:data.line,\\\"char\\\":data.from,data:[data.name]})}),linter.on(\\\"String\\\",function(data){var code,quotmark=linter.getOption(\\\"quotmark\\\");quotmark&&(\\\"single\\\"===quotmark&&\\\"'\\\"!==data.quote&&(code=\\\"W109\\\"),\\\"double\\\"===quotmark&&'\\\"'!==data.quote&&(code=\\\"W108\\\"),quotmark===!0&&(linter.getCache(\\\"quotmark\\\")||linter.setCache(\\\"quotmark\\\",data.quote),linter.getCache(\\\"quotmark\\\")!==data.quote&&(code=\\\"W110\\\")),code&&linter.warn(code,{line:data.line,\\\"char\\\":data.char}))}),linter.on(\\\"Number\\\",function(data){\\\".\\\"===data.value.charAt(0)&&linter.warn(\\\"W008\\\",{line:data.line,\\\"char\\\":data.char,data:[data.value]}),\\\".\\\"===data.value.substr(data.value.length-1)&&linter.warn(\\\"W047\\\",{line:data.line,\\\"char\\\":data.char,data:[data.value]}),/^00+/.test(data.value)&&linter.warn(\\\"W046\\\",{line:data.line,\\\"char\\\":data.char,data:[data.value]})}),linter.on(\\\"String\\\",function(data){var re=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\\\s*:/i;linter.getOption(\\\"scripturl\\\")||re.test(data.value)&&linter.warn(\\\"W107\\\",{line:data.line,\\\"char\\\":data.char})})}},{}],\\\"/node_modules/jshint/src/vars.js\\\":[function(_dereq_,module,exports){\\\"use strict\\\";exports.reservedVars={arguments:!1,NaN:!1},exports.ecmaIdentifiers={3:{Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},5:{JSON:!1},6:{Map:!1,Promise:!1,Proxy:!1,Reflect:!1,Set:!1,Symbol:!1,WeakMap:!1,WeakSet:!1}},exports.browser={Audio:!1,Blob:!1,addEventListener:!1,applicationCache:!1,atob:!1,blur:!1,btoa:!1,cancelAnimationFrame:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,CSS:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,Comment:!1,CustomEvent:!1,DOMParser:!1,defaultStatus:!1,Document:!1,document:!1,DocumentFragment:!1,Element:!1,ElementTimeControl:!1,Event:!1,event:!1,fetch:!1,FileReader:!1,FormData:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,HTMLAnchorElement:!1,HTMLBaseElement:!1,HTMLBlockquoteElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLIsIndexElement:!1,HTMLLabelElement:!1,HTMLLayerElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPreElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTitleElement:!1,HTMLUListElement:!1,HTMLVideoElement:!1,history:!1,Image:!1,Intl:!1,length:!1,localStorage:!1,location:!1,matchMedia:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationObserver:!1,name:!1,Node:!1,NodeFilter:!1,NodeList:!1,Notification:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,performance:!1,print:!1,Range:!1,requestAnimationFrame:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,SharedWorker:!1,status:!1,SVGAElement:!1,SVGAltGlyphDefElement:!1,SVGAltGlyphElement:!1,SVGAltGlyphItemElement:!1,SVGAngle:!1,SVGAnimateColorElement:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPathData:!1,SVGAnimatedPoints:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimationElement:!1,SVGCSSRule:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGColor:!1,SVGColorProfileElement:!1,SVGColorProfileRule:!1,SVGComponentTransferFunctionElement:!1,SVGCursorElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDocument:!1,SVGElement:!1,SVGElementInstance:!1,SVGElementInstanceList:!1,SVGEllipseElement:!1,SVGExternalResourcesRequired:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGFilterPrimitiveStandardAttributes:!1,SVGFitToViewBox:!1,SVGFontElement:!1,SVGFontFaceElement:!1,SVGFontFaceFormatElement:!1,SVGFontFaceNameElement:!1,SVGFontFaceSrcElement:!1,SVGFontFaceUriElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGlyphElement:!1,SVGGlyphRefElement:!1,SVGGradientElement:!1,SVGHKernElement:!1,SVGICCColor:!1,SVGImageElement:!1,SVGLangSpace:!1,SVGLength:!1,SVGLengthList:!1,SVGLineElement:!1,SVGLinearGradientElement:!1,SVGLocatable:!1,SVGMPathElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMissingGlyphElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPaint:!1,SVGPathElement:!1,SVGPathSeg:!1,SVGPathSegArcAbs:!1,SVGPathSegArcRel:!1,SVGPathSegClosePath:!1,SVGPathSegCurvetoCubicAbs:!1,SVGPathSegCurvetoCubicRel:!1,SVGPathSegCurvetoCubicSmoothAbs:!1,SVGPathSegCurvetoCubicSmoothRel:!1,SVGPathSegCurvetoQuadraticAbs:!1,SVGPathSegCurvetoQuadraticRel:!1,SVGPathSegCurvetoQuadraticSmoothAbs:!1,SVGPathSegCurvetoQuadraticSmoothRel:!1,SVGPathSegLinetoAbs:!1,SVGPathSegLinetoHorizontalAbs:!1,SVGPathSegLinetoHorizontalRel:!1,SVGPathSegLinetoRel:!1,SVGPathSegLinetoVerticalAbs:!1,SVGPathSegLinetoVerticalRel:!1,SVGPathSegList:!1,SVGPathSegMovetoAbs:!1,SVGPathSegMovetoRel:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGRenderingIntent:!1,SVGSVGElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStylable:!1,SVGStyleElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTRefElement:!1,SVGTSpanElement:!1,SVGTests:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTransformable:!1,SVGURIReference:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGVKernElement:!1,SVGViewElement:!1,SVGViewSpec:!1,SVGZoomAndPan:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TimeEvent:!1,top:!1,URL:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLTexture:!1,WebGLUniformLocation:!1,WebSocket:!1,window:!1,Window:!1,Worker:!1,XDomainRequest:!1,XMLHttpRequest:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},exports.devel={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},exports.worker={importScripts:!0,postMessage:!0,self:!0,FileReaderSync:!0},exports.nonstandard={escape:!1,unescape:!1},exports.couch={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1,provides:!1},exports.node={__filename:!1,__dirname:!1,GLOBAL:!1,global:!1,module:!1,acequire:!1,Buffer:!0,console:!0,exports:!0,process:!0,setTimeout:!0,clearTimeout:!0,setInterval:!0,clearInterval:!0,setImmediate:!0,clearImmediate:!0},exports.browserify={__filename:!1,__dirname:!1,global:!1,module:!1,acequire:!1,Buffer:!0,exports:!0,process:!0},exports.phantom={phantom:!0,acequire:!0,WebPage:!0,console:!0,exports:!0},exports.qunit={asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,\\\"throws\\\":!1},exports.rhino={defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},exports.shelljs={target:!1,echo:!1,exit:!1,cd:!1,pwd:!1,ls:!1,find:!1,cp:!1,rm:!1,mv:!1,mkdir:!1,test:!1,cat:!1,sed:!1,grep:!1,which:!1,dirs:!1,pushd:!1,popd:!1,env:!1,exec:!1,chmod:!1,config:!1,error:!1,tempdir:!1},exports.typed={ArrayBuffer:!1,ArrayBufferView:!1,DataView:!1,Float32Array:!1,Float64Array:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1},exports.wsh={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0,XDomainRequest:!0},exports.dojo={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},exports.jquery={$:!1,jQuery:!1},exports.mootools={$:!1,$$:!1,Asset:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMEvent:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,IFrame:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},exports.prototypejs={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},exports.yui={YUI:!1,Y:!1,YUI_config:!1},exports.mocha={mocha:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,context:!1,xcontext:!1,before:!1,after:!1,beforeEach:!1,afterEach:!1,suite:!1,test:!1,setup:!1,teardown:!1,suiteSetup:!1,suiteTeardown:!1},exports.jasmine={jasmine:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,beforeEach:!1,afterEach:!1,setFixtures:!1,loadFixtures:!1,spyOn:!1,expect:!1,runs:!1,waitsFor:!1,waits:!1,beforeAll:!1,afterAll:!1,fail:!1,fdescribe:!1,fit:!1,pending:!1}},{}]},{},[\\\"/node_modules/jshint/src/jshint.js\\\"])}),ace.define(\\\"ace/mode/javascript_worker\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/worker/mirror\\\",\\\"ace/mode/javascript/jshint\\\"],function(acequire,exports,module){\\\"use strict\\\";function startRegex(arr){return RegExp(\\\"^(\\\"+arr.join(\\\"|\\\")+\\\")\\\")}var oop=acequire(\\\"../lib/oop\\\"),Mirror=acequire(\\\"../worker/mirror\\\").Mirror,lint=acequire(\\\"./javascript/jshint\\\").JSHINT,disabledWarningsRe=startRegex([\\\"Bad for in variable '(.+)'.\\\",'Missing \\\"use strict\\\"']),errorsRe=startRegex([\\\"Unexpected\\\",\\\"Expected \\\",\\\"Confusing (plus|minus)\\\",\\\"\\\\\\\\{a\\\\\\\\} unterminated regular expression\\\",\\\"Unclosed \\\",\\\"Unmatched \\\",\\\"Unbegun comment\\\",\\\"Bad invocation\\\",\\\"Missing space after\\\",\\\"Missing operator at\\\"]),infoRe=startRegex([\\\"Expected an assignment\\\",\\\"Bad escapement of EOL\\\",\\\"Unexpected comma\\\",\\\"Unexpected space\\\",\\\"Missing radix parameter.\\\",\\\"A leading decimal point can\\\",\\\"\\\\\\\\['{a}'\\\\\\\\] is better written in dot notation.\\\",\\\"'{a}' used out of scope\\\"]),JavaScriptWorker=exports.JavaScriptWorker=function(sender){Mirror.call(this,sender),this.setTimeout(500),this.setOptions()};oop.inherits(JavaScriptWorker,Mirror),function(){this.setOptions=function(options){this.options=options||{esnext:!0,moz:!0,devel:!0,browser:!0,node:!0,laxcomma:!0,laxbreak:!0,lastsemic:!0,onevar:!1,passfail:!1,maxerr:100,expr:!0,multistr:!0,globalstrict:!0},this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.changeOptions=function(newOptions){oop.mixin(this.options,newOptions),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.isValidJS=function(str){try{eval(\\\"throw 0;\\\"+str)}catch(e){if(0===e)return!0}return!1},this.onUpdate=function(){var value=this.doc.getValue();if(value=value.replace(/^#!.*\\\\n/,\\\"\\\\n\\\"),!value)return this.sender.emit(\\\"annotate\\\",[]);var errors=[],maxErrorLevel=this.isValidJS(value)?\\\"warning\\\":\\\"error\\\";lint(value,this.options,this.options.globals);for(var results=lint.errors,errorAdded=!1,i=0;results.length>i;i++){var error=results[i];if(error){var raw=error.raw,type=\\\"warning\\\";if(\\\"Missing semicolon.\\\"==raw){var str=error.evidence.substr(error.character);str=str.charAt(str.search(/\\\\S/)),\\\"error\\\"==maxErrorLevel&&str&&/[\\\\w\\\\d{(['\\\"]/.test(str)?(error.reason='Missing \\\";\\\" before statement',type=\\\"error\\\"):type=\\\"info\\\"}else{if(disabledWarningsRe.test(raw))continue;infoRe.test(raw)?type=\\\"info\\\":errorsRe.test(raw)?(errorAdded=!0,type=maxErrorLevel):\\\"'{a}' is not defined.\\\"==raw?type=\\\"warning\\\":\\\"'{a}' is defined but never used.\\\"==raw&&(type=\\\"info\\\")}errors.push({row:error.line-1,column:error.character-1,text:error.reason,type:type,raw:raw})}}this.sender.emit(\\\"annotate\\\",errors)}}.call(JavaScriptWorker.prototype)}),ace.define(\\\"ace/lib/es5-shim\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,\\\"sentinel\\\",{}),\\\"sentinel\\\"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if(\\\"function\\\"!=typeof target)throw new TypeError(\\\"Function.prototype.bind called on incompatible \\\"+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,\\\"__defineGetter__\\\"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,\\\"XXX\\\"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return\\\"[object Array]\\\"==_toString(obj)});var boxedString=Object(\\\"a\\\"),splitString=\\\"a\\\"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,thisp=arguments[1],i=-1,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,result=[],thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");if(!length&&1==arguments.length)throw new TypeError(\\\"reduce of empty array with no initial value\\\");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError(\\\"reduce of empty array with no initial value\\\")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");if(!length&&1==arguments.length)throw new TypeError(\\\"reduceRight of empty array with no initial value\\\");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError(\\\"reduceRight of empty array with no initial value\\\")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT=\\\"Object.getOwnPropertyDescriptor called on a non-object: \\\";Object.getOwnPropertyDescriptor=function(object,property){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if(\\\"object\\\"!=typeof prototype)throw new TypeError(\\\"typeof prototype[\\\"+typeof prototype+\\\"] != 'object'\\\");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom=\\\"undefined\\\"==typeof document||doesDefinePropertyWork(document.createElement(\\\"div\\\"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR=\\\"Property description must be an object: \\\",ERR_NON_OBJECT_TARGET=\\\"Object.defineProperty called on non-object: \\\",ERR_ACCESSORS_NOT_SUPPORTED=\\\"getters & setters can not be defined on this javascript engine\\\";Object.defineProperty=function(object,property,descriptor){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if(\\\"object\\\"!=typeof descriptor&&\\\"function\\\"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,\\\"value\\\"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,\\\"get\\\")&&defineGetter(object,property,descriptor.get),owns(descriptor,\\\"set\\\")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return\\\"function\\\"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name=\\\"\\\";owns(object,name);)name+=\\\"?\\\";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=[\\\"toString\\\",\\\"toLocaleString\\\",\\\"valueOf\\\",\\\"hasOwnProperty\\\",\\\"isPrototypeOf\\\",\\\"propertyIsEnumerable\\\",\\\"constructor\\\"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(\\\"Object.keys called on a non-object\\\");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws=\\\"\\t\\\\n\\u000b\\\\f\\\\r   ᠎             　\\\\u2028\\\\u2029﻿\\\";if(!String.prototype.trim||ws.trim()){ws=\\\"[\\\"+ws+\\\"]\\\";var trimBeginRegexp=RegExp(\\\"^\\\"+ws+ws+\\\"*\\\"),trimEndRegexp=RegExp(ws+ws+\\\"*$\\\");String.prototype.trim=function(){return(this+\\\"\\\").replace(trimBeginRegexp,\\\"\\\").replace(trimEndRegexp,\\\"\\\")}}var toObject=function(o){if(null==o)throw new TypeError(\\\"can't convert \\\"+o+\\\" to object\\\");return Object(o)}});\";\n},{}],151:[function(require,module,exports){\n\n},{}],152:[function(require,module,exports){\narguments[4][151][0].apply(exports,arguments)\n},{\"dup\":151}],153:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar Buffer = require('buffer').Buffer;\n\nvar isBufferEncoding = Buffer.isEncoding\n  || function(encoding) {\n       switch (encoding && encoding.toLowerCase()) {\n         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n         default: return false;\n       }\n     }\n\n\nfunction assertEncoding(encoding) {\n  if (encoding && !isBufferEncoding(encoding)) {\n    throw new Error('Unknown encoding: ' + encoding);\n  }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nvar StringDecoder = exports.StringDecoder = function(encoding) {\n  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n  assertEncoding(encoding);\n  switch (this.encoding) {\n    case 'utf8':\n      // CESU-8 represents each of Surrogate Pair by 3-bytes\n      this.surrogateSize = 3;\n      break;\n    case 'ucs2':\n    case 'utf16le':\n      // UTF-16 represents each of Surrogate Pair by 2-bytes\n      this.surrogateSize = 2;\n      this.detectIncompleteChar = utf16DetectIncompleteChar;\n      break;\n    case 'base64':\n      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n      this.surrogateSize = 3;\n      this.detectIncompleteChar = base64DetectIncompleteChar;\n      break;\n    default:\n      this.write = passThroughWrite;\n      return;\n  }\n\n  // Enough space to store all bytes of a single character. UTF-8 needs 4\n  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n  this.charBuffer = new Buffer(6);\n  // Number of bytes received for the current incomplete multi-byte character.\n  this.charReceived = 0;\n  // Number of bytes expected for the current incomplete multi-byte character.\n  this.charLength = 0;\n};\n\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n  var charStr = '';\n  // if our last write ended with an incomplete multibyte character\n  while (this.charLength) {\n    // determine how many remaining bytes this buffer has to offer for this char\n    var available = (buffer.length >= this.charLength - this.charReceived) ?\n        this.charLength - this.charReceived :\n        buffer.length;\n\n    // add the new bytes to the char buffer\n    buffer.copy(this.charBuffer, this.charReceived, 0, available);\n    this.charReceived += available;\n\n    if (this.charReceived < this.charLength) {\n      // still not enough chars in this buffer? wait for more ...\n      return '';\n    }\n\n    // remove bytes belonging to the current character from the buffer\n    buffer = buffer.slice(available, buffer.length);\n\n    // get the character that was split\n    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n    var charCode = charStr.charCodeAt(charStr.length - 1);\n    if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n      this.charLength += this.surrogateSize;\n      charStr = '';\n      continue;\n    }\n    this.charReceived = this.charLength = 0;\n\n    // if there are no more bytes in this buffer, just emit our char\n    if (buffer.length === 0) {\n      return charStr;\n    }\n    break;\n  }\n\n  // determine and set charLength / charReceived\n  this.detectIncompleteChar(buffer);\n\n  var end = buffer.length;\n  if (this.charLength) {\n    // buffer the incomplete character bytes we got\n    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n    end -= this.charReceived;\n  }\n\n  charStr += buffer.toString(this.encoding, 0, end);\n\n  var end = charStr.length - 1;\n  var charCode = charStr.charCodeAt(end);\n  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n  if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n    var size = this.surrogateSize;\n    this.charLength += size;\n    this.charReceived += size;\n    this.charBuffer.copy(this.charBuffer, size, 0, size);\n    buffer.copy(this.charBuffer, 0, 0, size);\n    return charStr.substring(0, end);\n  }\n\n  // or just emit the charStr\n  return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n  // determine how many bytes we have to check at the end of this buffer\n  var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n  // Figure out if one of the last i bytes of our buffer announces an\n  // incomplete char.\n  for (; i > 0; i--) {\n    var c = buffer[buffer.length - i];\n\n    // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n    // 110XXXXX\n    if (i == 1 && c >> 5 == 0x06) {\n      this.charLength = 2;\n      break;\n    }\n\n    // 1110XXXX\n    if (i <= 2 && c >> 4 == 0x0E) {\n      this.charLength = 3;\n      break;\n    }\n\n    // 11110XXX\n    if (i <= 3 && c >> 3 == 0x1E) {\n      this.charLength = 4;\n      break;\n    }\n  }\n  this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n  var res = '';\n  if (buffer && buffer.length)\n    res = this.write(buffer);\n\n  if (this.charReceived) {\n    var cr = this.charReceived;\n    var buf = this.charBuffer;\n    var enc = this.encoding;\n    res += buf.slice(0, cr).toString(enc);\n  }\n\n  return res;\n};\n\nfunction passThroughWrite(buffer) {\n  return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 2;\n  this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 3;\n  this.charLength = this.charReceived ? 3 : 0;\n}\n\n},{\"buffer\":154}],154:[function(require,module,exports){\n(function (Buffer){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n    typeof console.error === 'function') {\n  console.error(\n    'This browser lacks typed array (Uint8Array) support which is required by ' +\n    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n  )\n}\n\nfunction typedArraySupport () {\n  // Can typed array instances can be augmented?\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }\n    return arr.foo() === 42\n  } catch (e) {\n    return false\n  }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.buffer\n  }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.byteOffset\n  }\n})\n\nfunction createBuffer (length) {\n  if (length > K_MAX_LENGTH) {\n    throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n  }\n  // Return an augmented `Uint8Array` instance\n  var buf = new Uint8Array(length)\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new TypeError(\n        'The \"string\" argument must be of type string. Received type number'\n      )\n    }\n    return allocUnsafe(arg)\n  }\n  return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species != null &&\n    Buffer[Symbol.species] === Buffer) {\n  Object.defineProperty(Buffer, Symbol.species, {\n    value: null,\n    configurable: true,\n    enumerable: false,\n    writable: false\n  })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  if (ArrayBuffer.isView(value)) {\n    return fromArrayLike(value)\n  }\n\n  if (value == null) {\n    throw TypeError(\n      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n      'or Array-like Object. Received type ' + (typeof value)\n    )\n  }\n\n  if (isInstance(value, ArrayBuffer) ||\n      (value && isInstance(value.buffer, ArrayBuffer))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'number') {\n    throw new TypeError(\n      'The \"value\" argument must not be of type number. Received type number'\n    )\n  }\n\n  var valueOf = value.valueOf && value.valueOf()\n  if (valueOf != null && valueOf !== value) {\n    return Buffer.from(valueOf, encodingOrOffset, length)\n  }\n\n  var b = fromObject(value)\n  if (b) return b\n\n  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n      typeof value[Symbol.toPrimitive] === 'function') {\n    return Buffer.from(\n      value[Symbol.toPrimitive]('string'), encodingOrOffset, length\n    )\n  }\n\n  throw new TypeError(\n    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n    'or Array-like Object. Received type ' + (typeof value)\n  )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be of type number')\n  } else if (size < 0) {\n    throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n  }\n}\n\nfunction alloc (size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(size).fill(fill, encoding)\n      : createBuffer(size).fill(fill)\n  }\n  return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n  assertSize(size)\n  return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('Unknown encoding: ' + encoding)\n  }\n\n  var length = byteLength(string, encoding) | 0\n  var buf = createBuffer(length)\n\n  var actual = buf.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual)\n  }\n\n  return buf\n}\n\nfunction fromArrayLike (array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  var buf = createBuffer(length)\n  for (var i = 0; i < length; i += 1) {\n    buf[i] = array[i] & 255\n  }\n  return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\"offset\" is outside of buffer bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\"length\" is outside of buffer bounds')\n  }\n\n  var buf\n  if (byteOffset === undefined && length === undefined) {\n    buf = new Uint8Array(array)\n  } else if (length === undefined) {\n    buf = new Uint8Array(array, byteOffset)\n  } else {\n    buf = new Uint8Array(array, byteOffset, length)\n  }\n\n  // Return an augmented `Uint8Array` instance\n  buf.__proto__ = Buffer.prototype\n  return buf\n}\n\nfunction fromObject (obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    var buf = createBuffer(len)\n\n    if (buf.length === 0) {\n      return buf\n    }\n\n    obj.copy(buf, 0, 0, len)\n    return buf\n  }\n\n  if (obj.length !== undefined) {\n    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n      return createBuffer(0)\n    }\n    return fromArrayLike(obj)\n  }\n\n  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n    return fromArrayLike(obj.data)\n  }\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= K_MAX_LENGTH) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return b != null && b._isBuffer === true &&\n    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError(\n      'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n    )\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!Array.isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (isInstance(buf, Uint8Array)) {\n      buf = Buffer.from(buf)\n    }\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    throw new TypeError(\n      'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n      'Received type ' + typeof string\n    )\n  }\n\n  var len = string.length\n  var mustMatch = (arguments.length > 2 && arguments[2] === true)\n  if (!mustMatch && len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) {\n          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n        }\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n  if (this.length > max) str += ' ... '\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (isInstance(target, Uint8Array)) {\n    target = Buffer.from(target, target.offset, target.byteLength)\n  }\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError(\n      'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n      'Received type ' + (typeof target)\n    )\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset // Coerce to Number.\n  if (numberIsNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  var strLen = string.length\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (numberIsNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset >>> 0\n    if (isFinite(length)) {\n      length = length >>> 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n        : (firstByte > 0xBF) ? 2\n          : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf = this.subarray(start, end)\n  // Return an augmented `Uint8Array` instance\n  newBuf.__proto__ = Buffer.prototype\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset + 3] = (value >>> 24)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 1] = (value >>> 8)\n  this[offset] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    var limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 3] = (value >>> 24)\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n\n  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n    // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end)\n  } else if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (var i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, end),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if ((encoding === 'utf8' && code < 128) ||\n          encoding === 'latin1') {\n        // Fast path: If `val` fits into a single byte, use that numeric value.\n        val = code\n      }\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : Buffer.from(val, encoding)\n    var len = bytes.length\n    if (len === 0) {\n      throw new TypeError('The value \"' + val +\n        '\" is invalid for argument \"value\"')\n    }\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node takes equal signs as end of the Base64 encoding\n  str = str.split('=')[0]\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = str.trim().replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n  return obj instanceof type ||\n    (obj != null && obj.constructor != null && obj.constructor.name != null &&\n      obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n  // For IE11 support\n  return obj !== obj // eslint-disable-line no-self-compare\n}\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"base64-js\":145,\"buffer\":154,\"ieee754\":160}],155:[function(require,module,exports){\n(function (Buffer){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n  if (Array.isArray) {\n    return Array.isArray(arg);\n  }\n  return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n}).call(this,{\"isBuffer\":require(\"../../is-buffer/index.js\")})\n},{\"../../is-buffer/index.js\":162}],156:[function(require,module,exports){\n(function webpackUniversalModuleDefinition(root, factory) {\n/* istanbul ignore next */\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n/* istanbul ignore next */\n\telse if(typeof exports === 'object')\n\t\texports[\"esprima\"] = factory();\n\telse\n\t\troot[\"esprima\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/* istanbul ignore if */\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*\n\t  Copyright JS Foundation and other contributors, https://js.foundation/\n\n\t  Redistribution and use in source and binary forms, with or without\n\t  modification, are permitted provided that the following conditions are met:\n\n\t    * Redistributions of source code must retain the above copyright\n\t      notice, this list of conditions and the following disclaimer.\n\t    * Redistributions in binary form must reproduce the above copyright\n\t      notice, this list of conditions and the following disclaimer in the\n\t      documentation and/or other materials provided with the distribution.\n\n\t  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n\t  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\t  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n\t  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n\t  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n\t  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n\t  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n\t  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n\t  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\t\"use strict\";\n\tvar comment_handler_1 = __webpack_require__(1);\n\tvar parser_1 = __webpack_require__(3);\n\tvar jsx_parser_1 = __webpack_require__(11);\n\tvar tokenizer_1 = __webpack_require__(15);\n\tfunction parse(code, options, delegate) {\n\t    var commentHandler = null;\n\t    var proxyDelegate = function (node, metadata) {\n\t        if (delegate) {\n\t            delegate(node, metadata);\n\t        }\n\t        if (commentHandler) {\n\t            commentHandler.visit(node, metadata);\n\t        }\n\t    };\n\t    var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;\n\t    var collectComment = false;\n\t    if (options) {\n\t        collectComment = (typeof options.comment === 'boolean' && options.comment);\n\t        var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);\n\t        if (collectComment || attachComment) {\n\t            commentHandler = new comment_handler_1.CommentHandler();\n\t            commentHandler.attach = attachComment;\n\t            options.comment = true;\n\t            parserDelegate = proxyDelegate;\n\t        }\n\t    }\n\t    var parser;\n\t    if (options && typeof options.jsx === 'boolean' && options.jsx) {\n\t        parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);\n\t    }\n\t    else {\n\t        parser = new parser_1.Parser(code, options, parserDelegate);\n\t    }\n\t    var ast = (parser.parseProgram());\n\t    if (collectComment) {\n\t        ast.comments = commentHandler.comments;\n\t    }\n\t    if (parser.config.tokens) {\n\t        ast.tokens = parser.tokens;\n\t    }\n\t    if (parser.config.tolerant) {\n\t        ast.errors = parser.errorHandler.errors;\n\t    }\n\t    return ast;\n\t}\n\texports.parse = parse;\n\tfunction tokenize(code, options, delegate) {\n\t    var tokenizer = new tokenizer_1.Tokenizer(code, options);\n\t    var tokens;\n\t    tokens = [];\n\t    try {\n\t        while (true) {\n\t            var token = tokenizer.getNextToken();\n\t            if (!token) {\n\t                break;\n\t            }\n\t            if (delegate) {\n\t                token = delegate(token);\n\t            }\n\t            tokens.push(token);\n\t        }\n\t    }\n\t    catch (e) {\n\t        tokenizer.errorHandler.tolerate(e);\n\t    }\n\t    if (tokenizer.errorHandler.tolerant) {\n\t        tokens.errors = tokenizer.errors();\n\t    }\n\t    return tokens;\n\t}\n\texports.tokenize = tokenize;\n\tvar syntax_1 = __webpack_require__(2);\n\texports.Syntax = syntax_1.Syntax;\n\t// Sync with *.json manifests.\n\texports.version = '3.1.3';\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar syntax_1 = __webpack_require__(2);\n\tvar CommentHandler = (function () {\n\t    function CommentHandler() {\n\t        this.attach = false;\n\t        this.comments = [];\n\t        this.stack = [];\n\t        this.leading = [];\n\t        this.trailing = [];\n\t    }\n\t    CommentHandler.prototype.insertInnerComments = function (node, metadata) {\n\t        //  innnerComments for properties empty block\n\t        //  `function a() {/** comments **\\/}`\n\t        if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {\n\t            var innerComments = [];\n\t            for (var i = this.leading.length - 1; i >= 0; --i) {\n\t                var entry = this.leading[i];\n\t                if (metadata.end.offset >= entry.start) {\n\t                    innerComments.unshift(entry.comment);\n\t                    this.leading.splice(i, 1);\n\t                    this.trailing.splice(i, 1);\n\t                }\n\t            }\n\t            if (innerComments.length) {\n\t                node.innerComments = innerComments;\n\t            }\n\t        }\n\t    };\n\t    CommentHandler.prototype.findTrailingComments = function (node, metadata) {\n\t        var trailingComments = [];\n\t        if (this.trailing.length > 0) {\n\t            for (var i = this.trailing.length - 1; i >= 0; --i) {\n\t                var entry_1 = this.trailing[i];\n\t                if (entry_1.start >= metadata.end.offset) {\n\t                    trailingComments.unshift(entry_1.comment);\n\t                }\n\t            }\n\t            this.trailing.length = 0;\n\t            return trailingComments;\n\t        }\n\t        var entry = this.stack[this.stack.length - 1];\n\t        if (entry && entry.node.trailingComments) {\n\t            var firstComment = entry.node.trailingComments[0];\n\t            if (firstComment && firstComment.range[0] >= metadata.end.offset) {\n\t                trailingComments = entry.node.trailingComments;\n\t                delete entry.node.trailingComments;\n\t            }\n\t        }\n\t        return trailingComments;\n\t    };\n\t    CommentHandler.prototype.findLeadingComments = function (node, metadata) {\n\t        var leadingComments = [];\n\t        var target;\n\t        while (this.stack.length > 0) {\n\t            var entry = this.stack[this.stack.length - 1];\n\t            if (entry && entry.start >= metadata.start.offset) {\n\t                target = this.stack.pop().node;\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        if (target) {\n\t            var count = target.leadingComments ? target.leadingComments.length : 0;\n\t            for (var i = count - 1; i >= 0; --i) {\n\t                var comment = target.leadingComments[i];\n\t                if (comment.range[1] <= metadata.start.offset) {\n\t                    leadingComments.unshift(comment);\n\t                    target.leadingComments.splice(i, 1);\n\t                }\n\t            }\n\t            if (target.leadingComments && target.leadingComments.length === 0) {\n\t                delete target.leadingComments;\n\t            }\n\t            return leadingComments;\n\t        }\n\t        for (var i = this.leading.length - 1; i >= 0; --i) {\n\t            var entry = this.leading[i];\n\t            if (entry.start <= metadata.start.offset) {\n\t                leadingComments.unshift(entry.comment);\n\t                this.leading.splice(i, 1);\n\t            }\n\t        }\n\t        return leadingComments;\n\t    };\n\t    CommentHandler.prototype.visitNode = function (node, metadata) {\n\t        if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {\n\t            return;\n\t        }\n\t        this.insertInnerComments(node, metadata);\n\t        var trailingComments = this.findTrailingComments(node, metadata);\n\t        var leadingComments = this.findLeadingComments(node, metadata);\n\t        if (leadingComments.length > 0) {\n\t            node.leadingComments = leadingComments;\n\t        }\n\t        if (trailingComments.length > 0) {\n\t            node.trailingComments = trailingComments;\n\t        }\n\t        this.stack.push({\n\t            node: node,\n\t            start: metadata.start.offset\n\t        });\n\t    };\n\t    CommentHandler.prototype.visitComment = function (node, metadata) {\n\t        var type = (node.type[0] === 'L') ? 'Line' : 'Block';\n\t        var comment = {\n\t            type: type,\n\t            value: node.value\n\t        };\n\t        if (node.range) {\n\t            comment.range = node.range;\n\t        }\n\t        if (node.loc) {\n\t            comment.loc = node.loc;\n\t        }\n\t        this.comments.push(comment);\n\t        if (this.attach) {\n\t            var entry = {\n\t                comment: {\n\t                    type: type,\n\t                    value: node.value,\n\t                    range: [metadata.start.offset, metadata.end.offset]\n\t                },\n\t                start: metadata.start.offset\n\t            };\n\t            if (node.loc) {\n\t                entry.comment.loc = node.loc;\n\t            }\n\t            node.type = type;\n\t            this.leading.push(entry);\n\t            this.trailing.push(entry);\n\t        }\n\t    };\n\t    CommentHandler.prototype.visit = function (node, metadata) {\n\t        if (node.type === 'LineComment') {\n\t            this.visitComment(node, metadata);\n\t        }\n\t        else if (node.type === 'BlockComment') {\n\t            this.visitComment(node, metadata);\n\t        }\n\t        else if (this.attach) {\n\t            this.visitNode(node, metadata);\n\t        }\n\t    };\n\t    return CommentHandler;\n\t}());\n\texports.CommentHandler = CommentHandler;\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\texports.Syntax = {\n\t    AssignmentExpression: 'AssignmentExpression',\n\t    AssignmentPattern: 'AssignmentPattern',\n\t    ArrayExpression: 'ArrayExpression',\n\t    ArrayPattern: 'ArrayPattern',\n\t    ArrowFunctionExpression: 'ArrowFunctionExpression',\n\t    BlockStatement: 'BlockStatement',\n\t    BinaryExpression: 'BinaryExpression',\n\t    BreakStatement: 'BreakStatement',\n\t    CallExpression: 'CallExpression',\n\t    CatchClause: 'CatchClause',\n\t    ClassBody: 'ClassBody',\n\t    ClassDeclaration: 'ClassDeclaration',\n\t    ClassExpression: 'ClassExpression',\n\t    ConditionalExpression: 'ConditionalExpression',\n\t    ContinueStatement: 'ContinueStatement',\n\t    DoWhileStatement: 'DoWhileStatement',\n\t    DebuggerStatement: 'DebuggerStatement',\n\t    EmptyStatement: 'EmptyStatement',\n\t    ExportAllDeclaration: 'ExportAllDeclaration',\n\t    ExportDefaultDeclaration: 'ExportDefaultDeclaration',\n\t    ExportNamedDeclaration: 'ExportNamedDeclaration',\n\t    ExportSpecifier: 'ExportSpecifier',\n\t    ExpressionStatement: 'ExpressionStatement',\n\t    ForStatement: 'ForStatement',\n\t    ForOfStatement: 'ForOfStatement',\n\t    ForInStatement: 'ForInStatement',\n\t    FunctionDeclaration: 'FunctionDeclaration',\n\t    FunctionExpression: 'FunctionExpression',\n\t    Identifier: 'Identifier',\n\t    IfStatement: 'IfStatement',\n\t    ImportDeclaration: 'ImportDeclaration',\n\t    ImportDefaultSpecifier: 'ImportDefaultSpecifier',\n\t    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\n\t    ImportSpecifier: 'ImportSpecifier',\n\t    Literal: 'Literal',\n\t    LabeledStatement: 'LabeledStatement',\n\t    LogicalExpression: 'LogicalExpression',\n\t    MemberExpression: 'MemberExpression',\n\t    MetaProperty: 'MetaProperty',\n\t    MethodDefinition: 'MethodDefinition',\n\t    NewExpression: 'NewExpression',\n\t    ObjectExpression: 'ObjectExpression',\n\t    ObjectPattern: 'ObjectPattern',\n\t    Program: 'Program',\n\t    Property: 'Property',\n\t    RestElement: 'RestElement',\n\t    ReturnStatement: 'ReturnStatement',\n\t    SequenceExpression: 'SequenceExpression',\n\t    SpreadElement: 'SpreadElement',\n\t    Super: 'Super',\n\t    SwitchCase: 'SwitchCase',\n\t    SwitchStatement: 'SwitchStatement',\n\t    TaggedTemplateExpression: 'TaggedTemplateExpression',\n\t    TemplateElement: 'TemplateElement',\n\t    TemplateLiteral: 'TemplateLiteral',\n\t    ThisExpression: 'ThisExpression',\n\t    ThrowStatement: 'ThrowStatement',\n\t    TryStatement: 'TryStatement',\n\t    UnaryExpression: 'UnaryExpression',\n\t    UpdateExpression: 'UpdateExpression',\n\t    VariableDeclaration: 'VariableDeclaration',\n\t    VariableDeclarator: 'VariableDeclarator',\n\t    WhileStatement: 'WhileStatement',\n\t    WithStatement: 'WithStatement',\n\t    YieldExpression: 'YieldExpression'\n\t};\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar assert_1 = __webpack_require__(4);\n\tvar messages_1 = __webpack_require__(5);\n\tvar error_handler_1 = __webpack_require__(6);\n\tvar token_1 = __webpack_require__(7);\n\tvar scanner_1 = __webpack_require__(8);\n\tvar syntax_1 = __webpack_require__(2);\n\tvar Node = __webpack_require__(10);\n\tvar ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';\n\tvar Parser = (function () {\n\t    function Parser(code, options, delegate) {\n\t        if (options === void 0) { options = {}; }\n\t        this.config = {\n\t            range: (typeof options.range === 'boolean') && options.range,\n\t            loc: (typeof options.loc === 'boolean') && options.loc,\n\t            source: null,\n\t            tokens: (typeof options.tokens === 'boolean') && options.tokens,\n\t            comment: (typeof options.comment === 'boolean') && options.comment,\n\t            tolerant: (typeof options.tolerant === 'boolean') && options.tolerant\n\t        };\n\t        if (this.config.loc && options.source && options.source !== null) {\n\t            this.config.source = String(options.source);\n\t        }\n\t        this.delegate = delegate;\n\t        this.errorHandler = new error_handler_1.ErrorHandler();\n\t        this.errorHandler.tolerant = this.config.tolerant;\n\t        this.scanner = new scanner_1.Scanner(code, this.errorHandler);\n\t        this.scanner.trackComment = this.config.comment;\n\t        this.operatorPrecedence = {\n\t            ')': 0,\n\t            ';': 0,\n\t            ',': 0,\n\t            '=': 0,\n\t            ']': 0,\n\t            '||': 1,\n\t            '&&': 2,\n\t            '|': 3,\n\t            '^': 4,\n\t            '&': 5,\n\t            '==': 6,\n\t            '!=': 6,\n\t            '===': 6,\n\t            '!==': 6,\n\t            '<': 7,\n\t            '>': 7,\n\t            '<=': 7,\n\t            '>=': 7,\n\t            '<<': 8,\n\t            '>>': 8,\n\t            '>>>': 8,\n\t            '+': 9,\n\t            '-': 9,\n\t            '*': 11,\n\t            '/': 11,\n\t            '%': 11\n\t        };\n\t        this.sourceType = (options && options.sourceType === 'module') ? 'module' : 'script';\n\t        this.lookahead = null;\n\t        this.hasLineTerminator = false;\n\t        this.context = {\n\t            allowIn: true,\n\t            allowYield: true,\n\t            firstCoverInitializedNameError: null,\n\t            isAssignmentTarget: false,\n\t            isBindingElement: false,\n\t            inFunctionBody: false,\n\t            inIteration: false,\n\t            inSwitch: false,\n\t            labelSet: {},\n\t            strict: (this.sourceType === 'module')\n\t        };\n\t        this.tokens = [];\n\t        this.startMarker = {\n\t            index: 0,\n\t            lineNumber: this.scanner.lineNumber,\n\t            lineStart: 0\n\t        };\n\t        this.lastMarker = {\n\t            index: 0,\n\t            lineNumber: this.scanner.lineNumber,\n\t            lineStart: 0\n\t        };\n\t        this.nextToken();\n\t        this.lastMarker = {\n\t            index: this.scanner.index,\n\t            lineNumber: this.scanner.lineNumber,\n\t            lineStart: this.scanner.lineStart\n\t        };\n\t    }\n\t    Parser.prototype.throwError = function (messageFormat) {\n\t        var values = [];\n\t        for (var _i = 1; _i < arguments.length; _i++) {\n\t            values[_i - 1] = arguments[_i];\n\t        }\n\t        var args = Array.prototype.slice.call(arguments, 1);\n\t        var msg = messageFormat.replace(/%(\\d)/g, function (whole, idx) {\n\t            assert_1.assert(idx < args.length, 'Message reference must be in range');\n\t            return args[idx];\n\t        });\n\t        var index = this.lastMarker.index;\n\t        var line = this.lastMarker.lineNumber;\n\t        var column = this.lastMarker.index - this.lastMarker.lineStart + 1;\n\t        throw this.errorHandler.createError(index, line, column, msg);\n\t    };\n\t    Parser.prototype.tolerateError = function (messageFormat) {\n\t        var values = [];\n\t        for (var _i = 1; _i < arguments.length; _i++) {\n\t            values[_i - 1] = arguments[_i];\n\t        }\n\t        var args = Array.prototype.slice.call(arguments, 1);\n\t        var msg = messageFormat.replace(/%(\\d)/g, function (whole, idx) {\n\t            assert_1.assert(idx < args.length, 'Message reference must be in range');\n\t            return args[idx];\n\t        });\n\t        var index = this.lastMarker.index;\n\t        var line = this.scanner.lineNumber;\n\t        var column = this.lastMarker.index - this.lastMarker.lineStart + 1;\n\t        this.errorHandler.tolerateError(index, line, column, msg);\n\t    };\n\t    // Throw an exception because of the token.\n\t    Parser.prototype.unexpectedTokenError = function (token, message) {\n\t        var msg = message || messages_1.Messages.UnexpectedToken;\n\t        var value;\n\t        if (token) {\n\t            if (!message) {\n\t                msg = (token.type === token_1.Token.EOF) ? messages_1.Messages.UnexpectedEOS :\n\t                    (token.type === token_1.Token.Identifier) ? messages_1.Messages.UnexpectedIdentifier :\n\t                        (token.type === token_1.Token.NumericLiteral) ? messages_1.Messages.UnexpectedNumber :\n\t                            (token.type === token_1.Token.StringLiteral) ? messages_1.Messages.UnexpectedString :\n\t                                (token.type === token_1.Token.Template) ? messages_1.Messages.UnexpectedTemplate :\n\t                                    messages_1.Messages.UnexpectedToken;\n\t                if (token.type === token_1.Token.Keyword) {\n\t                    if (this.scanner.isFutureReservedWord(token.value)) {\n\t                        msg = messages_1.Messages.UnexpectedReserved;\n\t                    }\n\t                    else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {\n\t                        msg = messages_1.Messages.StrictReservedWord;\n\t                    }\n\t                }\n\t            }\n\t            value = (token.type === token_1.Token.Template) ? token.value.raw : token.value;\n\t        }\n\t        else {\n\t            value = 'ILLEGAL';\n\t        }\n\t        msg = msg.replace('%0', value);\n\t        if (token && typeof token.lineNumber === 'number') {\n\t            var index = token.start;\n\t            var line = token.lineNumber;\n\t            var column = token.start - this.lastMarker.lineStart + 1;\n\t            return this.errorHandler.createError(index, line, column, msg);\n\t        }\n\t        else {\n\t            var index = this.lastMarker.index;\n\t            var line = this.lastMarker.lineNumber;\n\t            var column = index - this.lastMarker.lineStart + 1;\n\t            return this.errorHandler.createError(index, line, column, msg);\n\t        }\n\t    };\n\t    Parser.prototype.throwUnexpectedToken = function (token, message) {\n\t        throw this.unexpectedTokenError(token, message);\n\t    };\n\t    Parser.prototype.tolerateUnexpectedToken = function (token, message) {\n\t        this.errorHandler.tolerate(this.unexpectedTokenError(token, message));\n\t    };\n\t    Parser.prototype.collectComments = function () {\n\t        if (!this.config.comment) {\n\t            this.scanner.scanComments();\n\t        }\n\t        else {\n\t            var comments = this.scanner.scanComments();\n\t            if (comments.length > 0 && this.delegate) {\n\t                for (var i = 0; i < comments.length; ++i) {\n\t                    var e = comments[i];\n\t                    var node = void 0;\n\t                    node = {\n\t                        type: e.multiLine ? 'BlockComment' : 'LineComment',\n\t                        value: this.scanner.source.slice(e.slice[0], e.slice[1])\n\t                    };\n\t                    if (this.config.range) {\n\t                        node.range = e.range;\n\t                    }\n\t                    if (this.config.loc) {\n\t                        node.loc = e.loc;\n\t                    }\n\t                    var metadata = {\n\t                        start: {\n\t                            line: e.loc.start.line,\n\t                            column: e.loc.start.column,\n\t                            offset: e.range[0]\n\t                        },\n\t                        end: {\n\t                            line: e.loc.end.line,\n\t                            column: e.loc.end.column,\n\t                            offset: e.range[1]\n\t                        }\n\t                    };\n\t                    this.delegate(node, metadata);\n\t                }\n\t            }\n\t        }\n\t    };\n\t    // From internal representation to an external structure\n\t    Parser.prototype.getTokenRaw = function (token) {\n\t        return this.scanner.source.slice(token.start, token.end);\n\t    };\n\t    Parser.prototype.convertToken = function (token) {\n\t        var t;\n\t        t = {\n\t            type: token_1.TokenName[token.type],\n\t            value: this.getTokenRaw(token)\n\t        };\n\t        if (this.config.range) {\n\t            t.range = [token.start, token.end];\n\t        }\n\t        if (this.config.loc) {\n\t            t.loc = {\n\t                start: {\n\t                    line: this.startMarker.lineNumber,\n\t                    column: this.startMarker.index - this.startMarker.lineStart\n\t                },\n\t                end: {\n\t                    line: this.scanner.lineNumber,\n\t                    column: this.scanner.index - this.scanner.lineStart\n\t                }\n\t            };\n\t        }\n\t        if (token.regex) {\n\t            t.regex = token.regex;\n\t        }\n\t        return t;\n\t    };\n\t    Parser.prototype.nextToken = function () {\n\t        var token = this.lookahead;\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.lineNumber = this.scanner.lineNumber;\n\t        this.lastMarker.lineStart = this.scanner.lineStart;\n\t        this.collectComments();\n\t        this.startMarker.index = this.scanner.index;\n\t        this.startMarker.lineNumber = this.scanner.lineNumber;\n\t        this.startMarker.lineStart = this.scanner.lineStart;\n\t        var next;\n\t        next = this.scanner.lex();\n\t        this.hasLineTerminator = (token && next) ? (token.lineNumber !== next.lineNumber) : false;\n\t        if (next && this.context.strict && next.type === token_1.Token.Identifier) {\n\t            if (this.scanner.isStrictModeReservedWord(next.value)) {\n\t                next.type = token_1.Token.Keyword;\n\t            }\n\t        }\n\t        this.lookahead = next;\n\t        if (this.config.tokens && next.type !== token_1.Token.EOF) {\n\t            this.tokens.push(this.convertToken(next));\n\t        }\n\t        return token;\n\t    };\n\t    Parser.prototype.nextRegexToken = function () {\n\t        this.collectComments();\n\t        var token = this.scanner.scanRegExp();\n\t        if (this.config.tokens) {\n\t            // Pop the previous token, '/' or '/='\n\t            // This is added from the lookahead token.\n\t            this.tokens.pop();\n\t            this.tokens.push(this.convertToken(token));\n\t        }\n\t        // Prime the next lookahead.\n\t        this.lookahead = token;\n\t        this.nextToken();\n\t        return token;\n\t    };\n\t    Parser.prototype.createNode = function () {\n\t        return {\n\t            index: this.startMarker.index,\n\t            line: this.startMarker.lineNumber,\n\t            column: this.startMarker.index - this.startMarker.lineStart\n\t        };\n\t    };\n\t    Parser.prototype.startNode = function (token) {\n\t        return {\n\t            index: token.start,\n\t            line: token.lineNumber,\n\t            column: token.start - token.lineStart\n\t        };\n\t    };\n\t    Parser.prototype.finalize = function (meta, node) {\n\t        if (this.config.range) {\n\t            node.range = [meta.index, this.lastMarker.index];\n\t        }\n\t        if (this.config.loc) {\n\t            node.loc = {\n\t                start: {\n\t                    line: meta.line,\n\t                    column: meta.column\n\t                },\n\t                end: {\n\t                    line: this.lastMarker.lineNumber,\n\t                    column: this.lastMarker.index - this.lastMarker.lineStart\n\t                }\n\t            };\n\t            if (this.config.source) {\n\t                node.loc.source = this.config.source;\n\t            }\n\t        }\n\t        if (this.delegate) {\n\t            var metadata = {\n\t                start: {\n\t                    line: meta.line,\n\t                    column: meta.column,\n\t                    offset: meta.index\n\t                },\n\t                end: {\n\t                    line: this.lastMarker.lineNumber,\n\t                    column: this.lastMarker.index - this.lastMarker.lineStart,\n\t                    offset: this.lastMarker.index\n\t                }\n\t            };\n\t            this.delegate(node, metadata);\n\t        }\n\t        return node;\n\t    };\n\t    // Expect the next token to match the specified punctuator.\n\t    // If not, an exception will be thrown.\n\t    Parser.prototype.expect = function (value) {\n\t        var token = this.nextToken();\n\t        if (token.type !== token_1.Token.Punctuator || token.value !== value) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t    };\n\t    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().\n\t    Parser.prototype.expectCommaSeparator = function () {\n\t        if (this.config.tolerant) {\n\t            var token = this.lookahead;\n\t            if (token.type === token_1.Token.Punctuator && token.value === ',') {\n\t                this.nextToken();\n\t            }\n\t            else if (token.type === token_1.Token.Punctuator && token.value === ';') {\n\t                this.nextToken();\n\t                this.tolerateUnexpectedToken(token);\n\t            }\n\t            else {\n\t                this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);\n\t            }\n\t        }\n\t        else {\n\t            this.expect(',');\n\t        }\n\t    };\n\t    // Expect the next token to match the specified keyword.\n\t    // If not, an exception will be thrown.\n\t    Parser.prototype.expectKeyword = function (keyword) {\n\t        var token = this.nextToken();\n\t        if (token.type !== token_1.Token.Keyword || token.value !== keyword) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t    };\n\t    // Return true if the next token matches the specified punctuator.\n\t    Parser.prototype.match = function (value) {\n\t        return this.lookahead.type === token_1.Token.Punctuator && this.lookahead.value === value;\n\t    };\n\t    // Return true if the next token matches the specified keyword\n\t    Parser.prototype.matchKeyword = function (keyword) {\n\t        return this.lookahead.type === token_1.Token.Keyword && this.lookahead.value === keyword;\n\t    };\n\t    // Return true if the next token matches the specified contextual keyword\n\t    // (where an identifier is sometimes a keyword depending on the context)\n\t    Parser.prototype.matchContextualKeyword = function (keyword) {\n\t        return this.lookahead.type === token_1.Token.Identifier && this.lookahead.value === keyword;\n\t    };\n\t    // Return true if the next token is an assignment operator\n\t    Parser.prototype.matchAssign = function () {\n\t        if (this.lookahead.type !== token_1.Token.Punctuator) {\n\t            return false;\n\t        }\n\t        var op = this.lookahead.value;\n\t        return op === '=' ||\n\t            op === '*=' ||\n\t            op === '**=' ||\n\t            op === '/=' ||\n\t            op === '%=' ||\n\t            op === '+=' ||\n\t            op === '-=' ||\n\t            op === '<<=' ||\n\t            op === '>>=' ||\n\t            op === '>>>=' ||\n\t            op === '&=' ||\n\t            op === '^=' ||\n\t            op === '|=';\n\t    };\n\t    // Cover grammar support.\n\t    //\n\t    // When an assignment expression position starts with an left parenthesis, the determination of the type\n\t    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)\n\t    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.\n\t    //\n\t    // There are three productions that can be parsed in a parentheses pair that needs to be determined\n\t    // after the outermost pair is closed. They are:\n\t    //\n\t    //   1. AssignmentExpression\n\t    //   2. BindingElements\n\t    //   3. AssignmentTargets\n\t    //\n\t    // In order to avoid exponential backtracking, we use two flags to denote if the production can be\n\t    // binding element or assignment target.\n\t    //\n\t    // The three productions have the relationship:\n\t    //\n\t    //   BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression\n\t    //\n\t    // with a single exception that CoverInitializedName when used directly in an Expression, generates\n\t    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the\n\t    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.\n\t    //\n\t    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not\n\t    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore\n\t    // the CoverInitializedName check is conducted.\n\t    //\n\t    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates\n\t    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential\n\t    // pattern. The CoverInitializedName check is deferred.\n\t    Parser.prototype.isolateCoverGrammar = function (parseFunction) {\n\t        var previousIsBindingElement = this.context.isBindingElement;\n\t        var previousIsAssignmentTarget = this.context.isAssignmentTarget;\n\t        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;\n\t        this.context.isBindingElement = true;\n\t        this.context.isAssignmentTarget = true;\n\t        this.context.firstCoverInitializedNameError = null;\n\t        var result = parseFunction.call(this);\n\t        if (this.context.firstCoverInitializedNameError !== null) {\n\t            this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);\n\t        }\n\t        this.context.isBindingElement = previousIsBindingElement;\n\t        this.context.isAssignmentTarget = previousIsAssignmentTarget;\n\t        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;\n\t        return result;\n\t    };\n\t    Parser.prototype.inheritCoverGrammar = function (parseFunction) {\n\t        var previousIsBindingElement = this.context.isBindingElement;\n\t        var previousIsAssignmentTarget = this.context.isAssignmentTarget;\n\t        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;\n\t        this.context.isBindingElement = true;\n\t        this.context.isAssignmentTarget = true;\n\t        this.context.firstCoverInitializedNameError = null;\n\t        var result = parseFunction.call(this);\n\t        this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;\n\t        this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;\n\t        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;\n\t        return result;\n\t    };\n\t    Parser.prototype.consumeSemicolon = function () {\n\t        if (this.match(';')) {\n\t            this.nextToken();\n\t        }\n\t        else if (!this.hasLineTerminator) {\n\t            if (this.lookahead.type !== token_1.Token.EOF && !this.match('}')) {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t            this.lastMarker.index = this.startMarker.index;\n\t            this.lastMarker.lineNumber = this.startMarker.lineNumber;\n\t            this.lastMarker.lineStart = this.startMarker.lineStart;\n\t        }\n\t    };\n\t    // ECMA-262 12.2 Primary Expressions\n\t    Parser.prototype.parsePrimaryExpression = function () {\n\t        var node = this.createNode();\n\t        var expr;\n\t        var value, token, raw;\n\t        switch (this.lookahead.type) {\n\t            case token_1.Token.Identifier:\n\t                if (this.sourceType === 'module' && this.lookahead.value === 'await') {\n\t                    this.tolerateUnexpectedToken(this.lookahead);\n\t                }\n\t                expr = this.finalize(node, new Node.Identifier(this.nextToken().value));\n\t                break;\n\t            case token_1.Token.NumericLiteral:\n\t            case token_1.Token.StringLiteral:\n\t                if (this.context.strict && this.lookahead.octal) {\n\t                    this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);\n\t                }\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                token = this.nextToken();\n\t                raw = this.getTokenRaw(token);\n\t                expr = this.finalize(node, new Node.Literal(token.value, raw));\n\t                break;\n\t            case token_1.Token.BooleanLiteral:\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                token = this.nextToken();\n\t                token.value = (token.value === 'true');\n\t                raw = this.getTokenRaw(token);\n\t                expr = this.finalize(node, new Node.Literal(token.value, raw));\n\t                break;\n\t            case token_1.Token.NullLiteral:\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                token = this.nextToken();\n\t                token.value = null;\n\t                raw = this.getTokenRaw(token);\n\t                expr = this.finalize(node, new Node.Literal(token.value, raw));\n\t                break;\n\t            case token_1.Token.Template:\n\t                expr = this.parseTemplateLiteral();\n\t                break;\n\t            case token_1.Token.Punctuator:\n\t                value = this.lookahead.value;\n\t                switch (value) {\n\t                    case '(':\n\t                        this.context.isBindingElement = false;\n\t                        expr = this.inheritCoverGrammar(this.parseGroupExpression);\n\t                        break;\n\t                    case '[':\n\t                        expr = this.inheritCoverGrammar(this.parseArrayInitializer);\n\t                        break;\n\t                    case '{':\n\t                        expr = this.inheritCoverGrammar(this.parseObjectInitializer);\n\t                        break;\n\t                    case '/':\n\t                    case '/=':\n\t                        this.context.isAssignmentTarget = false;\n\t                        this.context.isBindingElement = false;\n\t                        this.scanner.index = this.startMarker.index;\n\t                        token = this.nextRegexToken();\n\t                        raw = this.getTokenRaw(token);\n\t                        expr = this.finalize(node, new Node.RegexLiteral(token.value, raw, token.regex));\n\t                        break;\n\t                    default:\n\t                        this.throwUnexpectedToken(this.nextToken());\n\t                }\n\t                break;\n\t            case token_1.Token.Keyword:\n\t                if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {\n\t                    expr = this.parseIdentifierName();\n\t                }\n\t                else if (!this.context.strict && this.matchKeyword('let')) {\n\t                    expr = this.finalize(node, new Node.Identifier(this.nextToken().value));\n\t                }\n\t                else {\n\t                    this.context.isAssignmentTarget = false;\n\t                    this.context.isBindingElement = false;\n\t                    if (this.matchKeyword('function')) {\n\t                        expr = this.parseFunctionExpression();\n\t                    }\n\t                    else if (this.matchKeyword('this')) {\n\t                        this.nextToken();\n\t                        expr = this.finalize(node, new Node.ThisExpression());\n\t                    }\n\t                    else if (this.matchKeyword('class')) {\n\t                        expr = this.parseClassExpression();\n\t                    }\n\t                    else {\n\t                        this.throwUnexpectedToken(this.nextToken());\n\t                    }\n\t                }\n\t                break;\n\t            default:\n\t                this.throwUnexpectedToken(this.nextToken());\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.2.5 Array Initializer\n\t    Parser.prototype.parseSpreadElement = function () {\n\t        var node = this.createNode();\n\t        this.expect('...');\n\t        var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t        return this.finalize(node, new Node.SpreadElement(arg));\n\t    };\n\t    Parser.prototype.parseArrayInitializer = function () {\n\t        var node = this.createNode();\n\t        var elements = [];\n\t        this.expect('[');\n\t        while (!this.match(']')) {\n\t            if (this.match(',')) {\n\t                this.nextToken();\n\t                elements.push(null);\n\t            }\n\t            else if (this.match('...')) {\n\t                var element = this.parseSpreadElement();\n\t                if (!this.match(']')) {\n\t                    this.context.isAssignmentTarget = false;\n\t                    this.context.isBindingElement = false;\n\t                    this.expect(',');\n\t                }\n\t                elements.push(element);\n\t            }\n\t            else {\n\t                elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));\n\t                if (!this.match(']')) {\n\t                    this.expect(',');\n\t                }\n\t            }\n\t        }\n\t        this.expect(']');\n\t        return this.finalize(node, new Node.ArrayExpression(elements));\n\t    };\n\t    // ECMA-262 12.2.6 Object Initializer\n\t    Parser.prototype.parsePropertyMethod = function (params) {\n\t        this.context.isAssignmentTarget = false;\n\t        this.context.isBindingElement = false;\n\t        var previousStrict = this.context.strict;\n\t        var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);\n\t        if (this.context.strict && params.firstRestricted) {\n\t            this.tolerateUnexpectedToken(params.firstRestricted, params.message);\n\t        }\n\t        if (this.context.strict && params.stricted) {\n\t            this.tolerateUnexpectedToken(params.stricted, params.message);\n\t        }\n\t        this.context.strict = previousStrict;\n\t        return body;\n\t    };\n\t    Parser.prototype.parsePropertyMethodFunction = function () {\n\t        var isGenerator = false;\n\t        var node = this.createNode();\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = false;\n\t        var params = this.parseFormalParameters();\n\t        var method = this.parsePropertyMethod(params);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));\n\t    };\n\t    Parser.prototype.parseObjectPropertyKey = function () {\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        var key = null;\n\t        switch (token.type) {\n\t            case token_1.Token.StringLiteral:\n\t            case token_1.Token.NumericLiteral:\n\t                if (this.context.strict && token.octal) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);\n\t                }\n\t                var raw = this.getTokenRaw(token);\n\t                key = this.finalize(node, new Node.Literal(token.value, raw));\n\t                break;\n\t            case token_1.Token.Identifier:\n\t            case token_1.Token.BooleanLiteral:\n\t            case token_1.Token.NullLiteral:\n\t            case token_1.Token.Keyword:\n\t                key = this.finalize(node, new Node.Identifier(token.value));\n\t                break;\n\t            case token_1.Token.Punctuator:\n\t                if (token.value === '[') {\n\t                    key = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    this.expect(']');\n\t                }\n\t                else {\n\t                    this.throwUnexpectedToken(token);\n\t                }\n\t                break;\n\t            default:\n\t                this.throwUnexpectedToken(token);\n\t        }\n\t        return key;\n\t    };\n\t    Parser.prototype.isPropertyKey = function (key, value) {\n\t        return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||\n\t            (key.type === syntax_1.Syntax.Literal && key.value === value);\n\t    };\n\t    Parser.prototype.parseObjectProperty = function (hasProto) {\n\t        var node = this.createNode();\n\t        var token = this.lookahead;\n\t        var kind;\n\t        var key;\n\t        var value;\n\t        var computed = false;\n\t        var method = false;\n\t        var shorthand = false;\n\t        if (token.type === token_1.Token.Identifier) {\n\t            this.nextToken();\n\t            key = this.finalize(node, new Node.Identifier(token.value));\n\t        }\n\t        else if (this.match('*')) {\n\t            this.nextToken();\n\t        }\n\t        else {\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t        }\n\t        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);\n\t        if (token.type === token_1.Token.Identifier && token.value === 'get' && lookaheadPropertyKey) {\n\t            kind = 'get';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            this.context.allowYield = false;\n\t            value = this.parseGetterMethod();\n\t        }\n\t        else if (token.type === token_1.Token.Identifier && token.value === 'set' && lookaheadPropertyKey) {\n\t            kind = 'set';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            value = this.parseSetterMethod();\n\t        }\n\t        else if (token.type === token_1.Token.Punctuator && token.value === '*' && lookaheadPropertyKey) {\n\t            kind = 'init';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            value = this.parseGeneratorMethod();\n\t            method = true;\n\t        }\n\t        else {\n\t            if (!key) {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t            kind = 'init';\n\t            if (this.match(':')) {\n\t                if (!computed && this.isPropertyKey(key, '__proto__')) {\n\t                    if (hasProto.value) {\n\t                        this.tolerateError(messages_1.Messages.DuplicateProtoProperty);\n\t                    }\n\t                    hasProto.value = true;\n\t                }\n\t                this.nextToken();\n\t                value = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t            }\n\t            else if (this.match('(')) {\n\t                value = this.parsePropertyMethodFunction();\n\t                method = true;\n\t            }\n\t            else if (token.type === token_1.Token.Identifier) {\n\t                var id = this.finalize(node, new Node.Identifier(token.value));\n\t                if (this.match('=')) {\n\t                    this.context.firstCoverInitializedNameError = this.lookahead;\n\t                    this.nextToken();\n\t                    shorthand = true;\n\t                    var init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    value = this.finalize(node, new Node.AssignmentPattern(id, init));\n\t                }\n\t                else {\n\t                    shorthand = true;\n\t                    value = id;\n\t                }\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.nextToken());\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));\n\t    };\n\t    Parser.prototype.parseObjectInitializer = function () {\n\t        var node = this.createNode();\n\t        this.expect('{');\n\t        var properties = [];\n\t        var hasProto = { value: false };\n\t        while (!this.match('}')) {\n\t            properties.push(this.parseObjectProperty(hasProto));\n\t            if (!this.match('}')) {\n\t                this.expectCommaSeparator();\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return this.finalize(node, new Node.ObjectExpression(properties));\n\t    };\n\t    // ECMA-262 12.2.9 Template Literals\n\t    Parser.prototype.parseTemplateHead = function () {\n\t        assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        var value = {\n\t            raw: token.value.raw,\n\t            cooked: token.value.cooked\n\t        };\n\t        return this.finalize(node, new Node.TemplateElement(value, token.tail));\n\t    };\n\t    Parser.prototype.parseTemplateElement = function () {\n\t        if (this.lookahead.type !== token_1.Token.Template) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        var value = {\n\t            raw: token.value.raw,\n\t            cooked: token.value.cooked\n\t        };\n\t        return this.finalize(node, new Node.TemplateElement(value, token.tail));\n\t    };\n\t    Parser.prototype.parseTemplateLiteral = function () {\n\t        var node = this.createNode();\n\t        var expressions = [];\n\t        var quasis = [];\n\t        var quasi = this.parseTemplateHead();\n\t        quasis.push(quasi);\n\t        while (!quasi.tail) {\n\t            expressions.push(this.parseExpression());\n\t            quasi = this.parseTemplateElement();\n\t            quasis.push(quasi);\n\t        }\n\t        return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));\n\t    };\n\t    // ECMA-262 12.2.10 The Grouping Operator\n\t    Parser.prototype.reinterpretExpressionAsPattern = function (expr) {\n\t        switch (expr.type) {\n\t            case syntax_1.Syntax.Identifier:\n\t            case syntax_1.Syntax.MemberExpression:\n\t            case syntax_1.Syntax.RestElement:\n\t            case syntax_1.Syntax.AssignmentPattern:\n\t                break;\n\t            case syntax_1.Syntax.SpreadElement:\n\t                expr.type = syntax_1.Syntax.RestElement;\n\t                this.reinterpretExpressionAsPattern(expr.argument);\n\t                break;\n\t            case syntax_1.Syntax.ArrayExpression:\n\t                expr.type = syntax_1.Syntax.ArrayPattern;\n\t                for (var i = 0; i < expr.elements.length; i++) {\n\t                    if (expr.elements[i] !== null) {\n\t                        this.reinterpretExpressionAsPattern(expr.elements[i]);\n\t                    }\n\t                }\n\t                break;\n\t            case syntax_1.Syntax.ObjectExpression:\n\t                expr.type = syntax_1.Syntax.ObjectPattern;\n\t                for (var i = 0; i < expr.properties.length; i++) {\n\t                    this.reinterpretExpressionAsPattern(expr.properties[i].value);\n\t                }\n\t                break;\n\t            case syntax_1.Syntax.AssignmentExpression:\n\t                expr.type = syntax_1.Syntax.AssignmentPattern;\n\t                delete expr.operator;\n\t                this.reinterpretExpressionAsPattern(expr.left);\n\t                break;\n\t            default:\n\t                // Allow other node type for tolerant parsing.\n\t                break;\n\t        }\n\t    };\n\t    Parser.prototype.parseGroupExpression = function () {\n\t        var expr;\n\t        this.expect('(');\n\t        if (this.match(')')) {\n\t            this.nextToken();\n\t            if (!this.match('=>')) {\n\t                this.expect('=>');\n\t            }\n\t            expr = {\n\t                type: ArrowParameterPlaceHolder,\n\t                params: []\n\t            };\n\t        }\n\t        else {\n\t            var startToken = this.lookahead;\n\t            var params = [];\n\t            if (this.match('...')) {\n\t                expr = this.parseRestElement(params);\n\t                this.expect(')');\n\t                if (!this.match('=>')) {\n\t                    this.expect('=>');\n\t                }\n\t                expr = {\n\t                    type: ArrowParameterPlaceHolder,\n\t                    params: [expr]\n\t                };\n\t            }\n\t            else {\n\t                var arrow = false;\n\t                this.context.isBindingElement = true;\n\t                expr = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t                if (this.match(',')) {\n\t                    var expressions = [];\n\t                    this.context.isAssignmentTarget = false;\n\t                    expressions.push(expr);\n\t                    while (this.startMarker.index < this.scanner.length) {\n\t                        if (!this.match(',')) {\n\t                            break;\n\t                        }\n\t                        this.nextToken();\n\t                        if (this.match('...')) {\n\t                            if (!this.context.isBindingElement) {\n\t                                this.throwUnexpectedToken(this.lookahead);\n\t                            }\n\t                            expressions.push(this.parseRestElement(params));\n\t                            this.expect(')');\n\t                            if (!this.match('=>')) {\n\t                                this.expect('=>');\n\t                            }\n\t                            this.context.isBindingElement = false;\n\t                            for (var i = 0; i < expressions.length; i++) {\n\t                                this.reinterpretExpressionAsPattern(expressions[i]);\n\t                            }\n\t                            arrow = true;\n\t                            expr = {\n\t                                type: ArrowParameterPlaceHolder,\n\t                                params: expressions\n\t                            };\n\t                        }\n\t                        else {\n\t                            expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));\n\t                        }\n\t                        if (arrow) {\n\t                            break;\n\t                        }\n\t                    }\n\t                    if (!arrow) {\n\t                        expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));\n\t                    }\n\t                }\n\t                if (!arrow) {\n\t                    this.expect(')');\n\t                    if (this.match('=>')) {\n\t                        if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {\n\t                            arrow = true;\n\t                            expr = {\n\t                                type: ArrowParameterPlaceHolder,\n\t                                params: [expr]\n\t                            };\n\t                        }\n\t                        if (!arrow) {\n\t                            if (!this.context.isBindingElement) {\n\t                                this.throwUnexpectedToken(this.lookahead);\n\t                            }\n\t                            if (expr.type === syntax_1.Syntax.SequenceExpression) {\n\t                                for (var i = 0; i < expr.expressions.length; i++) {\n\t                                    this.reinterpretExpressionAsPattern(expr.expressions[i]);\n\t                                }\n\t                            }\n\t                            else {\n\t                                this.reinterpretExpressionAsPattern(expr);\n\t                            }\n\t                            var params_1 = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);\n\t                            expr = {\n\t                                type: ArrowParameterPlaceHolder,\n\t                                params: params_1\n\t                            };\n\t                        }\n\t                    }\n\t                    this.context.isBindingElement = false;\n\t                }\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.3 Left-Hand-Side Expressions\n\t    Parser.prototype.parseArguments = function () {\n\t        this.expect('(');\n\t        var args = [];\n\t        if (!this.match(')')) {\n\t            while (true) {\n\t                var expr = this.match('...') ? this.parseSpreadElement() :\n\t                    this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                args.push(expr);\n\t                if (this.match(')')) {\n\t                    break;\n\t                }\n\t                this.expectCommaSeparator();\n\t            }\n\t        }\n\t        this.expect(')');\n\t        return args;\n\t    };\n\t    Parser.prototype.isIdentifierName = function (token) {\n\t        return token.type === token_1.Token.Identifier ||\n\t            token.type === token_1.Token.Keyword ||\n\t            token.type === token_1.Token.BooleanLiteral ||\n\t            token.type === token_1.Token.NullLiteral;\n\t    };\n\t    Parser.prototype.parseIdentifierName = function () {\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        if (!this.isIdentifierName(token)) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t        return this.finalize(node, new Node.Identifier(token.value));\n\t    };\n\t    Parser.prototype.parseNewExpression = function () {\n\t        var node = this.createNode();\n\t        var id = this.parseIdentifierName();\n\t        assert_1.assert(id.name === 'new', 'New expression must start with `new`');\n\t        var expr;\n\t        if (this.match('.')) {\n\t            this.nextToken();\n\t            if (this.lookahead.type === token_1.Token.Identifier && this.context.inFunctionBody && this.lookahead.value === 'target') {\n\t                var property = this.parseIdentifierName();\n\t                expr = new Node.MetaProperty(id, property);\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t        }\n\t        else {\n\t            var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);\n\t            var args = this.match('(') ? this.parseArguments() : [];\n\t            expr = new Node.NewExpression(callee, args);\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        return this.finalize(node, expr);\n\t    };\n\t    Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {\n\t        var startToken = this.lookahead;\n\t        var previousAllowIn = this.context.allowIn;\n\t        this.context.allowIn = true;\n\t        var expr;\n\t        if (this.matchKeyword('super') && this.context.inFunctionBody) {\n\t            expr = this.createNode();\n\t            this.nextToken();\n\t            expr = this.finalize(expr, new Node.Super());\n\t            if (!this.match('(') && !this.match('.') && !this.match('[')) {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t        }\n\t        else {\n\t            expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);\n\t        }\n\t        while (true) {\n\t            if (this.match('.')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('.');\n\t                var property = this.parseIdentifierName();\n\t                expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));\n\t            }\n\t            else if (this.match('(')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = false;\n\t                var args = this.parseArguments();\n\t                expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));\n\t            }\n\t            else if (this.match('[')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('[');\n\t                var property = this.isolateCoverGrammar(this.parseExpression);\n\t                this.expect(']');\n\t                expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));\n\t            }\n\t            else if (this.lookahead.type === token_1.Token.Template && this.lookahead.head) {\n\t                var quasi = this.parseTemplateLiteral();\n\t                expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        this.context.allowIn = previousAllowIn;\n\t        return expr;\n\t    };\n\t    Parser.prototype.parseSuper = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('super');\n\t        if (!this.match('[') && !this.match('.')) {\n\t            this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        return this.finalize(node, new Node.Super());\n\t    };\n\t    Parser.prototype.parseLeftHandSideExpression = function () {\n\t        assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');\n\t        var node = this.startNode(this.lookahead);\n\t        var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :\n\t            this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);\n\t        while (true) {\n\t            if (this.match('[')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('[');\n\t                var property = this.isolateCoverGrammar(this.parseExpression);\n\t                this.expect(']');\n\t                expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));\n\t            }\n\t            else if (this.match('.')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('.');\n\t                var property = this.parseIdentifierName();\n\t                expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));\n\t            }\n\t            else if (this.lookahead.type === token_1.Token.Template && this.lookahead.head) {\n\t                var quasi = this.parseTemplateLiteral();\n\t                expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.4 Update Expressions\n\t    Parser.prototype.parseUpdateExpression = function () {\n\t        var expr;\n\t        var startToken = this.lookahead;\n\t        if (this.match('++') || this.match('--')) {\n\t            var node = this.startNode(startToken);\n\t            var token = this.nextToken();\n\t            expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t            if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {\n\t                this.tolerateError(messages_1.Messages.StrictLHSPrefix);\n\t            }\n\t            if (!this.context.isAssignmentTarget) {\n\t                this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t            }\n\t            var prefix = true;\n\t            expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        else {\n\t            expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t            if (!this.hasLineTerminator && this.lookahead.type === token_1.Token.Punctuator) {\n\t                if (this.match('++') || this.match('--')) {\n\t                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {\n\t                        this.tolerateError(messages_1.Messages.StrictLHSPostfix);\n\t                    }\n\t                    if (!this.context.isAssignmentTarget) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t                    }\n\t                    this.context.isAssignmentTarget = false;\n\t                    this.context.isBindingElement = false;\n\t                    var operator = this.nextToken().value;\n\t                    var prefix = false;\n\t                    expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));\n\t                }\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.5 Unary Operators\n\t    Parser.prototype.parseUnaryExpression = function () {\n\t        var expr;\n\t        if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||\n\t            this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {\n\t            var node = this.startNode(this.lookahead);\n\t            var token = this.nextToken();\n\t            expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t            expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));\n\t            if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {\n\t                this.tolerateError(messages_1.Messages.StrictDelete);\n\t            }\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        else {\n\t            expr = this.parseUpdateExpression();\n\t        }\n\t        return expr;\n\t    };\n\t    Parser.prototype.parseExponentiationExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t        if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {\n\t            this.nextToken();\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t            var left = expr;\n\t            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);\n\t            expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.6 Exponentiation Operators\n\t    // ECMA-262 12.7 Multiplicative Operators\n\t    // ECMA-262 12.8 Additive Operators\n\t    // ECMA-262 12.9 Bitwise Shift Operators\n\t    // ECMA-262 12.10 Relational Operators\n\t    // ECMA-262 12.11 Equality Operators\n\t    // ECMA-262 12.12 Binary Bitwise Operators\n\t    // ECMA-262 12.13 Binary Logical Operators\n\t    Parser.prototype.binaryPrecedence = function (token) {\n\t        var op = token.value;\n\t        var precedence;\n\t        if (token.type === token_1.Token.Punctuator) {\n\t            precedence = this.operatorPrecedence[op] || 0;\n\t        }\n\t        else if (token.type === token_1.Token.Keyword) {\n\t            precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;\n\t        }\n\t        else {\n\t            precedence = 0;\n\t        }\n\t        return precedence;\n\t    };\n\t    Parser.prototype.parseBinaryExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);\n\t        var token = this.lookahead;\n\t        var prec = this.binaryPrecedence(token);\n\t        if (prec > 0) {\n\t            this.nextToken();\n\t            token.prec = prec;\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t            var markers = [startToken, this.lookahead];\n\t            var left = expr;\n\t            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);\n\t            var stack = [left, token, right];\n\t            while (true) {\n\t                prec = this.binaryPrecedence(this.lookahead);\n\t                if (prec <= 0) {\n\t                    break;\n\t                }\n\t                // Reduce: make a binary expression from the three topmost entries.\n\t                while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n\t                    right = stack.pop();\n\t                    var operator = stack.pop().value;\n\t                    left = stack.pop();\n\t                    markers.pop();\n\t                    var node = this.startNode(markers[markers.length - 1]);\n\t                    stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));\n\t                }\n\t                // Shift.\n\t                token = this.nextToken();\n\t                token.prec = prec;\n\t                stack.push(token);\n\t                markers.push(this.lookahead);\n\t                stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));\n\t            }\n\t            // Final reduce to clean-up the stack.\n\t            var i = stack.length - 1;\n\t            expr = stack[i];\n\t            markers.pop();\n\t            while (i > 1) {\n\t                var node = this.startNode(markers.pop());\n\t                expr = this.finalize(node, new Node.BinaryExpression(stack[i - 1].value, stack[i - 2], expr));\n\t                i -= 2;\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.14 Conditional Operator\n\t    Parser.prototype.parseConditionalExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.inheritCoverGrammar(this.parseBinaryExpression);\n\t        if (this.match('?')) {\n\t            this.nextToken();\n\t            var previousAllowIn = this.context.allowIn;\n\t            this.context.allowIn = true;\n\t            var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t            this.context.allowIn = previousAllowIn;\n\t            this.expect(':');\n\t            var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t            expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.15 Assignment Operators\n\t    Parser.prototype.checkPatternParam = function (options, param) {\n\t        switch (param.type) {\n\t            case syntax_1.Syntax.Identifier:\n\t                this.validateParam(options, param, param.name);\n\t                break;\n\t            case syntax_1.Syntax.RestElement:\n\t                this.checkPatternParam(options, param.argument);\n\t                break;\n\t            case syntax_1.Syntax.AssignmentPattern:\n\t                this.checkPatternParam(options, param.left);\n\t                break;\n\t            case syntax_1.Syntax.ArrayPattern:\n\t                for (var i = 0; i < param.elements.length; i++) {\n\t                    if (param.elements[i] !== null) {\n\t                        this.checkPatternParam(options, param.elements[i]);\n\t                    }\n\t                }\n\t                break;\n\t            case syntax_1.Syntax.YieldExpression:\n\t                break;\n\t            default:\n\t                assert_1.assert(param.type === syntax_1.Syntax.ObjectPattern, 'Invalid type');\n\t                for (var i = 0; i < param.properties.length; i++) {\n\t                    this.checkPatternParam(options, param.properties[i].value);\n\t                }\n\t                break;\n\t        }\n\t    };\n\t    Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {\n\t        var params = [expr];\n\t        var options;\n\t        switch (expr.type) {\n\t            case syntax_1.Syntax.Identifier:\n\t                break;\n\t            case ArrowParameterPlaceHolder:\n\t                params = expr.params;\n\t                break;\n\t            default:\n\t                return null;\n\t        }\n\t        options = {\n\t            paramSet: {}\n\t        };\n\t        for (var i = 0; i < params.length; ++i) {\n\t            var param = params[i];\n\t            if (param.type === syntax_1.Syntax.AssignmentPattern) {\n\t                if (param.right.type === syntax_1.Syntax.YieldExpression) {\n\t                    if (param.right.argument) {\n\t                        this.throwUnexpectedToken(this.lookahead);\n\t                    }\n\t                    param.right.type = syntax_1.Syntax.Identifier;\n\t                    param.right.name = 'yield';\n\t                    delete param.right.argument;\n\t                    delete param.right.delegate;\n\t                }\n\t            }\n\t            this.checkPatternParam(options, param);\n\t            params[i] = param;\n\t        }\n\t        if (this.context.strict || !this.context.allowYield) {\n\t            for (var i = 0; i < params.length; ++i) {\n\t                var param = params[i];\n\t                if (param.type === syntax_1.Syntax.YieldExpression) {\n\t                    this.throwUnexpectedToken(this.lookahead);\n\t                }\n\t            }\n\t        }\n\t        if (options.message === messages_1.Messages.StrictParamDupe) {\n\t            var token = this.context.strict ? options.stricted : options.firstRestricted;\n\t            this.throwUnexpectedToken(token, options.message);\n\t        }\n\t        return {\n\t            params: params,\n\t            stricted: options.stricted,\n\t            firstRestricted: options.firstRestricted,\n\t            message: options.message\n\t        };\n\t    };\n\t    Parser.prototype.parseAssignmentExpression = function () {\n\t        var expr;\n\t        if (!this.context.allowYield && this.matchKeyword('yield')) {\n\t            expr = this.parseYieldExpression();\n\t        }\n\t        else {\n\t            var startToken = this.lookahead;\n\t            var token = startToken;\n\t            expr = this.parseConditionalExpression();\n\t            if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {\n\t                // ECMA-262 14.2 Arrow Function Definitions\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                var list = this.reinterpretAsCoverFormalsList(expr);\n\t                if (list) {\n\t                    if (this.hasLineTerminator) {\n\t                        this.tolerateUnexpectedToken(this.lookahead);\n\t                    }\n\t                    this.context.firstCoverInitializedNameError = null;\n\t                    var previousStrict = this.context.strict;\n\t                    var previousAllowYield = this.context.allowYield;\n\t                    this.context.allowYield = true;\n\t                    var node = this.startNode(startToken);\n\t                    this.expect('=>');\n\t                    var body = this.match('{') ? this.parseFunctionSourceElements() :\n\t                        this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    var expression = body.type !== syntax_1.Syntax.BlockStatement;\n\t                    if (this.context.strict && list.firstRestricted) {\n\t                        this.throwUnexpectedToken(list.firstRestricted, list.message);\n\t                    }\n\t                    if (this.context.strict && list.stricted) {\n\t                        this.tolerateUnexpectedToken(list.stricted, list.message);\n\t                    }\n\t                    expr = this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));\n\t                    this.context.strict = previousStrict;\n\t                    this.context.allowYield = previousAllowYield;\n\t                }\n\t            }\n\t            else {\n\t                if (this.matchAssign()) {\n\t                    if (!this.context.isAssignmentTarget) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t                    }\n\t                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {\n\t                        var id = (expr);\n\t                        if (this.scanner.isRestrictedWord(id.name)) {\n\t                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);\n\t                        }\n\t                        if (this.scanner.isStrictModeReservedWord(id.name)) {\n\t                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t                        }\n\t                    }\n\t                    if (!this.match('=')) {\n\t                        this.context.isAssignmentTarget = false;\n\t                        this.context.isBindingElement = false;\n\t                    }\n\t                    else {\n\t                        this.reinterpretExpressionAsPattern(expr);\n\t                    }\n\t                    token = this.nextToken();\n\t                    var right = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(token.value, expr, right));\n\t                    this.context.firstCoverInitializedNameError = null;\n\t                }\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 12.16 Comma Operator\n\t    Parser.prototype.parseExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t        if (this.match(',')) {\n\t            var expressions = [];\n\t            expressions.push(expr);\n\t            while (this.startMarker.index < this.scanner.length) {\n\t                if (!this.match(',')) {\n\t                    break;\n\t                }\n\t                this.nextToken();\n\t                expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));\n\t            }\n\t            expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));\n\t        }\n\t        return expr;\n\t    };\n\t    // ECMA-262 13.2 Block\n\t    Parser.prototype.parseStatementListItem = function () {\n\t        var statement = null;\n\t        this.context.isAssignmentTarget = true;\n\t        this.context.isBindingElement = true;\n\t        if (this.lookahead.type === token_1.Token.Keyword) {\n\t            switch (this.lookahead.value) {\n\t                case 'export':\n\t                    if (this.sourceType !== 'module') {\n\t                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);\n\t                    }\n\t                    statement = this.parseExportDeclaration();\n\t                    break;\n\t                case 'import':\n\t                    if (this.sourceType !== 'module') {\n\t                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);\n\t                    }\n\t                    statement = this.parseImportDeclaration();\n\t                    break;\n\t                case 'const':\n\t                    statement = this.parseLexicalDeclaration({ inFor: false });\n\t                    break;\n\t                case 'function':\n\t                    statement = this.parseFunctionDeclaration();\n\t                    break;\n\t                case 'class':\n\t                    statement = this.parseClassDeclaration();\n\t                    break;\n\t                case 'let':\n\t                    statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();\n\t                    break;\n\t                default:\n\t                    statement = this.parseStatement();\n\t                    break;\n\t            }\n\t        }\n\t        else {\n\t            statement = this.parseStatement();\n\t        }\n\t        return statement;\n\t    };\n\t    Parser.prototype.parseBlock = function () {\n\t        var node = this.createNode();\n\t        this.expect('{');\n\t        var block = [];\n\t        while (true) {\n\t            if (this.match('}')) {\n\t                break;\n\t            }\n\t            block.push(this.parseStatementListItem());\n\t        }\n\t        this.expect('}');\n\t        return this.finalize(node, new Node.BlockStatement(block));\n\t    };\n\t    // ECMA-262 13.3.1 Let and Const Declarations\n\t    Parser.prototype.parseLexicalBinding = function (kind, options) {\n\t        var node = this.createNode();\n\t        var params = [];\n\t        var id = this.parsePattern(params, kind);\n\t        // ECMA-262 12.2.1\n\t        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {\n\t            if (this.scanner.isRestrictedWord((id).name)) {\n\t                this.tolerateError(messages_1.Messages.StrictVarName);\n\t            }\n\t        }\n\t        var init = null;\n\t        if (kind === 'const') {\n\t            if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {\n\t                this.expect('=');\n\t                init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t            }\n\t        }\n\t        else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {\n\t            this.expect('=');\n\t            init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t        }\n\t        return this.finalize(node, new Node.VariableDeclarator(id, init));\n\t    };\n\t    Parser.prototype.parseBindingList = function (kind, options) {\n\t        var list = [this.parseLexicalBinding(kind, options)];\n\t        while (this.match(',')) {\n\t            this.nextToken();\n\t            list.push(this.parseLexicalBinding(kind, options));\n\t        }\n\t        return list;\n\t    };\n\t    Parser.prototype.isLexicalDeclaration = function () {\n\t        var previousIndex = this.scanner.index;\n\t        var previousLineNumber = this.scanner.lineNumber;\n\t        var previousLineStart = this.scanner.lineStart;\n\t        this.collectComments();\n\t        var next = this.scanner.lex();\n\t        this.scanner.index = previousIndex;\n\t        this.scanner.lineNumber = previousLineNumber;\n\t        this.scanner.lineStart = previousLineStart;\n\t        return (next.type === token_1.Token.Identifier) ||\n\t            (next.type === token_1.Token.Punctuator && next.value === '[') ||\n\t            (next.type === token_1.Token.Punctuator && next.value === '{') ||\n\t            (next.type === token_1.Token.Keyword && next.value === 'let') ||\n\t            (next.type === token_1.Token.Keyword && next.value === 'yield');\n\t    };\n\t    Parser.prototype.parseLexicalDeclaration = function (options) {\n\t        var node = this.createNode();\n\t        var kind = this.nextToken().value;\n\t        assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');\n\t        var declarations = this.parseBindingList(kind, options);\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.VariableDeclaration(declarations, kind));\n\t    };\n\t    // ECMA-262 13.3.3 Destructuring Binding Patterns\n\t    Parser.prototype.parseBindingRestElement = function (params, kind) {\n\t        var node = this.createNode();\n\t        this.expect('...');\n\t        var arg = this.parsePattern(params, kind);\n\t        return this.finalize(node, new Node.RestElement(arg));\n\t    };\n\t    Parser.prototype.parseArrayPattern = function (params, kind) {\n\t        var node = this.createNode();\n\t        this.expect('[');\n\t        var elements = [];\n\t        while (!this.match(']')) {\n\t            if (this.match(',')) {\n\t                this.nextToken();\n\t                elements.push(null);\n\t            }\n\t            else {\n\t                if (this.match('...')) {\n\t                    elements.push(this.parseBindingRestElement(params, kind));\n\t                    break;\n\t                }\n\t                else {\n\t                    elements.push(this.parsePatternWithDefault(params, kind));\n\t                }\n\t                if (!this.match(']')) {\n\t                    this.expect(',');\n\t                }\n\t            }\n\t        }\n\t        this.expect(']');\n\t        return this.finalize(node, new Node.ArrayPattern(elements));\n\t    };\n\t    Parser.prototype.parsePropertyPattern = function (params, kind) {\n\t        var node = this.createNode();\n\t        var computed = false;\n\t        var shorthand = false;\n\t        var method = false;\n\t        var key;\n\t        var value;\n\t        if (this.lookahead.type === token_1.Token.Identifier) {\n\t            var keyToken = this.lookahead;\n\t            key = this.parseVariableIdentifier();\n\t            var init = this.finalize(node, new Node.Identifier(keyToken.value));\n\t            if (this.match('=')) {\n\t                params.push(keyToken);\n\t                shorthand = true;\n\t                this.nextToken();\n\t                var expr = this.parseAssignmentExpression();\n\t                value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));\n\t            }\n\t            else if (!this.match(':')) {\n\t                params.push(keyToken);\n\t                shorthand = true;\n\t                value = init;\n\t            }\n\t            else {\n\t                this.expect(':');\n\t                value = this.parsePatternWithDefault(params, kind);\n\t            }\n\t        }\n\t        else {\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            this.expect(':');\n\t            value = this.parsePatternWithDefault(params, kind);\n\t        }\n\t        return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));\n\t    };\n\t    Parser.prototype.parseObjectPattern = function (params, kind) {\n\t        var node = this.createNode();\n\t        var properties = [];\n\t        this.expect('{');\n\t        while (!this.match('}')) {\n\t            properties.push(this.parsePropertyPattern(params, kind));\n\t            if (!this.match('}')) {\n\t                this.expect(',');\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return this.finalize(node, new Node.ObjectPattern(properties));\n\t    };\n\t    Parser.prototype.parsePattern = function (params, kind) {\n\t        var pattern;\n\t        if (this.match('[')) {\n\t            pattern = this.parseArrayPattern(params, kind);\n\t        }\n\t        else if (this.match('{')) {\n\t            pattern = this.parseObjectPattern(params, kind);\n\t        }\n\t        else {\n\t            if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {\n\t                this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.UnexpectedToken);\n\t            }\n\t            params.push(this.lookahead);\n\t            pattern = this.parseVariableIdentifier(kind);\n\t        }\n\t        return pattern;\n\t    };\n\t    Parser.prototype.parsePatternWithDefault = function (params, kind) {\n\t        var startToken = this.lookahead;\n\t        var pattern = this.parsePattern(params, kind);\n\t        if (this.match('=')) {\n\t            this.nextToken();\n\t            var previousAllowYield = this.context.allowYield;\n\t            this.context.allowYield = true;\n\t            var right = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t            this.context.allowYield = previousAllowYield;\n\t            pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));\n\t        }\n\t        return pattern;\n\t    };\n\t    // ECMA-262 13.3.2 Variable Statement\n\t    Parser.prototype.parseVariableIdentifier = function (kind) {\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        if (token.type === token_1.Token.Keyword && token.value === 'yield') {\n\t            if (this.context.strict) {\n\t                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t            }\n\t            if (!this.context.allowYield) {\n\t                this.throwUnexpectedToken(token);\n\t            }\n\t        }\n\t        else if (token.type !== token_1.Token.Identifier) {\n\t            if (this.context.strict && token.type === token_1.Token.Keyword && this.scanner.isStrictModeReservedWord(token.value)) {\n\t                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t            }\n\t            else {\n\t                if (this.context.strict || token.value !== 'let' || kind !== 'var') {\n\t                    this.throwUnexpectedToken(token);\n\t                }\n\t            }\n\t        }\n\t        else if (this.sourceType === 'module' && token.type === token_1.Token.Identifier && token.value === 'await') {\n\t            this.tolerateUnexpectedToken(token);\n\t        }\n\t        return this.finalize(node, new Node.Identifier(token.value));\n\t    };\n\t    Parser.prototype.parseVariableDeclaration = function (options) {\n\t        var node = this.createNode();\n\t        var params = [];\n\t        var id = this.parsePattern(params, 'var');\n\t        // ECMA-262 12.2.1\n\t        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {\n\t            if (this.scanner.isRestrictedWord((id).name)) {\n\t                this.tolerateError(messages_1.Messages.StrictVarName);\n\t            }\n\t        }\n\t        var init = null;\n\t        if (this.match('=')) {\n\t            this.nextToken();\n\t            init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t        }\n\t        else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {\n\t            this.expect('=');\n\t        }\n\t        return this.finalize(node, new Node.VariableDeclarator(id, init));\n\t    };\n\t    Parser.prototype.parseVariableDeclarationList = function (options) {\n\t        var opt = { inFor: options.inFor };\n\t        var list = [];\n\t        list.push(this.parseVariableDeclaration(opt));\n\t        while (this.match(',')) {\n\t            this.nextToken();\n\t            list.push(this.parseVariableDeclaration(opt));\n\t        }\n\t        return list;\n\t    };\n\t    Parser.prototype.parseVariableStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('var');\n\t        var declarations = this.parseVariableDeclarationList({ inFor: false });\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));\n\t    };\n\t    // ECMA-262 13.4 Empty Statement\n\t    Parser.prototype.parseEmptyStatement = function () {\n\t        var node = this.createNode();\n\t        this.expect(';');\n\t        return this.finalize(node, new Node.EmptyStatement());\n\t    };\n\t    // ECMA-262 13.5 Expression Statement\n\t    Parser.prototype.parseExpressionStatement = function () {\n\t        var node = this.createNode();\n\t        var expr = this.parseExpression();\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ExpressionStatement(expr));\n\t    };\n\t    // ECMA-262 13.6 If statement\n\t    Parser.prototype.parseIfStatement = function () {\n\t        var node = this.createNode();\n\t        var consequent;\n\t        var alternate = null;\n\t        this.expectKeyword('if');\n\t        this.expect('(');\n\t        var test = this.parseExpression();\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t            consequent = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            consequent = this.parseStatement();\n\t            if (this.matchKeyword('else')) {\n\t                this.nextToken();\n\t                alternate = this.parseStatement();\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.IfStatement(test, consequent, alternate));\n\t    };\n\t    // ECMA-262 13.7.2 The do-while Statement\n\t    Parser.prototype.parseDoWhileStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('do');\n\t        var previousInIteration = this.context.inIteration;\n\t        this.context.inIteration = true;\n\t        var body = this.parseStatement();\n\t        this.context.inIteration = previousInIteration;\n\t        this.expectKeyword('while');\n\t        this.expect('(');\n\t        var test = this.parseExpression();\n\t        this.expect(')');\n\t        if (this.match(';')) {\n\t            this.nextToken();\n\t        }\n\t        return this.finalize(node, new Node.DoWhileStatement(body, test));\n\t    };\n\t    // ECMA-262 13.7.3 The while Statement\n\t    Parser.prototype.parseWhileStatement = function () {\n\t        var node = this.createNode();\n\t        var body;\n\t        this.expectKeyword('while');\n\t        this.expect('(');\n\t        var test = this.parseExpression();\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t            body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            var previousInIteration = this.context.inIteration;\n\t            this.context.inIteration = true;\n\t            body = this.parseStatement();\n\t            this.context.inIteration = previousInIteration;\n\t        }\n\t        return this.finalize(node, new Node.WhileStatement(test, body));\n\t    };\n\t    // ECMA-262 13.7.4 The for Statement\n\t    // ECMA-262 13.7.5 The for-in and for-of Statements\n\t    Parser.prototype.parseForStatement = function () {\n\t        var init = null;\n\t        var test = null;\n\t        var update = null;\n\t        var forIn = true;\n\t        var left, right;\n\t        var node = this.createNode();\n\t        this.expectKeyword('for');\n\t        this.expect('(');\n\t        if (this.match(';')) {\n\t            this.nextToken();\n\t        }\n\t        else {\n\t            if (this.matchKeyword('var')) {\n\t                init = this.createNode();\n\t                this.nextToken();\n\t                var previousAllowIn = this.context.allowIn;\n\t                this.context.allowIn = false;\n\t                var declarations = this.parseVariableDeclarationList({ inFor: true });\n\t                this.context.allowIn = previousAllowIn;\n\t                if (declarations.length === 1 && this.matchKeyword('in')) {\n\t                    var decl = declarations[0];\n\t                    if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {\n\t                        this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');\n\t                    }\n\t                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t                    this.nextToken();\n\t                    left = init;\n\t                    right = this.parseExpression();\n\t                    init = null;\n\t                }\n\t                else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {\n\t                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t                    this.nextToken();\n\t                    left = init;\n\t                    right = this.parseAssignmentExpression();\n\t                    init = null;\n\t                    forIn = false;\n\t                }\n\t                else {\n\t                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t                    this.expect(';');\n\t                }\n\t            }\n\t            else if (this.matchKeyword('const') || this.matchKeyword('let')) {\n\t                init = this.createNode();\n\t                var kind = this.nextToken().value;\n\t                if (!this.context.strict && this.lookahead.value === 'in') {\n\t                    init = this.finalize(init, new Node.Identifier(kind));\n\t                    this.nextToken();\n\t                    left = init;\n\t                    right = this.parseExpression();\n\t                    init = null;\n\t                }\n\t                else {\n\t                    var previousAllowIn = this.context.allowIn;\n\t                    this.context.allowIn = false;\n\t                    var declarations = this.parseBindingList(kind, { inFor: true });\n\t                    this.context.allowIn = previousAllowIn;\n\t                    if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {\n\t                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t                        this.nextToken();\n\t                        left = init;\n\t                        right = this.parseExpression();\n\t                        init = null;\n\t                    }\n\t                    else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {\n\t                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t                        this.nextToken();\n\t                        left = init;\n\t                        right = this.parseAssignmentExpression();\n\t                        init = null;\n\t                        forIn = false;\n\t                    }\n\t                    else {\n\t                        this.consumeSemicolon();\n\t                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t                    }\n\t                }\n\t            }\n\t            else {\n\t                var initStartToken = this.lookahead;\n\t                var previousAllowIn = this.context.allowIn;\n\t                this.context.allowIn = false;\n\t                init = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t                this.context.allowIn = previousAllowIn;\n\t                if (this.matchKeyword('in')) {\n\t                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInForIn);\n\t                    }\n\t                    this.nextToken();\n\t                    this.reinterpretExpressionAsPattern(init);\n\t                    left = init;\n\t                    right = this.parseExpression();\n\t                    init = null;\n\t                }\n\t                else if (this.matchContextualKeyword('of')) {\n\t                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);\n\t                    }\n\t                    this.nextToken();\n\t                    this.reinterpretExpressionAsPattern(init);\n\t                    left = init;\n\t                    right = this.parseAssignmentExpression();\n\t                    init = null;\n\t                    forIn = false;\n\t                }\n\t                else {\n\t                    if (this.match(',')) {\n\t                        var initSeq = [init];\n\t                        while (this.match(',')) {\n\t                            this.nextToken();\n\t                            initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));\n\t                        }\n\t                        init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));\n\t                    }\n\t                    this.expect(';');\n\t                }\n\t            }\n\t        }\n\t        if (typeof left === 'undefined') {\n\t            if (!this.match(';')) {\n\t                test = this.parseExpression();\n\t            }\n\t            this.expect(';');\n\t            if (!this.match(')')) {\n\t                update = this.parseExpression();\n\t            }\n\t        }\n\t        var body;\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t            body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            var previousInIteration = this.context.inIteration;\n\t            this.context.inIteration = true;\n\t            body = this.isolateCoverGrammar(this.parseStatement);\n\t            this.context.inIteration = previousInIteration;\n\t        }\n\t        return (typeof left === 'undefined') ?\n\t            this.finalize(node, new Node.ForStatement(init, test, update, body)) :\n\t            forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :\n\t                this.finalize(node, new Node.ForOfStatement(left, right, body));\n\t    };\n\t    // ECMA-262 13.8 The continue statement\n\t    Parser.prototype.parseContinueStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('continue');\n\t        var label = null;\n\t        if (this.lookahead.type === token_1.Token.Identifier && !this.hasLineTerminator) {\n\t            label = this.parseVariableIdentifier();\n\t            var key = '$' + label.name;\n\t            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t                this.throwError(messages_1.Messages.UnknownLabel, label.name);\n\t            }\n\t        }\n\t        this.consumeSemicolon();\n\t        if (label === null && !this.context.inIteration) {\n\t            this.throwError(messages_1.Messages.IllegalContinue);\n\t        }\n\t        return this.finalize(node, new Node.ContinueStatement(label));\n\t    };\n\t    // ECMA-262 13.9 The break statement\n\t    Parser.prototype.parseBreakStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('break');\n\t        var label = null;\n\t        if (this.lookahead.type === token_1.Token.Identifier && !this.hasLineTerminator) {\n\t            label = this.parseVariableIdentifier();\n\t            var key = '$' + label.name;\n\t            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t                this.throwError(messages_1.Messages.UnknownLabel, label.name);\n\t            }\n\t        }\n\t        this.consumeSemicolon();\n\t        if (label === null && !this.context.inIteration && !this.context.inSwitch) {\n\t            this.throwError(messages_1.Messages.IllegalBreak);\n\t        }\n\t        return this.finalize(node, new Node.BreakStatement(label));\n\t    };\n\t    // ECMA-262 13.10 The return statement\n\t    Parser.prototype.parseReturnStatement = function () {\n\t        if (!this.context.inFunctionBody) {\n\t            this.tolerateError(messages_1.Messages.IllegalReturn);\n\t        }\n\t        var node = this.createNode();\n\t        this.expectKeyword('return');\n\t        var hasArgument = !this.match(';') && !this.match('}') &&\n\t            !this.hasLineTerminator && this.lookahead.type !== token_1.Token.EOF;\n\t        var argument = hasArgument ? this.parseExpression() : null;\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ReturnStatement(argument));\n\t    };\n\t    // ECMA-262 13.11 The with statement\n\t    Parser.prototype.parseWithStatement = function () {\n\t        if (this.context.strict) {\n\t            this.tolerateError(messages_1.Messages.StrictModeWith);\n\t        }\n\t        var node = this.createNode();\n\t        this.expectKeyword('with');\n\t        this.expect('(');\n\t        var object = this.parseExpression();\n\t        this.expect(')');\n\t        var body = this.parseStatement();\n\t        return this.finalize(node, new Node.WithStatement(object, body));\n\t    };\n\t    // ECMA-262 13.12 The switch statement\n\t    Parser.prototype.parseSwitchCase = function () {\n\t        var node = this.createNode();\n\t        var test;\n\t        if (this.matchKeyword('default')) {\n\t            this.nextToken();\n\t            test = null;\n\t        }\n\t        else {\n\t            this.expectKeyword('case');\n\t            test = this.parseExpression();\n\t        }\n\t        this.expect(':');\n\t        var consequent = [];\n\t        while (true) {\n\t            if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {\n\t                break;\n\t            }\n\t            consequent.push(this.parseStatementListItem());\n\t        }\n\t        return this.finalize(node, new Node.SwitchCase(test, consequent));\n\t    };\n\t    Parser.prototype.parseSwitchStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('switch');\n\t        this.expect('(');\n\t        var discriminant = this.parseExpression();\n\t        this.expect(')');\n\t        var previousInSwitch = this.context.inSwitch;\n\t        this.context.inSwitch = true;\n\t        var cases = [];\n\t        var defaultFound = false;\n\t        this.expect('{');\n\t        while (true) {\n\t            if (this.match('}')) {\n\t                break;\n\t            }\n\t            var clause = this.parseSwitchCase();\n\t            if (clause.test === null) {\n\t                if (defaultFound) {\n\t                    this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);\n\t                }\n\t                defaultFound = true;\n\t            }\n\t            cases.push(clause);\n\t        }\n\t        this.expect('}');\n\t        this.context.inSwitch = previousInSwitch;\n\t        return this.finalize(node, new Node.SwitchStatement(discriminant, cases));\n\t    };\n\t    // ECMA-262 13.13 Labelled Statements\n\t    Parser.prototype.parseLabelledStatement = function () {\n\t        var node = this.createNode();\n\t        var expr = this.parseExpression();\n\t        var statement;\n\t        if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {\n\t            this.nextToken();\n\t            var id = (expr);\n\t            var key = '$' + id.name;\n\t            if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t                this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);\n\t            }\n\t            this.context.labelSet[key] = true;\n\t            var labeledBody = this.parseStatement();\n\t            delete this.context.labelSet[key];\n\t            statement = new Node.LabeledStatement(id, labeledBody);\n\t        }\n\t        else {\n\t            this.consumeSemicolon();\n\t            statement = new Node.ExpressionStatement(expr);\n\t        }\n\t        return this.finalize(node, statement);\n\t    };\n\t    // ECMA-262 13.14 The throw statement\n\t    Parser.prototype.parseThrowStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('throw');\n\t        if (this.hasLineTerminator) {\n\t            this.throwError(messages_1.Messages.NewlineAfterThrow);\n\t        }\n\t        var argument = this.parseExpression();\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ThrowStatement(argument));\n\t    };\n\t    // ECMA-262 13.15 The try statement\n\t    Parser.prototype.parseCatchClause = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('catch');\n\t        this.expect('(');\n\t        if (this.match(')')) {\n\t            this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        var params = [];\n\t        var param = this.parsePattern(params);\n\t        var paramMap = {};\n\t        for (var i = 0; i < params.length; i++) {\n\t            var key = '$' + params[i].value;\n\t            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {\n\t                this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);\n\t            }\n\t            paramMap[key] = true;\n\t        }\n\t        if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {\n\t            if (this.scanner.isRestrictedWord((param).name)) {\n\t                this.tolerateError(messages_1.Messages.StrictCatchVariable);\n\t            }\n\t        }\n\t        this.expect(')');\n\t        var body = this.parseBlock();\n\t        return this.finalize(node, new Node.CatchClause(param, body));\n\t    };\n\t    Parser.prototype.parseFinallyClause = function () {\n\t        this.expectKeyword('finally');\n\t        return this.parseBlock();\n\t    };\n\t    Parser.prototype.parseTryStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('try');\n\t        var block = this.parseBlock();\n\t        var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;\n\t        var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;\n\t        if (!handler && !finalizer) {\n\t            this.throwError(messages_1.Messages.NoCatchOrFinally);\n\t        }\n\t        return this.finalize(node, new Node.TryStatement(block, handler, finalizer));\n\t    };\n\t    // ECMA-262 13.16 The debugger statement\n\t    Parser.prototype.parseDebuggerStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('debugger');\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.DebuggerStatement());\n\t    };\n\t    // ECMA-262 13 Statements\n\t    Parser.prototype.parseStatement = function () {\n\t        var statement = null;\n\t        switch (this.lookahead.type) {\n\t            case token_1.Token.BooleanLiteral:\n\t            case token_1.Token.NullLiteral:\n\t            case token_1.Token.NumericLiteral:\n\t            case token_1.Token.StringLiteral:\n\t            case token_1.Token.Template:\n\t            case token_1.Token.RegularExpression:\n\t                statement = this.parseExpressionStatement();\n\t                break;\n\t            case token_1.Token.Punctuator:\n\t                var value = this.lookahead.value;\n\t                if (value === '{') {\n\t                    statement = this.parseBlock();\n\t                }\n\t                else if (value === '(') {\n\t                    statement = this.parseExpressionStatement();\n\t                }\n\t                else if (value === ';') {\n\t                    statement = this.parseEmptyStatement();\n\t                }\n\t                else {\n\t                    statement = this.parseExpressionStatement();\n\t                }\n\t                break;\n\t            case token_1.Token.Identifier:\n\t                statement = this.parseLabelledStatement();\n\t                break;\n\t            case token_1.Token.Keyword:\n\t                switch (this.lookahead.value) {\n\t                    case 'break':\n\t                        statement = this.parseBreakStatement();\n\t                        break;\n\t                    case 'continue':\n\t                        statement = this.parseContinueStatement();\n\t                        break;\n\t                    case 'debugger':\n\t                        statement = this.parseDebuggerStatement();\n\t                        break;\n\t                    case 'do':\n\t                        statement = this.parseDoWhileStatement();\n\t                        break;\n\t                    case 'for':\n\t                        statement = this.parseForStatement();\n\t                        break;\n\t                    case 'function':\n\t                        statement = this.parseFunctionDeclaration();\n\t                        break;\n\t                    case 'if':\n\t                        statement = this.parseIfStatement();\n\t                        break;\n\t                    case 'return':\n\t                        statement = this.parseReturnStatement();\n\t                        break;\n\t                    case 'switch':\n\t                        statement = this.parseSwitchStatement();\n\t                        break;\n\t                    case 'throw':\n\t                        statement = this.parseThrowStatement();\n\t                        break;\n\t                    case 'try':\n\t                        statement = this.parseTryStatement();\n\t                        break;\n\t                    case 'var':\n\t                        statement = this.parseVariableStatement();\n\t                        break;\n\t                    case 'while':\n\t                        statement = this.parseWhileStatement();\n\t                        break;\n\t                    case 'with':\n\t                        statement = this.parseWithStatement();\n\t                        break;\n\t                    default:\n\t                        statement = this.parseExpressionStatement();\n\t                        break;\n\t                }\n\t                break;\n\t            default:\n\t                this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        return statement;\n\t    };\n\t    // ECMA-262 14.1 Function Definition\n\t    Parser.prototype.parseFunctionSourceElements = function () {\n\t        var node = this.createNode();\n\t        this.expect('{');\n\t        var body = this.parseDirectivePrologues();\n\t        var previousLabelSet = this.context.labelSet;\n\t        var previousInIteration = this.context.inIteration;\n\t        var previousInSwitch = this.context.inSwitch;\n\t        var previousInFunctionBody = this.context.inFunctionBody;\n\t        this.context.labelSet = {};\n\t        this.context.inIteration = false;\n\t        this.context.inSwitch = false;\n\t        this.context.inFunctionBody = true;\n\t        while (this.startMarker.index < this.scanner.length) {\n\t            if (this.match('}')) {\n\t                break;\n\t            }\n\t            body.push(this.parseStatementListItem());\n\t        }\n\t        this.expect('}');\n\t        this.context.labelSet = previousLabelSet;\n\t        this.context.inIteration = previousInIteration;\n\t        this.context.inSwitch = previousInSwitch;\n\t        this.context.inFunctionBody = previousInFunctionBody;\n\t        return this.finalize(node, new Node.BlockStatement(body));\n\t    };\n\t    Parser.prototype.validateParam = function (options, param, name) {\n\t        var key = '$' + name;\n\t        if (this.context.strict) {\n\t            if (this.scanner.isRestrictedWord(name)) {\n\t                options.stricted = param;\n\t                options.message = messages_1.Messages.StrictParamName;\n\t            }\n\t            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n\t                options.stricted = param;\n\t                options.message = messages_1.Messages.StrictParamDupe;\n\t            }\n\t        }\n\t        else if (!options.firstRestricted) {\n\t            if (this.scanner.isRestrictedWord(name)) {\n\t                options.firstRestricted = param;\n\t                options.message = messages_1.Messages.StrictParamName;\n\t            }\n\t            else if (this.scanner.isStrictModeReservedWord(name)) {\n\t                options.firstRestricted = param;\n\t                options.message = messages_1.Messages.StrictReservedWord;\n\t            }\n\t            else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n\t                options.stricted = param;\n\t                options.message = messages_1.Messages.StrictParamDupe;\n\t            }\n\t        }\n\t        /* istanbul ignore next */\n\t        if (typeof Object.defineProperty === 'function') {\n\t            Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });\n\t        }\n\t        else {\n\t            options.paramSet[key] = true;\n\t        }\n\t    };\n\t    Parser.prototype.parseRestElement = function (params) {\n\t        var node = this.createNode();\n\t        this.expect('...');\n\t        var arg = this.parsePattern(params);\n\t        if (this.match('=')) {\n\t            this.throwError(messages_1.Messages.DefaultRestParameter);\n\t        }\n\t        if (!this.match(')')) {\n\t            this.throwError(messages_1.Messages.ParameterAfterRestParameter);\n\t        }\n\t        return this.finalize(node, new Node.RestElement(arg));\n\t    };\n\t    Parser.prototype.parseFormalParameter = function (options) {\n\t        var params = [];\n\t        var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);\n\t        for (var i = 0; i < params.length; i++) {\n\t            this.validateParam(options, params[i], params[i].value);\n\t        }\n\t        options.params.push(param);\n\t        return !this.match(')');\n\t    };\n\t    Parser.prototype.parseFormalParameters = function (firstRestricted) {\n\t        var options;\n\t        options = {\n\t            params: [],\n\t            firstRestricted: firstRestricted\n\t        };\n\t        this.expect('(');\n\t        if (!this.match(')')) {\n\t            options.paramSet = {};\n\t            while (this.startMarker.index < this.scanner.length) {\n\t                if (!this.parseFormalParameter(options)) {\n\t                    break;\n\t                }\n\t                this.expect(',');\n\t            }\n\t        }\n\t        this.expect(')');\n\t        return {\n\t            params: options.params,\n\t            stricted: options.stricted,\n\t            firstRestricted: options.firstRestricted,\n\t            message: options.message\n\t        };\n\t    };\n\t    Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {\n\t        var node = this.createNode();\n\t        this.expectKeyword('function');\n\t        var isGenerator = this.match('*');\n\t        if (isGenerator) {\n\t            this.nextToken();\n\t        }\n\t        var message;\n\t        var id = null;\n\t        var firstRestricted = null;\n\t        if (!identifierIsOptional || !this.match('(')) {\n\t            var token = this.lookahead;\n\t            id = this.parseVariableIdentifier();\n\t            if (this.context.strict) {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);\n\t                }\n\t            }\n\t            else {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictFunctionName;\n\t                }\n\t                else if (this.scanner.isStrictModeReservedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictReservedWord;\n\t                }\n\t            }\n\t        }\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = !isGenerator;\n\t        var formalParameters = this.parseFormalParameters(firstRestricted);\n\t        var params = formalParameters.params;\n\t        var stricted = formalParameters.stricted;\n\t        firstRestricted = formalParameters.firstRestricted;\n\t        if (formalParameters.message) {\n\t            message = formalParameters.message;\n\t        }\n\t        var previousStrict = this.context.strict;\n\t        var body = this.parseFunctionSourceElements();\n\t        if (this.context.strict && firstRestricted) {\n\t            this.throwUnexpectedToken(firstRestricted, message);\n\t        }\n\t        if (this.context.strict && stricted) {\n\t            this.tolerateUnexpectedToken(stricted, message);\n\t        }\n\t        this.context.strict = previousStrict;\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));\n\t    };\n\t    Parser.prototype.parseFunctionExpression = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('function');\n\t        var isGenerator = this.match('*');\n\t        if (isGenerator) {\n\t            this.nextToken();\n\t        }\n\t        var message;\n\t        var id = null;\n\t        var firstRestricted;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = !isGenerator;\n\t        if (!this.match('(')) {\n\t            var token = this.lookahead;\n\t            id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();\n\t            if (this.context.strict) {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);\n\t                }\n\t            }\n\t            else {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictFunctionName;\n\t                }\n\t                else if (this.scanner.isStrictModeReservedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictReservedWord;\n\t                }\n\t            }\n\t        }\n\t        var formalParameters = this.parseFormalParameters(firstRestricted);\n\t        var params = formalParameters.params;\n\t        var stricted = formalParameters.stricted;\n\t        firstRestricted = formalParameters.firstRestricted;\n\t        if (formalParameters.message) {\n\t            message = formalParameters.message;\n\t        }\n\t        var previousStrict = this.context.strict;\n\t        var body = this.parseFunctionSourceElements();\n\t        if (this.context.strict && firstRestricted) {\n\t            this.throwUnexpectedToken(firstRestricted, message);\n\t        }\n\t        if (this.context.strict && stricted) {\n\t            this.tolerateUnexpectedToken(stricted, message);\n\t        }\n\t        this.context.strict = previousStrict;\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));\n\t    };\n\t    // ECMA-262 14.1.1 Directive Prologues\n\t    Parser.prototype.parseDirective = function () {\n\t        var token = this.lookahead;\n\t        var directive = null;\n\t        var node = this.createNode();\n\t        var expr = this.parseExpression();\n\t        if (expr.type === syntax_1.Syntax.Literal) {\n\t            directive = this.getTokenRaw(token).slice(1, -1);\n\t        }\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, directive ? new Node.Directive(expr, directive) :\n\t            new Node.ExpressionStatement(expr));\n\t    };\n\t    Parser.prototype.parseDirectivePrologues = function () {\n\t        var firstRestricted = null;\n\t        var body = [];\n\t        while (true) {\n\t            var token = this.lookahead;\n\t            if (token.type !== token_1.Token.StringLiteral) {\n\t                break;\n\t            }\n\t            var statement = this.parseDirective();\n\t            body.push(statement);\n\t            var directive = statement.directive;\n\t            if (typeof directive !== 'string') {\n\t                break;\n\t            }\n\t            if (directive === 'use strict') {\n\t                this.context.strict = true;\n\t                if (firstRestricted) {\n\t                    this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);\n\t                }\n\t            }\n\t            else {\n\t                if (!firstRestricted && token.octal) {\n\t                    firstRestricted = token;\n\t                }\n\t            }\n\t        }\n\t        return body;\n\t    };\n\t    // ECMA-262 14.3 Method Definitions\n\t    Parser.prototype.qualifiedPropertyName = function (token) {\n\t        switch (token.type) {\n\t            case token_1.Token.Identifier:\n\t            case token_1.Token.StringLiteral:\n\t            case token_1.Token.BooleanLiteral:\n\t            case token_1.Token.NullLiteral:\n\t            case token_1.Token.NumericLiteral:\n\t            case token_1.Token.Keyword:\n\t                return true;\n\t            case token_1.Token.Punctuator:\n\t                return token.value === '[';\n\t        }\n\t        return false;\n\t    };\n\t    Parser.prototype.parseGetterMethod = function () {\n\t        var node = this.createNode();\n\t        this.expect('(');\n\t        this.expect(')');\n\t        var isGenerator = false;\n\t        var params = {\n\t            params: [],\n\t            stricted: null,\n\t            firstRestricted: null,\n\t            message: null\n\t        };\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = false;\n\t        var method = this.parsePropertyMethod(params);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));\n\t    };\n\t    Parser.prototype.parseSetterMethod = function () {\n\t        var node = this.createNode();\n\t        var options = {\n\t            params: [],\n\t            firstRestricted: null,\n\t            paramSet: {}\n\t        };\n\t        var isGenerator = false;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = false;\n\t        this.expect('(');\n\t        if (this.match(')')) {\n\t            this.tolerateUnexpectedToken(this.lookahead);\n\t        }\n\t        else {\n\t            this.parseFormalParameter(options);\n\t        }\n\t        this.expect(')');\n\t        var method = this.parsePropertyMethod(options);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, options.params, method, isGenerator));\n\t    };\n\t    Parser.prototype.parseGeneratorMethod = function () {\n\t        var node = this.createNode();\n\t        var isGenerator = true;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = true;\n\t        var params = this.parseFormalParameters();\n\t        this.context.allowYield = false;\n\t        var method = this.parsePropertyMethod(params);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));\n\t    };\n\t    // ECMA-262 14.4 Generator Function Definitions\n\t    Parser.prototype.isStartOfExpression = function () {\n\t        var start = true;\n\t        var value = this.lookahead.value;\n\t        switch (this.lookahead.type) {\n\t            case token_1.Token.Punctuator:\n\t                start = (value === '[') || (value === '(') || (value === '{') ||\n\t                    (value === '+') || (value === '-') ||\n\t                    (value === '!') || (value === '~') ||\n\t                    (value === '++') || (value === '--') ||\n\t                    (value === '/') || (value === '/='); // regular expression literal\n\t                break;\n\t            case token_1.Token.Keyword:\n\t                start = (value === 'class') || (value === 'delete') ||\n\t                    (value === 'function') || (value === 'let') || (value === 'new') ||\n\t                    (value === 'super') || (value === 'this') || (value === 'typeof') ||\n\t                    (value === 'void') || (value === 'yield');\n\t                break;\n\t            default:\n\t                break;\n\t        }\n\t        return start;\n\t    };\n\t    Parser.prototype.parseYieldExpression = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('yield');\n\t        var argument = null;\n\t        var delegate = false;\n\t        if (!this.hasLineTerminator) {\n\t            var previousAllowYield = this.context.allowYield;\n\t            this.context.allowYield = false;\n\t            delegate = this.match('*');\n\t            if (delegate) {\n\t                this.nextToken();\n\t                argument = this.parseAssignmentExpression();\n\t            }\n\t            else if (this.isStartOfExpression()) {\n\t                argument = this.parseAssignmentExpression();\n\t            }\n\t            this.context.allowYield = previousAllowYield;\n\t        }\n\t        return this.finalize(node, new Node.YieldExpression(argument, delegate));\n\t    };\n\t    // ECMA-262 14.5 Class Definitions\n\t    Parser.prototype.parseClassElement = function (hasConstructor) {\n\t        var token = this.lookahead;\n\t        var node = this.createNode();\n\t        var kind;\n\t        var key;\n\t        var value;\n\t        var computed = false;\n\t        var method = false;\n\t        var isStatic = false;\n\t        if (this.match('*')) {\n\t            this.nextToken();\n\t        }\n\t        else {\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            var id = key;\n\t            if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {\n\t                token = this.lookahead;\n\t                isStatic = true;\n\t                computed = this.match('[');\n\t                if (this.match('*')) {\n\t                    this.nextToken();\n\t                }\n\t                else {\n\t                    key = this.parseObjectPropertyKey();\n\t                }\n\t            }\n\t        }\n\t        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);\n\t        if (token.type === token_1.Token.Identifier) {\n\t            if (token.value === 'get' && lookaheadPropertyKey) {\n\t                kind = 'get';\n\t                computed = this.match('[');\n\t                key = this.parseObjectPropertyKey();\n\t                this.context.allowYield = false;\n\t                value = this.parseGetterMethod();\n\t            }\n\t            else if (token.value === 'set' && lookaheadPropertyKey) {\n\t                kind = 'set';\n\t                computed = this.match('[');\n\t                key = this.parseObjectPropertyKey();\n\t                value = this.parseSetterMethod();\n\t            }\n\t        }\n\t        else if (token.type === token_1.Token.Punctuator && token.value === '*' && lookaheadPropertyKey) {\n\t            kind = 'init';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            value = this.parseGeneratorMethod();\n\t            method = true;\n\t        }\n\t        if (!kind && key && this.match('(')) {\n\t            kind = 'init';\n\t            value = this.parsePropertyMethodFunction();\n\t            method = true;\n\t        }\n\t        if (!kind) {\n\t            this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        if (kind === 'init') {\n\t            kind = 'method';\n\t        }\n\t        if (!computed) {\n\t            if (isStatic && this.isPropertyKey(key, 'prototype')) {\n\t                this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);\n\t            }\n\t            if (!isStatic && this.isPropertyKey(key, 'constructor')) {\n\t                if (kind !== 'method' || !method || value.generator) {\n\t                    this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);\n\t                }\n\t                if (hasConstructor.value) {\n\t                    this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);\n\t                }\n\t                else {\n\t                    hasConstructor.value = true;\n\t                }\n\t                kind = 'constructor';\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));\n\t    };\n\t    Parser.prototype.parseClassElementList = function () {\n\t        var body = [];\n\t        var hasConstructor = { value: false };\n\t        this.expect('{');\n\t        while (!this.match('}')) {\n\t            if (this.match(';')) {\n\t                this.nextToken();\n\t            }\n\t            else {\n\t                body.push(this.parseClassElement(hasConstructor));\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return body;\n\t    };\n\t    Parser.prototype.parseClassBody = function () {\n\t        var node = this.createNode();\n\t        var elementList = this.parseClassElementList();\n\t        return this.finalize(node, new Node.ClassBody(elementList));\n\t    };\n\t    Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {\n\t        var node = this.createNode();\n\t        var previousStrict = this.context.strict;\n\t        this.context.strict = true;\n\t        this.expectKeyword('class');\n\t        var id = (identifierIsOptional && (this.lookahead.type !== token_1.Token.Identifier)) ? null : this.parseVariableIdentifier();\n\t        var superClass = null;\n\t        if (this.matchKeyword('extends')) {\n\t            this.nextToken();\n\t            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t        }\n\t        var classBody = this.parseClassBody();\n\t        this.context.strict = previousStrict;\n\t        return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));\n\t    };\n\t    Parser.prototype.parseClassExpression = function () {\n\t        var node = this.createNode();\n\t        var previousStrict = this.context.strict;\n\t        this.context.strict = true;\n\t        this.expectKeyword('class');\n\t        var id = (this.lookahead.type === token_1.Token.Identifier) ? this.parseVariableIdentifier() : null;\n\t        var superClass = null;\n\t        if (this.matchKeyword('extends')) {\n\t            this.nextToken();\n\t            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t        }\n\t        var classBody = this.parseClassBody();\n\t        this.context.strict = previousStrict;\n\t        return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));\n\t    };\n\t    // ECMA-262 15.1 Scripts\n\t    // ECMA-262 15.2 Modules\n\t    Parser.prototype.parseProgram = function () {\n\t        var node = this.createNode();\n\t        var body = this.parseDirectivePrologues();\n\t        while (this.startMarker.index < this.scanner.length) {\n\t            body.push(this.parseStatementListItem());\n\t        }\n\t        return this.finalize(node, new Node.Program(body, this.sourceType));\n\t    };\n\t    // ECMA-262 15.2.2 Imports\n\t    Parser.prototype.parseModuleSpecifier = function () {\n\t        var node = this.createNode();\n\t        if (this.lookahead.type !== token_1.Token.StringLiteral) {\n\t            this.throwError(messages_1.Messages.InvalidModuleSpecifier);\n\t        }\n\t        var token = this.nextToken();\n\t        var raw = this.getTokenRaw(token);\n\t        return this.finalize(node, new Node.Literal(token.value, raw));\n\t    };\n\t    // import {<foo as bar>} ...;\n\t    Parser.prototype.parseImportSpecifier = function () {\n\t        var node = this.createNode();\n\t        var imported;\n\t        var local;\n\t        if (this.lookahead.type === token_1.Token.Identifier) {\n\t            imported = this.parseVariableIdentifier();\n\t            local = imported;\n\t            if (this.matchContextualKeyword('as')) {\n\t                this.nextToken();\n\t                local = this.parseVariableIdentifier();\n\t            }\n\t        }\n\t        else {\n\t            imported = this.parseIdentifierName();\n\t            local = imported;\n\t            if (this.matchContextualKeyword('as')) {\n\t                this.nextToken();\n\t                local = this.parseVariableIdentifier();\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.nextToken());\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.ImportSpecifier(local, imported));\n\t    };\n\t    // {foo, bar as bas}\n\t    Parser.prototype.parseNamedImports = function () {\n\t        this.expect('{');\n\t        var specifiers = [];\n\t        while (!this.match('}')) {\n\t            specifiers.push(this.parseImportSpecifier());\n\t            if (!this.match('}')) {\n\t                this.expect(',');\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return specifiers;\n\t    };\n\t    // import <foo> ...;\n\t    Parser.prototype.parseImportDefaultSpecifier = function () {\n\t        var node = this.createNode();\n\t        var local = this.parseIdentifierName();\n\t        return this.finalize(node, new Node.ImportDefaultSpecifier(local));\n\t    };\n\t    // import <* as foo> ...;\n\t    Parser.prototype.parseImportNamespaceSpecifier = function () {\n\t        var node = this.createNode();\n\t        this.expect('*');\n\t        if (!this.matchContextualKeyword('as')) {\n\t            this.throwError(messages_1.Messages.NoAsAfterImportNamespace);\n\t        }\n\t        this.nextToken();\n\t        var local = this.parseIdentifierName();\n\t        return this.finalize(node, new Node.ImportNamespaceSpecifier(local));\n\t    };\n\t    Parser.prototype.parseImportDeclaration = function () {\n\t        if (this.context.inFunctionBody) {\n\t            this.throwError(messages_1.Messages.IllegalImportDeclaration);\n\t        }\n\t        var node = this.createNode();\n\t        this.expectKeyword('import');\n\t        var src;\n\t        var specifiers = [];\n\t        if (this.lookahead.type === token_1.Token.StringLiteral) {\n\t            // import 'foo';\n\t            src = this.parseModuleSpecifier();\n\t        }\n\t        else {\n\t            if (this.match('{')) {\n\t                // import {bar}\n\t                specifiers = specifiers.concat(this.parseNamedImports());\n\t            }\n\t            else if (this.match('*')) {\n\t                // import * as foo\n\t                specifiers.push(this.parseImportNamespaceSpecifier());\n\t            }\n\t            else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {\n\t                // import foo\n\t                specifiers.push(this.parseImportDefaultSpecifier());\n\t                if (this.match(',')) {\n\t                    this.nextToken();\n\t                    if (this.match('*')) {\n\t                        // import foo, * as foo\n\t                        specifiers.push(this.parseImportNamespaceSpecifier());\n\t                    }\n\t                    else if (this.match('{')) {\n\t                        // import foo, {bar}\n\t                        specifiers = specifiers.concat(this.parseNamedImports());\n\t                    }\n\t                    else {\n\t                        this.throwUnexpectedToken(this.lookahead);\n\t                    }\n\t                }\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.nextToken());\n\t            }\n\t            if (!this.matchContextualKeyword('from')) {\n\t                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t                this.throwError(message, this.lookahead.value);\n\t            }\n\t            this.nextToken();\n\t            src = this.parseModuleSpecifier();\n\t        }\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ImportDeclaration(specifiers, src));\n\t    };\n\t    // ECMA-262 15.2.3 Exports\n\t    Parser.prototype.parseExportSpecifier = function () {\n\t        var node = this.createNode();\n\t        var local = this.parseIdentifierName();\n\t        var exported = local;\n\t        if (this.matchContextualKeyword('as')) {\n\t            this.nextToken();\n\t            exported = this.parseIdentifierName();\n\t        }\n\t        return this.finalize(node, new Node.ExportSpecifier(local, exported));\n\t    };\n\t    Parser.prototype.parseExportDeclaration = function () {\n\t        if (this.context.inFunctionBody) {\n\t            this.throwError(messages_1.Messages.IllegalExportDeclaration);\n\t        }\n\t        var node = this.createNode();\n\t        this.expectKeyword('export');\n\t        var exportDeclaration;\n\t        if (this.matchKeyword('default')) {\n\t            // export default ...\n\t            this.nextToken();\n\t            if (this.matchKeyword('function')) {\n\t                // export default function foo () {}\n\t                // export default function () {}\n\t                var declaration = this.parseFunctionDeclaration(true);\n\t                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t            }\n\t            else if (this.matchKeyword('class')) {\n\t                // export default class foo {}\n\t                var declaration = this.parseClassDeclaration(true);\n\t                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t            }\n\t            else {\n\t                if (this.matchContextualKeyword('from')) {\n\t                    this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);\n\t                }\n\t                // export default {};\n\t                // export default [];\n\t                // export default (1 + 2);\n\t                var declaration = this.match('{') ? this.parseObjectInitializer() :\n\t                    this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();\n\t                this.consumeSemicolon();\n\t                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t            }\n\t        }\n\t        else if (this.match('*')) {\n\t            // export * from 'foo';\n\t            this.nextToken();\n\t            if (!this.matchContextualKeyword('from')) {\n\t                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t                this.throwError(message, this.lookahead.value);\n\t            }\n\t            this.nextToken();\n\t            var src = this.parseModuleSpecifier();\n\t            this.consumeSemicolon();\n\t            exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));\n\t        }\n\t        else if (this.lookahead.type === token_1.Token.Keyword) {\n\t            // export var f = 1;\n\t            var declaration = void 0;\n\t            switch (this.lookahead.value) {\n\t                case 'let':\n\t                case 'const':\n\t                    declaration = this.parseLexicalDeclaration({ inFor: false });\n\t                    break;\n\t                case 'var':\n\t                case 'class':\n\t                case 'function':\n\t                    declaration = this.parseStatementListItem();\n\t                    break;\n\t                default:\n\t                    this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));\n\t        }\n\t        else {\n\t            var specifiers = [];\n\t            var source = null;\n\t            var isExportFromIdentifier = false;\n\t            this.expect('{');\n\t            while (!this.match('}')) {\n\t                isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');\n\t                specifiers.push(this.parseExportSpecifier());\n\t                if (!this.match('}')) {\n\t                    this.expect(',');\n\t                }\n\t            }\n\t            this.expect('}');\n\t            if (this.matchContextualKeyword('from')) {\n\t                // export {default} from 'foo';\n\t                // export {foo} from 'foo';\n\t                this.nextToken();\n\t                source = this.parseModuleSpecifier();\n\t                this.consumeSemicolon();\n\t            }\n\t            else if (isExportFromIdentifier) {\n\t                // export {default}; // missing fromClause\n\t                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t                this.throwError(message, this.lookahead.value);\n\t            }\n\t            else {\n\t                // export {foo};\n\t                this.consumeSemicolon();\n\t            }\n\t            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));\n\t        }\n\t        return exportDeclaration;\n\t    };\n\t    return Parser;\n\t}());\n\texports.Parser = Parser;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t// Ensure the condition is true, otherwise throw an error.\n\t// This is only to have a better contract semantic, i.e. another safety net\n\t// to catch a logic error. The condition shall be fulfilled in normal case.\n\t// Do NOT use this to enforce a certain condition on any user input.\n\t\"use strict\";\n\tfunction assert(condition, message) {\n\t    /* istanbul ignore if */\n\t    if (!condition) {\n\t        throw new Error('ASSERT: ' + message);\n\t    }\n\t}\n\texports.assert = assert;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t// Error messages should be identical to V8.\n\texports.Messages = {\n\t    UnexpectedToken: 'Unexpected token %0',\n\t    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',\n\t    UnexpectedNumber: 'Unexpected number',\n\t    UnexpectedString: 'Unexpected string',\n\t    UnexpectedIdentifier: 'Unexpected identifier',\n\t    UnexpectedReserved: 'Unexpected reserved word',\n\t    UnexpectedTemplate: 'Unexpected quasi %0',\n\t    UnexpectedEOS: 'Unexpected end of input',\n\t    NewlineAfterThrow: 'Illegal newline after throw',\n\t    InvalidRegExp: 'Invalid regular expression',\n\t    UnterminatedRegExp: 'Invalid regular expression: missing /',\n\t    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',\n\t    InvalidLHSInForIn: 'Invalid left-hand side in for-in',\n\t    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',\n\t    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n\t    NoCatchOrFinally: 'Missing catch or finally after try',\n\t    UnknownLabel: 'Undefined label \\'%0\\'',\n\t    Redeclaration: '%0 \\'%1\\' has already been declared',\n\t    IllegalContinue: 'Illegal continue statement',\n\t    IllegalBreak: 'Illegal break statement',\n\t    IllegalReturn: 'Illegal return statement',\n\t    StrictModeWith: 'Strict mode code may not include a with statement',\n\t    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',\n\t    StrictVarName: 'Variable name may not be eval or arguments in strict mode',\n\t    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',\n\t    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n\t    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',\n\t    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',\n\t    StrictDelete: 'Delete of an unqualified identifier in strict mode.',\n\t    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',\n\t    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n\t    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n\t    StrictReservedWord: 'Use of future reserved word in strict mode',\n\t    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',\n\t    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',\n\t    DefaultRestParameter: 'Unexpected token =',\n\t    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',\n\t    ConstructorSpecialMethod: 'Class constructor may not be an accessor',\n\t    DuplicateConstructor: 'A class may only have one constructor',\n\t    StaticPrototype: 'Classes may not have static property named prototype',\n\t    MissingFromClause: 'Unexpected token',\n\t    NoAsAfterImportNamespace: 'Unexpected token',\n\t    InvalidModuleSpecifier: 'Unexpected token',\n\t    IllegalImportDeclaration: 'Unexpected token',\n\t    IllegalExportDeclaration: 'Unexpected token',\n\t    DuplicateBinding: 'Duplicate binding %0',\n\t    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer'\n\t};\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tvar ErrorHandler = (function () {\n\t    function ErrorHandler() {\n\t        this.errors = [];\n\t        this.tolerant = false;\n\t    }\n\t    ;\n\t    ErrorHandler.prototype.recordError = function (error) {\n\t        this.errors.push(error);\n\t    };\n\t    ;\n\t    ErrorHandler.prototype.tolerate = function (error) {\n\t        if (this.tolerant) {\n\t            this.recordError(error);\n\t        }\n\t        else {\n\t            throw error;\n\t        }\n\t    };\n\t    ;\n\t    ErrorHandler.prototype.constructError = function (msg, column) {\n\t        var error = new Error(msg);\n\t        try {\n\t            throw error;\n\t        }\n\t        catch (base) {\n\t            /* istanbul ignore else */\n\t            if (Object.create && Object.defineProperty) {\n\t                error = Object.create(base);\n\t                Object.defineProperty(error, 'column', { value: column });\n\t            }\n\t        }\n\t        finally {\n\t            return error;\n\t        }\n\t    };\n\t    ;\n\t    ErrorHandler.prototype.createError = function (index, line, col, description) {\n\t        var msg = 'Line ' + line + ': ' + description;\n\t        var error = this.constructError(msg, col);\n\t        error.index = index;\n\t        error.lineNumber = line;\n\t        error.description = description;\n\t        return error;\n\t    };\n\t    ;\n\t    ErrorHandler.prototype.throwError = function (index, line, col, description) {\n\t        throw this.createError(index, line, col, description);\n\t    };\n\t    ;\n\t    ErrorHandler.prototype.tolerateError = function (index, line, col, description) {\n\t        var error = this.createError(index, line, col, description);\n\t        if (this.tolerant) {\n\t            this.recordError(error);\n\t        }\n\t        else {\n\t            throw error;\n\t        }\n\t    };\n\t    ;\n\t    return ErrorHandler;\n\t}());\n\texports.ErrorHandler = ErrorHandler;\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t(function (Token) {\n\t    Token[Token[\"BooleanLiteral\"] = 1] = \"BooleanLiteral\";\n\t    Token[Token[\"EOF\"] = 2] = \"EOF\";\n\t    Token[Token[\"Identifier\"] = 3] = \"Identifier\";\n\t    Token[Token[\"Keyword\"] = 4] = \"Keyword\";\n\t    Token[Token[\"NullLiteral\"] = 5] = \"NullLiteral\";\n\t    Token[Token[\"NumericLiteral\"] = 6] = \"NumericLiteral\";\n\t    Token[Token[\"Punctuator\"] = 7] = \"Punctuator\";\n\t    Token[Token[\"StringLiteral\"] = 8] = \"StringLiteral\";\n\t    Token[Token[\"RegularExpression\"] = 9] = \"RegularExpression\";\n\t    Token[Token[\"Template\"] = 10] = \"Template\";\n\t})(exports.Token || (exports.Token = {}));\n\tvar Token = exports.Token;\n\t;\n\texports.TokenName = {};\n\texports.TokenName[Token.BooleanLiteral] = 'Boolean';\n\texports.TokenName[Token.EOF] = '<end>';\n\texports.TokenName[Token.Identifier] = 'Identifier';\n\texports.TokenName[Token.Keyword] = 'Keyword';\n\texports.TokenName[Token.NullLiteral] = 'Null';\n\texports.TokenName[Token.NumericLiteral] = 'Numeric';\n\texports.TokenName[Token.Punctuator] = 'Punctuator';\n\texports.TokenName[Token.StringLiteral] = 'String';\n\texports.TokenName[Token.RegularExpression] = 'RegularExpression';\n\texports.TokenName[Token.Template] = 'Template';\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar assert_1 = __webpack_require__(4);\n\tvar messages_1 = __webpack_require__(5);\n\tvar character_1 = __webpack_require__(9);\n\tvar token_1 = __webpack_require__(7);\n\tfunction hexValue(ch) {\n\t    return '0123456789abcdef'.indexOf(ch.toLowerCase());\n\t}\n\tfunction octalValue(ch) {\n\t    return '01234567'.indexOf(ch);\n\t}\n\tvar Scanner = (function () {\n\t    function Scanner(code, handler) {\n\t        this.source = code;\n\t        this.errorHandler = handler;\n\t        this.trackComment = false;\n\t        this.length = code.length;\n\t        this.index = 0;\n\t        this.lineNumber = (code.length > 0) ? 1 : 0;\n\t        this.lineStart = 0;\n\t        this.curlyStack = [];\n\t    }\n\t    ;\n\t    Scanner.prototype.eof = function () {\n\t        return this.index >= this.length;\n\t    };\n\t    ;\n\t    Scanner.prototype.throwUnexpectedToken = function (message) {\n\t        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }\n\t        this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);\n\t    };\n\t    ;\n\t    Scanner.prototype.tolerateUnexpectedToken = function () {\n\t        this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, messages_1.Messages.UnexpectedTokenIllegal);\n\t    };\n\t    ;\n\t    // ECMA-262 11.4 Comments\n\t    Scanner.prototype.skipSingleLineComment = function (offset) {\n\t        var comments;\n\t        var start, loc;\n\t        if (this.trackComment) {\n\t            comments = [];\n\t            start = this.index - offset;\n\t            loc = {\n\t                start: {\n\t                    line: this.lineNumber,\n\t                    column: this.index - this.lineStart - offset\n\t                },\n\t                end: {}\n\t            };\n\t        }\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            ++this.index;\n\t            if (character_1.Character.isLineTerminator(ch)) {\n\t                if (this.trackComment) {\n\t                    loc.end = {\n\t                        line: this.lineNumber,\n\t                        column: this.index - this.lineStart - 1\n\t                    };\n\t                    var entry = {\n\t                        multiLine: false,\n\t                        slice: [start + offset, this.index - 1],\n\t                        range: [start, this.index - 1],\n\t                        loc: loc\n\t                    };\n\t                    comments.push(entry);\n\t                }\n\t                if (ch === 13 && this.source.charCodeAt(this.index) === 10) {\n\t                    ++this.index;\n\t                }\n\t                ++this.lineNumber;\n\t                this.lineStart = this.index;\n\t                return comments;\n\t            }\n\t        }\n\t        if (this.trackComment) {\n\t            loc.end = {\n\t                line: this.lineNumber,\n\t                column: this.index - this.lineStart\n\t            };\n\t            var entry = {\n\t                multiLine: false,\n\t                slice: [start + offset, this.index],\n\t                range: [start, this.index],\n\t                loc: loc\n\t            };\n\t            comments.push(entry);\n\t        }\n\t        return comments;\n\t    };\n\t    ;\n\t    Scanner.prototype.skipMultiLineComment = function () {\n\t        var comments;\n\t        var start, loc;\n\t        if (this.trackComment) {\n\t            comments = [];\n\t            start = this.index - 2;\n\t            loc = {\n\t                start: {\n\t                    line: this.lineNumber,\n\t                    column: this.index - this.lineStart - 2\n\t                },\n\t                end: {}\n\t            };\n\t        }\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            if (character_1.Character.isLineTerminator(ch)) {\n\t                if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {\n\t                    ++this.index;\n\t                }\n\t                ++this.lineNumber;\n\t                ++this.index;\n\t                this.lineStart = this.index;\n\t            }\n\t            else if (ch === 0x2A) {\n\t                // Block comment ends with '*/'.\n\t                if (this.source.charCodeAt(this.index + 1) === 0x2F) {\n\t                    this.index += 2;\n\t                    if (this.trackComment) {\n\t                        loc.end = {\n\t                            line: this.lineNumber,\n\t                            column: this.index - this.lineStart\n\t                        };\n\t                        var entry = {\n\t                            multiLine: true,\n\t                            slice: [start + 2, this.index - 2],\n\t                            range: [start, this.index],\n\t                            loc: loc\n\t                        };\n\t                        comments.push(entry);\n\t                    }\n\t                    return comments;\n\t                }\n\t                ++this.index;\n\t            }\n\t            else {\n\t                ++this.index;\n\t            }\n\t        }\n\t        // Ran off the end of the file - the whole thing is a comment\n\t        if (this.trackComment) {\n\t            loc.end = {\n\t                line: this.lineNumber,\n\t                column: this.index - this.lineStart\n\t            };\n\t            var entry = {\n\t                multiLine: true,\n\t                slice: [start + 2, this.index],\n\t                range: [start, this.index],\n\t                loc: loc\n\t            };\n\t            comments.push(entry);\n\t        }\n\t        this.tolerateUnexpectedToken();\n\t        return comments;\n\t    };\n\t    ;\n\t    Scanner.prototype.scanComments = function () {\n\t        var comments;\n\t        if (this.trackComment) {\n\t            comments = [];\n\t        }\n\t        var start = (this.index === 0);\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            if (character_1.Character.isWhiteSpace(ch)) {\n\t                ++this.index;\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch)) {\n\t                ++this.index;\n\t                if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {\n\t                    ++this.index;\n\t                }\n\t                ++this.lineNumber;\n\t                this.lineStart = this.index;\n\t                start = true;\n\t            }\n\t            else if (ch === 0x2F) {\n\t                ch = this.source.charCodeAt(this.index + 1);\n\t                if (ch === 0x2F) {\n\t                    this.index += 2;\n\t                    var comment = this.skipSingleLineComment(2);\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                    start = true;\n\t                }\n\t                else if (ch === 0x2A) {\n\t                    this.index += 2;\n\t                    var comment = this.skipMultiLineComment();\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            else if (start && ch === 0x2D) {\n\t                // U+003E is '>'\n\t                if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {\n\t                    // '-->' is a single-line comment\n\t                    this.index += 3;\n\t                    var comment = this.skipSingleLineComment(3);\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            else if (ch === 0x3C) {\n\t                if (this.source.slice(this.index + 1, this.index + 4) === '!--') {\n\t                    this.index += 4; // `<!--`\n\t                    var comment = this.skipSingleLineComment(4);\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return comments;\n\t    };\n\t    ;\n\t    // ECMA-262 11.6.2.2 Future Reserved Words\n\t    Scanner.prototype.isFutureReservedWord = function (id) {\n\t        switch (id) {\n\t            case 'enum':\n\t            case 'export':\n\t            case 'import':\n\t            case 'super':\n\t                return true;\n\t            default:\n\t                return false;\n\t        }\n\t    };\n\t    ;\n\t    Scanner.prototype.isStrictModeReservedWord = function (id) {\n\t        switch (id) {\n\t            case 'implements':\n\t            case 'interface':\n\t            case 'package':\n\t            case 'private':\n\t            case 'protected':\n\t            case 'public':\n\t            case 'static':\n\t            case 'yield':\n\t            case 'let':\n\t                return true;\n\t            default:\n\t                return false;\n\t        }\n\t    };\n\t    ;\n\t    Scanner.prototype.isRestrictedWord = function (id) {\n\t        return id === 'eval' || id === 'arguments';\n\t    };\n\t    ;\n\t    // ECMA-262 11.6.2.1 Keywords\n\t    Scanner.prototype.isKeyword = function (id) {\n\t        switch (id.length) {\n\t            case 2:\n\t                return (id === 'if') || (id === 'in') || (id === 'do');\n\t            case 3:\n\t                return (id === 'var') || (id === 'for') || (id === 'new') ||\n\t                    (id === 'try') || (id === 'let');\n\t            case 4:\n\t                return (id === 'this') || (id === 'else') || (id === 'case') ||\n\t                    (id === 'void') || (id === 'with') || (id === 'enum');\n\t            case 5:\n\t                return (id === 'while') || (id === 'break') || (id === 'catch') ||\n\t                    (id === 'throw') || (id === 'const') || (id === 'yield') ||\n\t                    (id === 'class') || (id === 'super');\n\t            case 6:\n\t                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||\n\t                    (id === 'switch') || (id === 'export') || (id === 'import');\n\t            case 7:\n\t                return (id === 'default') || (id === 'finally') || (id === 'extends');\n\t            case 8:\n\t                return (id === 'function') || (id === 'continue') || (id === 'debugger');\n\t            case 10:\n\t                return (id === 'instanceof');\n\t            default:\n\t                return false;\n\t        }\n\t    };\n\t    ;\n\t    Scanner.prototype.codePointAt = function (i) {\n\t        var cp = this.source.charCodeAt(i);\n\t        if (cp >= 0xD800 && cp <= 0xDBFF) {\n\t            var second = this.source.charCodeAt(i + 1);\n\t            if (second >= 0xDC00 && second <= 0xDFFF) {\n\t                var first = cp;\n\t                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n\t            }\n\t        }\n\t        return cp;\n\t    };\n\t    ;\n\t    Scanner.prototype.scanHexEscape = function (prefix) {\n\t        var len = (prefix === 'u') ? 4 : 2;\n\t        var code = 0;\n\t        for (var i = 0; i < len; ++i) {\n\t            if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {\n\t                code = code * 16 + hexValue(this.source[this.index++]);\n\t            }\n\t            else {\n\t                return '';\n\t            }\n\t        }\n\t        return String.fromCharCode(code);\n\t    };\n\t    ;\n\t    Scanner.prototype.scanUnicodeCodePointEscape = function () {\n\t        var ch = this.source[this.index];\n\t        var code = 0;\n\t        // At least, one hex digit is required.\n\t        if (ch === '}') {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        while (!this.eof()) {\n\t            ch = this.source[this.index++];\n\t            if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) {\n\t                break;\n\t            }\n\t            code = code * 16 + hexValue(ch);\n\t        }\n\t        if (code > 0x10FFFF || ch !== '}') {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return character_1.Character.fromCodePoint(code);\n\t    };\n\t    ;\n\t    Scanner.prototype.getIdentifier = function () {\n\t        var start = this.index++;\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            if (ch === 0x5C) {\n\t                // Blackslash (U+005C) marks Unicode escape sequence.\n\t                this.index = start;\n\t                return this.getComplexIdentifier();\n\t            }\n\t            else if (ch >= 0xD800 && ch < 0xDFFF) {\n\t                // Need to handle surrogate pairs.\n\t                this.index = start;\n\t                return this.getComplexIdentifier();\n\t            }\n\t            if (character_1.Character.isIdentifierPart(ch)) {\n\t                ++this.index;\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return this.source.slice(start, this.index);\n\t    };\n\t    ;\n\t    Scanner.prototype.getComplexIdentifier = function () {\n\t        var cp = this.codePointAt(this.index);\n\t        var id = character_1.Character.fromCodePoint(cp);\n\t        this.index += id.length;\n\t        // '\\u' (U+005C, U+0075) denotes an escaped character.\n\t        var ch;\n\t        if (cp === 0x5C) {\n\t            if (this.source.charCodeAt(this.index) !== 0x75) {\n\t                this.throwUnexpectedToken();\n\t            }\n\t            ++this.index;\n\t            if (this.source[this.index] === '{') {\n\t                ++this.index;\n\t                ch = this.scanUnicodeCodePointEscape();\n\t            }\n\t            else {\n\t                ch = this.scanHexEscape('u');\n\t                cp = ch.charCodeAt(0);\n\t                if (!ch || ch === '\\\\' || !character_1.Character.isIdentifierStart(cp)) {\n\t                    this.throwUnexpectedToken();\n\t                }\n\t            }\n\t            id = ch;\n\t        }\n\t        while (!this.eof()) {\n\t            cp = this.codePointAt(this.index);\n\t            if (!character_1.Character.isIdentifierPart(cp)) {\n\t                break;\n\t            }\n\t            ch = character_1.Character.fromCodePoint(cp);\n\t            id += ch;\n\t            this.index += ch.length;\n\t            // '\\u' (U+005C, U+0075) denotes an escaped character.\n\t            if (cp === 0x5C) {\n\t                id = id.substr(0, id.length - 1);\n\t                if (this.source.charCodeAt(this.index) !== 0x75) {\n\t                    this.throwUnexpectedToken();\n\t                }\n\t                ++this.index;\n\t                if (this.source[this.index] === '{') {\n\t                    ++this.index;\n\t                    ch = this.scanUnicodeCodePointEscape();\n\t                }\n\t                else {\n\t                    ch = this.scanHexEscape('u');\n\t                    cp = ch.charCodeAt(0);\n\t                    if (!ch || ch === '\\\\' || !character_1.Character.isIdentifierPart(cp)) {\n\t                        this.throwUnexpectedToken();\n\t                    }\n\t                }\n\t                id += ch;\n\t            }\n\t        }\n\t        return id;\n\t    };\n\t    ;\n\t    Scanner.prototype.octalToDecimal = function (ch) {\n\t        // \\0 is not octal escape sequence\n\t        var octal = (ch !== '0');\n\t        var code = octalValue(ch);\n\t        if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {\n\t            octal = true;\n\t            code = code * 8 + octalValue(this.source[this.index++]);\n\t            // 3 digits are only allowed when string starts\n\t            // with 0, 1, 2, 3\n\t            if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {\n\t                code = code * 8 + octalValue(this.source[this.index++]);\n\t            }\n\t        }\n\t        return {\n\t            code: code,\n\t            octal: octal\n\t        };\n\t    };\n\t    ;\n\t    // ECMA-262 11.6 Names and Keywords\n\t    Scanner.prototype.scanIdentifier = function () {\n\t        var type;\n\t        var start = this.index;\n\t        // Backslash (U+005C) starts an escaped character.\n\t        var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier();\n\t        // There is no keyword or literal with only one character.\n\t        // Thus, it must be an identifier.\n\t        if (id.length === 1) {\n\t            type = token_1.Token.Identifier;\n\t        }\n\t        else if (this.isKeyword(id)) {\n\t            type = token_1.Token.Keyword;\n\t        }\n\t        else if (id === 'null') {\n\t            type = token_1.Token.NullLiteral;\n\t        }\n\t        else if (id === 'true' || id === 'false') {\n\t            type = token_1.Token.BooleanLiteral;\n\t        }\n\t        else {\n\t            type = token_1.Token.Identifier;\n\t        }\n\t        return {\n\t            type: type,\n\t            value: id,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    // ECMA-262 11.7 Punctuators\n\t    Scanner.prototype.scanPunctuator = function () {\n\t        var token = {\n\t            type: token_1.Token.Punctuator,\n\t            value: '',\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: this.index,\n\t            end: this.index\n\t        };\n\t        // Check for most common single-character punctuators.\n\t        var str = this.source[this.index];\n\t        switch (str) {\n\t            case '(':\n\t            case '{':\n\t                if (str === '{') {\n\t                    this.curlyStack.push('{');\n\t                }\n\t                ++this.index;\n\t                break;\n\t            case '.':\n\t                ++this.index;\n\t                if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') {\n\t                    // Spread operator: ...\n\t                    this.index += 2;\n\t                    str = '...';\n\t                }\n\t                break;\n\t            case '}':\n\t                ++this.index;\n\t                this.curlyStack.pop();\n\t                break;\n\t            case ')':\n\t            case ';':\n\t            case ',':\n\t            case '[':\n\t            case ']':\n\t            case ':':\n\t            case '?':\n\t            case '~':\n\t                ++this.index;\n\t                break;\n\t            default:\n\t                // 4-character punctuator.\n\t                str = this.source.substr(this.index, 4);\n\t                if (str === '>>>=') {\n\t                    this.index += 4;\n\t                }\n\t                else {\n\t                    // 3-character punctuators.\n\t                    str = str.substr(0, 3);\n\t                    if (str === '===' || str === '!==' || str === '>>>' ||\n\t                        str === '<<=' || str === '>>=' || str === '**=') {\n\t                        this.index += 3;\n\t                    }\n\t                    else {\n\t                        // 2-character punctuators.\n\t                        str = str.substr(0, 2);\n\t                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||\n\t                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||\n\t                            str === '++' || str === '--' || str === '<<' || str === '>>' ||\n\t                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||\n\t                            str === '<=' || str === '>=' || str === '=>' || str === '**') {\n\t                            this.index += 2;\n\t                        }\n\t                        else {\n\t                            // 1-character punctuators.\n\t                            str = this.source[this.index];\n\t                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {\n\t                                ++this.index;\n\t                            }\n\t                        }\n\t                    }\n\t                }\n\t        }\n\t        if (this.index === token.start) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        token.end = this.index;\n\t        token.value = str;\n\t        return token;\n\t    };\n\t    ;\n\t    // ECMA-262 11.8.3 Numeric Literals\n\t    Scanner.prototype.scanHexLiteral = function (start) {\n\t        var number = '';\n\t        while (!this.eof()) {\n\t            if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {\n\t                break;\n\t            }\n\t            number += this.source[this.index++];\n\t        }\n\t        if (number.length === 0) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: token_1.Token.NumericLiteral,\n\t            value: parseInt('0x' + number, 16),\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    Scanner.prototype.scanBinaryLiteral = function (start) {\n\t        var number = '';\n\t        var ch;\n\t        while (!this.eof()) {\n\t            ch = this.source[this.index];\n\t            if (ch !== '0' && ch !== '1') {\n\t                break;\n\t            }\n\t            number += this.source[this.index++];\n\t        }\n\t        if (number.length === 0) {\n\t            // only 0b or 0B\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (!this.eof()) {\n\t            ch = this.source.charCodeAt(this.index);\n\t            /* istanbul ignore else */\n\t            if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) {\n\t                this.throwUnexpectedToken();\n\t            }\n\t        }\n\t        return {\n\t            type: token_1.Token.NumericLiteral,\n\t            value: parseInt(number, 2),\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    Scanner.prototype.scanOctalLiteral = function (prefix, start) {\n\t        var number = '';\n\t        var octal = false;\n\t        if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) {\n\t            octal = true;\n\t            number = '0' + this.source[this.index++];\n\t        }\n\t        else {\n\t            ++this.index;\n\t        }\n\t        while (!this.eof()) {\n\t            if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {\n\t                break;\n\t            }\n\t            number += this.source[this.index++];\n\t        }\n\t        if (!octal && number.length === 0) {\n\t            // only 0o or 0O\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: token_1.Token.NumericLiteral,\n\t            value: parseInt(number, 8),\n\t            octal: octal,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    Scanner.prototype.isImplicitOctalLiteral = function () {\n\t        // Implicit octal, unless there is a non-octal digit.\n\t        // (Annex B.1.1 on Numeric Literals)\n\t        for (var i = this.index + 1; i < this.length; ++i) {\n\t            var ch = this.source[i];\n\t            if (ch === '8' || ch === '9') {\n\t                return false;\n\t            }\n\t            if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                return true;\n\t            }\n\t        }\n\t        return true;\n\t    };\n\t    ;\n\t    Scanner.prototype.scanNumericLiteral = function () {\n\t        var start = this.index;\n\t        var ch = this.source[start];\n\t        assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point');\n\t        var number = '';\n\t        if (ch !== '.') {\n\t            number = this.source[this.index++];\n\t            ch = this.source[this.index];\n\t            // Hex number starts with '0x'.\n\t            // Octal number starts with '0'.\n\t            // Octal number in ES6 starts with '0o'.\n\t            // Binary number in ES6 starts with '0b'.\n\t            if (number === '0') {\n\t                if (ch === 'x' || ch === 'X') {\n\t                    ++this.index;\n\t                    return this.scanHexLiteral(start);\n\t                }\n\t                if (ch === 'b' || ch === 'B') {\n\t                    ++this.index;\n\t                    return this.scanBinaryLiteral(start);\n\t                }\n\t                if (ch === 'o' || ch === 'O') {\n\t                    return this.scanOctalLiteral(ch, start);\n\t                }\n\t                if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                    if (this.isImplicitOctalLiteral()) {\n\t                        return this.scanOctalLiteral(ch, start);\n\t                    }\n\t                }\n\t            }\n\t            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                number += this.source[this.index++];\n\t            }\n\t            ch = this.source[this.index];\n\t        }\n\t        if (ch === '.') {\n\t            number += this.source[this.index++];\n\t            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                number += this.source[this.index++];\n\t            }\n\t            ch = this.source[this.index];\n\t        }\n\t        if (ch === 'e' || ch === 'E') {\n\t            number += this.source[this.index++];\n\t            ch = this.source[this.index];\n\t            if (ch === '+' || ch === '-') {\n\t                number += this.source[this.index++];\n\t            }\n\t            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                    number += this.source[this.index++];\n\t                }\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken();\n\t            }\n\t        }\n\t        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: token_1.Token.NumericLiteral,\n\t            value: parseFloat(number),\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    // ECMA-262 11.8.4 String Literals\n\t    Scanner.prototype.scanStringLiteral = function () {\n\t        var start = this.index;\n\t        var quote = this.source[start];\n\t        assert_1.assert((quote === '\\'' || quote === '\"'), 'String literal must starts with a quote');\n\t        ++this.index;\n\t        var octal = false;\n\t        var str = '';\n\t        while (!this.eof()) {\n\t            var ch = this.source[this.index++];\n\t            if (ch === quote) {\n\t                quote = '';\n\t                break;\n\t            }\n\t            else if (ch === '\\\\') {\n\t                ch = this.source[this.index++];\n\t                if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                    switch (ch) {\n\t                        case 'u':\n\t                        case 'x':\n\t                            if (this.source[this.index] === '{') {\n\t                                ++this.index;\n\t                                str += this.scanUnicodeCodePointEscape();\n\t                            }\n\t                            else {\n\t                                var unescaped = this.scanHexEscape(ch);\n\t                                if (!unescaped) {\n\t                                    this.throwUnexpectedToken();\n\t                                }\n\t                                str += unescaped;\n\t                            }\n\t                            break;\n\t                        case 'n':\n\t                            str += '\\n';\n\t                            break;\n\t                        case 'r':\n\t                            str += '\\r';\n\t                            break;\n\t                        case 't':\n\t                            str += '\\t';\n\t                            break;\n\t                        case 'b':\n\t                            str += '\\b';\n\t                            break;\n\t                        case 'f':\n\t                            str += '\\f';\n\t                            break;\n\t                        case 'v':\n\t                            str += '\\x0B';\n\t                            break;\n\t                        case '8':\n\t                        case '9':\n\t                            str += ch;\n\t                            this.tolerateUnexpectedToken();\n\t                            break;\n\t                        default:\n\t                            if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                                var octToDec = this.octalToDecimal(ch);\n\t                                octal = octToDec.octal || octal;\n\t                                str += String.fromCharCode(octToDec.code);\n\t                            }\n\t                            else {\n\t                                str += ch;\n\t                            }\n\t                            break;\n\t                    }\n\t                }\n\t                else {\n\t                    ++this.lineNumber;\n\t                    if (ch === '\\r' && this.source[this.index] === '\\n') {\n\t                        ++this.index;\n\t                    }\n\t                    this.lineStart = this.index;\n\t                }\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                break;\n\t            }\n\t            else {\n\t                str += ch;\n\t            }\n\t        }\n\t        if (quote !== '') {\n\t            this.index = start;\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: token_1.Token.StringLiteral,\n\t            value: str,\n\t            octal: octal,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    // ECMA-262 11.8.6 Template Literal Lexical Components\n\t    Scanner.prototype.scanTemplate = function () {\n\t        var cooked = '';\n\t        var terminated = false;\n\t        var start = this.index;\n\t        var head = (this.source[start] === '`');\n\t        var tail = false;\n\t        var rawOffset = 2;\n\t        ++this.index;\n\t        while (!this.eof()) {\n\t            var ch = this.source[this.index++];\n\t            if (ch === '`') {\n\t                rawOffset = 1;\n\t                tail = true;\n\t                terminated = true;\n\t                break;\n\t            }\n\t            else if (ch === '$') {\n\t                if (this.source[this.index] === '{') {\n\t                    this.curlyStack.push('${');\n\t                    ++this.index;\n\t                    terminated = true;\n\t                    break;\n\t                }\n\t                cooked += ch;\n\t            }\n\t            else if (ch === '\\\\') {\n\t                ch = this.source[this.index++];\n\t                if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                    switch (ch) {\n\t                        case 'n':\n\t                            cooked += '\\n';\n\t                            break;\n\t                        case 'r':\n\t                            cooked += '\\r';\n\t                            break;\n\t                        case 't':\n\t                            cooked += '\\t';\n\t                            break;\n\t                        case 'u':\n\t                        case 'x':\n\t                            if (this.source[this.index] === '{') {\n\t                                ++this.index;\n\t                                cooked += this.scanUnicodeCodePointEscape();\n\t                            }\n\t                            else {\n\t                                var restore = this.index;\n\t                                var unescaped = this.scanHexEscape(ch);\n\t                                if (unescaped) {\n\t                                    cooked += unescaped;\n\t                                }\n\t                                else {\n\t                                    this.index = restore;\n\t                                    cooked += ch;\n\t                                }\n\t                            }\n\t                            break;\n\t                        case 'b':\n\t                            cooked += '\\b';\n\t                            break;\n\t                        case 'f':\n\t                            cooked += '\\f';\n\t                            break;\n\t                        case 'v':\n\t                            cooked += '\\v';\n\t                            break;\n\t                        default:\n\t                            if (ch === '0') {\n\t                                if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                                    // Illegal: \\01 \\02 and so on\n\t                                    this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);\n\t                                }\n\t                                cooked += '\\0';\n\t                            }\n\t                            else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                                // Illegal: \\1 \\2\n\t                                this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);\n\t                            }\n\t                            else {\n\t                                cooked += ch;\n\t                            }\n\t                            break;\n\t                    }\n\t                }\n\t                else {\n\t                    ++this.lineNumber;\n\t                    if (ch === '\\r' && this.source[this.index] === '\\n') {\n\t                        ++this.index;\n\t                    }\n\t                    this.lineStart = this.index;\n\t                }\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                ++this.lineNumber;\n\t                if (ch === '\\r' && this.source[this.index] === '\\n') {\n\t                    ++this.index;\n\t                }\n\t                this.lineStart = this.index;\n\t                cooked += '\\n';\n\t            }\n\t            else {\n\t                cooked += ch;\n\t            }\n\t        }\n\t        if (!terminated) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (!head) {\n\t            this.curlyStack.pop();\n\t        }\n\t        return {\n\t            type: token_1.Token.Template,\n\t            value: {\n\t                cooked: cooked,\n\t                raw: this.source.slice(start + 1, this.index - rawOffset)\n\t            },\n\t            head: head,\n\t            tail: tail,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    // ECMA-262 11.8.5 Regular Expression Literals\n\t    Scanner.prototype.testRegExp = function (pattern, flags) {\n\t        // The BMP character to use as a replacement for astral symbols when\n\t        // translating an ES6 \"u\"-flagged pattern to an ES5-compatible\n\t        // approximation.\n\t        // Note: replacing with '\\uFFFF' enables false positives in unlikely\n\t        // scenarios. For example, `[\\u{1044f}-\\u{10440}]` is an invalid\n\t        // pattern that would not be detected by this substitution.\n\t        var astralSubstitute = '\\uFFFF';\n\t        var tmp = pattern;\n\t        var self = this;\n\t        if (flags.indexOf('u') >= 0) {\n\t            tmp = tmp\n\t                .replace(/\\\\u\\{([0-9a-fA-F]+)\\}|\\\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {\n\t                var codePoint = parseInt($1 || $2, 16);\n\t                if (codePoint > 0x10FFFF) {\n\t                    self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);\n\t                }\n\t                if (codePoint <= 0xFFFF) {\n\t                    return String.fromCharCode(codePoint);\n\t                }\n\t                return astralSubstitute;\n\t            })\n\t                .replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, astralSubstitute);\n\t        }\n\t        // First, detect invalid regular expressions.\n\t        try {\n\t            RegExp(tmp);\n\t        }\n\t        catch (e) {\n\t            this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);\n\t        }\n\t        // Return a regular expression object for this pattern-flag pair, or\n\t        // `null` in case the current environment doesn't support the flags it\n\t        // uses.\n\t        try {\n\t            return new RegExp(pattern, flags);\n\t        }\n\t        catch (exception) {\n\t            /* istanbul ignore next */\n\t            return null;\n\t        }\n\t    };\n\t    ;\n\t    Scanner.prototype.scanRegExpBody = function () {\n\t        var ch = this.source[this.index];\n\t        assert_1.assert(ch === '/', 'Regular expression literal must start with a slash');\n\t        var str = this.source[this.index++];\n\t        var classMarker = false;\n\t        var terminated = false;\n\t        while (!this.eof()) {\n\t            ch = this.source[this.index++];\n\t            str += ch;\n\t            if (ch === '\\\\') {\n\t                ch = this.source[this.index++];\n\t                // ECMA-262 7.8.5\n\t                if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                    this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);\n\t                }\n\t                str += ch;\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);\n\t            }\n\t            else if (classMarker) {\n\t                if (ch === ']') {\n\t                    classMarker = false;\n\t                }\n\t            }\n\t            else {\n\t                if (ch === '/') {\n\t                    terminated = true;\n\t                    break;\n\t                }\n\t                else if (ch === '[') {\n\t                    classMarker = true;\n\t                }\n\t            }\n\t        }\n\t        if (!terminated) {\n\t            this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);\n\t        }\n\t        // Exclude leading and trailing slash.\n\t        var body = str.substr(1, str.length - 2);\n\t        return {\n\t            value: body,\n\t            literal: str\n\t        };\n\t    };\n\t    ;\n\t    Scanner.prototype.scanRegExpFlags = function () {\n\t        var str = '';\n\t        var flags = '';\n\t        while (!this.eof()) {\n\t            var ch = this.source[this.index];\n\t            if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {\n\t                break;\n\t            }\n\t            ++this.index;\n\t            if (ch === '\\\\' && !this.eof()) {\n\t                ch = this.source[this.index];\n\t                if (ch === 'u') {\n\t                    ++this.index;\n\t                    var restore = this.index;\n\t                    ch = this.scanHexEscape('u');\n\t                    if (ch) {\n\t                        flags += ch;\n\t                        for (str += '\\\\u'; restore < this.index; ++restore) {\n\t                            str += this.source[restore];\n\t                        }\n\t                    }\n\t                    else {\n\t                        this.index = restore;\n\t                        flags += 'u';\n\t                        str += '\\\\u';\n\t                    }\n\t                    this.tolerateUnexpectedToken();\n\t                }\n\t                else {\n\t                    str += '\\\\';\n\t                    this.tolerateUnexpectedToken();\n\t                }\n\t            }\n\t            else {\n\t                flags += ch;\n\t                str += ch;\n\t            }\n\t        }\n\t        return {\n\t            value: flags,\n\t            literal: str\n\t        };\n\t    };\n\t    ;\n\t    Scanner.prototype.scanRegExp = function () {\n\t        var start = this.index;\n\t        var body = this.scanRegExpBody();\n\t        var flags = this.scanRegExpFlags();\n\t        var value = this.testRegExp(body.value, flags.value);\n\t        return {\n\t            type: token_1.Token.RegularExpression,\n\t            value: value,\n\t            literal: body.literal + flags.literal,\n\t            regex: {\n\t                pattern: body.value,\n\t                flags: flags.value\n\t            },\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    ;\n\t    Scanner.prototype.lex = function () {\n\t        if (this.eof()) {\n\t            return {\n\t                type: token_1.Token.EOF,\n\t                lineNumber: this.lineNumber,\n\t                lineStart: this.lineStart,\n\t                start: this.index,\n\t                end: this.index\n\t            };\n\t        }\n\t        var cp = this.source.charCodeAt(this.index);\n\t        if (character_1.Character.isIdentifierStart(cp)) {\n\t            return this.scanIdentifier();\n\t        }\n\t        // Very common: ( and ) and ;\n\t        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {\n\t            return this.scanPunctuator();\n\t        }\n\t        // String literal starts with single quote (U+0027) or double quote (U+0022).\n\t        if (cp === 0x27 || cp === 0x22) {\n\t            return this.scanStringLiteral();\n\t        }\n\t        // Dot (.) U+002E can also start a floating-point number, hence the need\n\t        // to check the next character.\n\t        if (cp === 0x2E) {\n\t            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) {\n\t                return this.scanNumericLiteral();\n\t            }\n\t            return this.scanPunctuator();\n\t        }\n\t        if (character_1.Character.isDecimalDigit(cp)) {\n\t            return this.scanNumericLiteral();\n\t        }\n\t        // Template literals start with ` (U+0060) for template head\n\t        // or } (U+007D) for template middle or template tail.\n\t        if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) {\n\t            return this.scanTemplate();\n\t        }\n\t        // Possible identifier start in a surrogate pair.\n\t        if (cp >= 0xD800 && cp < 0xDFFF) {\n\t            if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) {\n\t                return this.scanIdentifier();\n\t            }\n\t        }\n\t        return this.scanPunctuator();\n\t    };\n\t    ;\n\t    return Scanner;\n\t}());\n\texports.Scanner = Scanner;\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t// See also tools/generate-unicode-regex.js.\n\tvar Regex = {\n\t    // Unicode v8.0.0 NonAsciiIdentifierStart:\n\t    NonAsciiIdentifierStart: /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]/,\n\t    // Unicode v8.0.0 NonAsciiIdentifierPart:\n\t    NonAsciiIdentifierPart: /[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B4\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/\n\t};\n\texports.Character = {\n\t    fromCodePoint: function (cp) {\n\t        return (cp < 0x10000) ? String.fromCharCode(cp) :\n\t            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +\n\t                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));\n\t    },\n\t    // ECMA-262 11.2 White Space\n\t    isWhiteSpace: function (cp) {\n\t        return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||\n\t            (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);\n\t    },\n\t    // ECMA-262 11.3 Line Terminators\n\t    isLineTerminator: function (cp) {\n\t        return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);\n\t    },\n\t    // ECMA-262 11.6 Identifier Names and Identifiers\n\t    isIdentifierStart: function (cp) {\n\t        return (cp === 0x24) || (cp === 0x5F) ||\n\t            (cp >= 0x41 && cp <= 0x5A) ||\n\t            (cp >= 0x61 && cp <= 0x7A) ||\n\t            (cp === 0x5C) ||\n\t            ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));\n\t    },\n\t    isIdentifierPart: function (cp) {\n\t        return (cp === 0x24) || (cp === 0x5F) ||\n\t            (cp >= 0x41 && cp <= 0x5A) ||\n\t            (cp >= 0x61 && cp <= 0x7A) ||\n\t            (cp >= 0x30 && cp <= 0x39) ||\n\t            (cp === 0x5C) ||\n\t            ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));\n\t    },\n\t    // ECMA-262 11.8.3 Numeric Literals\n\t    isDecimalDigit: function (cp) {\n\t        return (cp >= 0x30 && cp <= 0x39); // 0..9\n\t    },\n\t    isHexDigit: function (cp) {\n\t        return (cp >= 0x30 && cp <= 0x39) ||\n\t            (cp >= 0x41 && cp <= 0x46) ||\n\t            (cp >= 0x61 && cp <= 0x66); // a..f\n\t    },\n\t    isOctalDigit: function (cp) {\n\t        return (cp >= 0x30 && cp <= 0x37); // 0..7\n\t    }\n\t};\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar syntax_1 = __webpack_require__(2);\n\tvar ArrayExpression = (function () {\n\t    function ArrayExpression(elements) {\n\t        this.type = syntax_1.Syntax.ArrayExpression;\n\t        this.elements = elements;\n\t    }\n\t    return ArrayExpression;\n\t}());\n\texports.ArrayExpression = ArrayExpression;\n\tvar ArrayPattern = (function () {\n\t    function ArrayPattern(elements) {\n\t        this.type = syntax_1.Syntax.ArrayPattern;\n\t        this.elements = elements;\n\t    }\n\t    return ArrayPattern;\n\t}());\n\texports.ArrayPattern = ArrayPattern;\n\tvar ArrowFunctionExpression = (function () {\n\t    function ArrowFunctionExpression(params, body, expression) {\n\t        this.type = syntax_1.Syntax.ArrowFunctionExpression;\n\t        this.id = null;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = false;\n\t        this.expression = expression;\n\t    }\n\t    return ArrowFunctionExpression;\n\t}());\n\texports.ArrowFunctionExpression = ArrowFunctionExpression;\n\tvar AssignmentExpression = (function () {\n\t    function AssignmentExpression(operator, left, right) {\n\t        this.type = syntax_1.Syntax.AssignmentExpression;\n\t        this.operator = operator;\n\t        this.left = left;\n\t        this.right = right;\n\t    }\n\t    return AssignmentExpression;\n\t}());\n\texports.AssignmentExpression = AssignmentExpression;\n\tvar AssignmentPattern = (function () {\n\t    function AssignmentPattern(left, right) {\n\t        this.type = syntax_1.Syntax.AssignmentPattern;\n\t        this.left = left;\n\t        this.right = right;\n\t    }\n\t    return AssignmentPattern;\n\t}());\n\texports.AssignmentPattern = AssignmentPattern;\n\tvar BinaryExpression = (function () {\n\t    function BinaryExpression(operator, left, right) {\n\t        var logical = (operator === '||' || operator === '&&');\n\t        this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;\n\t        this.operator = operator;\n\t        this.left = left;\n\t        this.right = right;\n\t    }\n\t    return BinaryExpression;\n\t}());\n\texports.BinaryExpression = BinaryExpression;\n\tvar BlockStatement = (function () {\n\t    function BlockStatement(body) {\n\t        this.type = syntax_1.Syntax.BlockStatement;\n\t        this.body = body;\n\t    }\n\t    return BlockStatement;\n\t}());\n\texports.BlockStatement = BlockStatement;\n\tvar BreakStatement = (function () {\n\t    function BreakStatement(label) {\n\t        this.type = syntax_1.Syntax.BreakStatement;\n\t        this.label = label;\n\t    }\n\t    return BreakStatement;\n\t}());\n\texports.BreakStatement = BreakStatement;\n\tvar CallExpression = (function () {\n\t    function CallExpression(callee, args) {\n\t        this.type = syntax_1.Syntax.CallExpression;\n\t        this.callee = callee;\n\t        this.arguments = args;\n\t    }\n\t    return CallExpression;\n\t}());\n\texports.CallExpression = CallExpression;\n\tvar CatchClause = (function () {\n\t    function CatchClause(param, body) {\n\t        this.type = syntax_1.Syntax.CatchClause;\n\t        this.param = param;\n\t        this.body = body;\n\t    }\n\t    return CatchClause;\n\t}());\n\texports.CatchClause = CatchClause;\n\tvar ClassBody = (function () {\n\t    function ClassBody(body) {\n\t        this.type = syntax_1.Syntax.ClassBody;\n\t        this.body = body;\n\t    }\n\t    return ClassBody;\n\t}());\n\texports.ClassBody = ClassBody;\n\tvar ClassDeclaration = (function () {\n\t    function ClassDeclaration(id, superClass, body) {\n\t        this.type = syntax_1.Syntax.ClassDeclaration;\n\t        this.id = id;\n\t        this.superClass = superClass;\n\t        this.body = body;\n\t    }\n\t    return ClassDeclaration;\n\t}());\n\texports.ClassDeclaration = ClassDeclaration;\n\tvar ClassExpression = (function () {\n\t    function ClassExpression(id, superClass, body) {\n\t        this.type = syntax_1.Syntax.ClassExpression;\n\t        this.id = id;\n\t        this.superClass = superClass;\n\t        this.body = body;\n\t    }\n\t    return ClassExpression;\n\t}());\n\texports.ClassExpression = ClassExpression;\n\tvar ComputedMemberExpression = (function () {\n\t    function ComputedMemberExpression(object, property) {\n\t        this.type = syntax_1.Syntax.MemberExpression;\n\t        this.computed = true;\n\t        this.object = object;\n\t        this.property = property;\n\t    }\n\t    return ComputedMemberExpression;\n\t}());\n\texports.ComputedMemberExpression = ComputedMemberExpression;\n\tvar ConditionalExpression = (function () {\n\t    function ConditionalExpression(test, consequent, alternate) {\n\t        this.type = syntax_1.Syntax.ConditionalExpression;\n\t        this.test = test;\n\t        this.consequent = consequent;\n\t        this.alternate = alternate;\n\t    }\n\t    return ConditionalExpression;\n\t}());\n\texports.ConditionalExpression = ConditionalExpression;\n\tvar ContinueStatement = (function () {\n\t    function ContinueStatement(label) {\n\t        this.type = syntax_1.Syntax.ContinueStatement;\n\t        this.label = label;\n\t    }\n\t    return ContinueStatement;\n\t}());\n\texports.ContinueStatement = ContinueStatement;\n\tvar DebuggerStatement = (function () {\n\t    function DebuggerStatement() {\n\t        this.type = syntax_1.Syntax.DebuggerStatement;\n\t    }\n\t    return DebuggerStatement;\n\t}());\n\texports.DebuggerStatement = DebuggerStatement;\n\tvar Directive = (function () {\n\t    function Directive(expression, directive) {\n\t        this.type = syntax_1.Syntax.ExpressionStatement;\n\t        this.expression = expression;\n\t        this.directive = directive;\n\t    }\n\t    return Directive;\n\t}());\n\texports.Directive = Directive;\n\tvar DoWhileStatement = (function () {\n\t    function DoWhileStatement(body, test) {\n\t        this.type = syntax_1.Syntax.DoWhileStatement;\n\t        this.body = body;\n\t        this.test = test;\n\t    }\n\t    return DoWhileStatement;\n\t}());\n\texports.DoWhileStatement = DoWhileStatement;\n\tvar EmptyStatement = (function () {\n\t    function EmptyStatement() {\n\t        this.type = syntax_1.Syntax.EmptyStatement;\n\t    }\n\t    return EmptyStatement;\n\t}());\n\texports.EmptyStatement = EmptyStatement;\n\tvar ExportAllDeclaration = (function () {\n\t    function ExportAllDeclaration(source) {\n\t        this.type = syntax_1.Syntax.ExportAllDeclaration;\n\t        this.source = source;\n\t    }\n\t    return ExportAllDeclaration;\n\t}());\n\texports.ExportAllDeclaration = ExportAllDeclaration;\n\tvar ExportDefaultDeclaration = (function () {\n\t    function ExportDefaultDeclaration(declaration) {\n\t        this.type = syntax_1.Syntax.ExportDefaultDeclaration;\n\t        this.declaration = declaration;\n\t    }\n\t    return ExportDefaultDeclaration;\n\t}());\n\texports.ExportDefaultDeclaration = ExportDefaultDeclaration;\n\tvar ExportNamedDeclaration = (function () {\n\t    function ExportNamedDeclaration(declaration, specifiers, source) {\n\t        this.type = syntax_1.Syntax.ExportNamedDeclaration;\n\t        this.declaration = declaration;\n\t        this.specifiers = specifiers;\n\t        this.source = source;\n\t    }\n\t    return ExportNamedDeclaration;\n\t}());\n\texports.ExportNamedDeclaration = ExportNamedDeclaration;\n\tvar ExportSpecifier = (function () {\n\t    function ExportSpecifier(local, exported) {\n\t        this.type = syntax_1.Syntax.ExportSpecifier;\n\t        this.exported = exported;\n\t        this.local = local;\n\t    }\n\t    return ExportSpecifier;\n\t}());\n\texports.ExportSpecifier = ExportSpecifier;\n\tvar ExpressionStatement = (function () {\n\t    function ExpressionStatement(expression) {\n\t        this.type = syntax_1.Syntax.ExpressionStatement;\n\t        this.expression = expression;\n\t    }\n\t    return ExpressionStatement;\n\t}());\n\texports.ExpressionStatement = ExpressionStatement;\n\tvar ForInStatement = (function () {\n\t    function ForInStatement(left, right, body) {\n\t        this.type = syntax_1.Syntax.ForInStatement;\n\t        this.left = left;\n\t        this.right = right;\n\t        this.body = body;\n\t        this.each = false;\n\t    }\n\t    return ForInStatement;\n\t}());\n\texports.ForInStatement = ForInStatement;\n\tvar ForOfStatement = (function () {\n\t    function ForOfStatement(left, right, body) {\n\t        this.type = syntax_1.Syntax.ForOfStatement;\n\t        this.left = left;\n\t        this.right = right;\n\t        this.body = body;\n\t    }\n\t    return ForOfStatement;\n\t}());\n\texports.ForOfStatement = ForOfStatement;\n\tvar ForStatement = (function () {\n\t    function ForStatement(init, test, update, body) {\n\t        this.type = syntax_1.Syntax.ForStatement;\n\t        this.init = init;\n\t        this.test = test;\n\t        this.update = update;\n\t        this.body = body;\n\t    }\n\t    return ForStatement;\n\t}());\n\texports.ForStatement = ForStatement;\n\tvar FunctionDeclaration = (function () {\n\t    function FunctionDeclaration(id, params, body, generator) {\n\t        this.type = syntax_1.Syntax.FunctionDeclaration;\n\t        this.id = id;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = generator;\n\t        this.expression = false;\n\t    }\n\t    return FunctionDeclaration;\n\t}());\n\texports.FunctionDeclaration = FunctionDeclaration;\n\tvar FunctionExpression = (function () {\n\t    function FunctionExpression(id, params, body, generator) {\n\t        this.type = syntax_1.Syntax.FunctionExpression;\n\t        this.id = id;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = generator;\n\t        this.expression = false;\n\t    }\n\t    return FunctionExpression;\n\t}());\n\texports.FunctionExpression = FunctionExpression;\n\tvar Identifier = (function () {\n\t    function Identifier(name) {\n\t        this.type = syntax_1.Syntax.Identifier;\n\t        this.name = name;\n\t    }\n\t    return Identifier;\n\t}());\n\texports.Identifier = Identifier;\n\tvar IfStatement = (function () {\n\t    function IfStatement(test, consequent, alternate) {\n\t        this.type = syntax_1.Syntax.IfStatement;\n\t        this.test = test;\n\t        this.consequent = consequent;\n\t        this.alternate = alternate;\n\t    }\n\t    return IfStatement;\n\t}());\n\texports.IfStatement = IfStatement;\n\tvar ImportDeclaration = (function () {\n\t    function ImportDeclaration(specifiers, source) {\n\t        this.type = syntax_1.Syntax.ImportDeclaration;\n\t        this.specifiers = specifiers;\n\t        this.source = source;\n\t    }\n\t    return ImportDeclaration;\n\t}());\n\texports.ImportDeclaration = ImportDeclaration;\n\tvar ImportDefaultSpecifier = (function () {\n\t    function ImportDefaultSpecifier(local) {\n\t        this.type = syntax_1.Syntax.ImportDefaultSpecifier;\n\t        this.local = local;\n\t    }\n\t    return ImportDefaultSpecifier;\n\t}());\n\texports.ImportDefaultSpecifier = ImportDefaultSpecifier;\n\tvar ImportNamespaceSpecifier = (function () {\n\t    function ImportNamespaceSpecifier(local) {\n\t        this.type = syntax_1.Syntax.ImportNamespaceSpecifier;\n\t        this.local = local;\n\t    }\n\t    return ImportNamespaceSpecifier;\n\t}());\n\texports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;\n\tvar ImportSpecifier = (function () {\n\t    function ImportSpecifier(local, imported) {\n\t        this.type = syntax_1.Syntax.ImportSpecifier;\n\t        this.local = local;\n\t        this.imported = imported;\n\t    }\n\t    return ImportSpecifier;\n\t}());\n\texports.ImportSpecifier = ImportSpecifier;\n\tvar LabeledStatement = (function () {\n\t    function LabeledStatement(label, body) {\n\t        this.type = syntax_1.Syntax.LabeledStatement;\n\t        this.label = label;\n\t        this.body = body;\n\t    }\n\t    return LabeledStatement;\n\t}());\n\texports.LabeledStatement = LabeledStatement;\n\tvar Literal = (function () {\n\t    function Literal(value, raw) {\n\t        this.type = syntax_1.Syntax.Literal;\n\t        this.value = value;\n\t        this.raw = raw;\n\t    }\n\t    return Literal;\n\t}());\n\texports.Literal = Literal;\n\tvar MetaProperty = (function () {\n\t    function MetaProperty(meta, property) {\n\t        this.type = syntax_1.Syntax.MetaProperty;\n\t        this.meta = meta;\n\t        this.property = property;\n\t    }\n\t    return MetaProperty;\n\t}());\n\texports.MetaProperty = MetaProperty;\n\tvar MethodDefinition = (function () {\n\t    function MethodDefinition(key, computed, value, kind, isStatic) {\n\t        this.type = syntax_1.Syntax.MethodDefinition;\n\t        this.key = key;\n\t        this.computed = computed;\n\t        this.value = value;\n\t        this.kind = kind;\n\t        this.static = isStatic;\n\t    }\n\t    return MethodDefinition;\n\t}());\n\texports.MethodDefinition = MethodDefinition;\n\tvar NewExpression = (function () {\n\t    function NewExpression(callee, args) {\n\t        this.type = syntax_1.Syntax.NewExpression;\n\t        this.callee = callee;\n\t        this.arguments = args;\n\t    }\n\t    return NewExpression;\n\t}());\n\texports.NewExpression = NewExpression;\n\tvar ObjectExpression = (function () {\n\t    function ObjectExpression(properties) {\n\t        this.type = syntax_1.Syntax.ObjectExpression;\n\t        this.properties = properties;\n\t    }\n\t    return ObjectExpression;\n\t}());\n\texports.ObjectExpression = ObjectExpression;\n\tvar ObjectPattern = (function () {\n\t    function ObjectPattern(properties) {\n\t        this.type = syntax_1.Syntax.ObjectPattern;\n\t        this.properties = properties;\n\t    }\n\t    return ObjectPattern;\n\t}());\n\texports.ObjectPattern = ObjectPattern;\n\tvar Program = (function () {\n\t    function Program(body, sourceType) {\n\t        this.type = syntax_1.Syntax.Program;\n\t        this.body = body;\n\t        this.sourceType = sourceType;\n\t    }\n\t    return Program;\n\t}());\n\texports.Program = Program;\n\tvar Property = (function () {\n\t    function Property(kind, key, computed, value, method, shorthand) {\n\t        this.type = syntax_1.Syntax.Property;\n\t        this.key = key;\n\t        this.computed = computed;\n\t        this.value = value;\n\t        this.kind = kind;\n\t        this.method = method;\n\t        this.shorthand = shorthand;\n\t    }\n\t    return Property;\n\t}());\n\texports.Property = Property;\n\tvar RegexLiteral = (function () {\n\t    function RegexLiteral(value, raw, regex) {\n\t        this.type = syntax_1.Syntax.Literal;\n\t        this.value = value;\n\t        this.raw = raw;\n\t        this.regex = regex;\n\t    }\n\t    return RegexLiteral;\n\t}());\n\texports.RegexLiteral = RegexLiteral;\n\tvar RestElement = (function () {\n\t    function RestElement(argument) {\n\t        this.type = syntax_1.Syntax.RestElement;\n\t        this.argument = argument;\n\t    }\n\t    return RestElement;\n\t}());\n\texports.RestElement = RestElement;\n\tvar ReturnStatement = (function () {\n\t    function ReturnStatement(argument) {\n\t        this.type = syntax_1.Syntax.ReturnStatement;\n\t        this.argument = argument;\n\t    }\n\t    return ReturnStatement;\n\t}());\n\texports.ReturnStatement = ReturnStatement;\n\tvar SequenceExpression = (function () {\n\t    function SequenceExpression(expressions) {\n\t        this.type = syntax_1.Syntax.SequenceExpression;\n\t        this.expressions = expressions;\n\t    }\n\t    return SequenceExpression;\n\t}());\n\texports.SequenceExpression = SequenceExpression;\n\tvar SpreadElement = (function () {\n\t    function SpreadElement(argument) {\n\t        this.type = syntax_1.Syntax.SpreadElement;\n\t        this.argument = argument;\n\t    }\n\t    return SpreadElement;\n\t}());\n\texports.SpreadElement = SpreadElement;\n\tvar StaticMemberExpression = (function () {\n\t    function StaticMemberExpression(object, property) {\n\t        this.type = syntax_1.Syntax.MemberExpression;\n\t        this.computed = false;\n\t        this.object = object;\n\t        this.property = property;\n\t    }\n\t    return StaticMemberExpression;\n\t}());\n\texports.StaticMemberExpression = StaticMemberExpression;\n\tvar Super = (function () {\n\t    function Super() {\n\t        this.type = syntax_1.Syntax.Super;\n\t    }\n\t    return Super;\n\t}());\n\texports.Super = Super;\n\tvar SwitchCase = (function () {\n\t    function SwitchCase(test, consequent) {\n\t        this.type = syntax_1.Syntax.SwitchCase;\n\t        this.test = test;\n\t        this.consequent = consequent;\n\t    }\n\t    return SwitchCase;\n\t}());\n\texports.SwitchCase = SwitchCase;\n\tvar SwitchStatement = (function () {\n\t    function SwitchStatement(discriminant, cases) {\n\t        this.type = syntax_1.Syntax.SwitchStatement;\n\t        this.discriminant = discriminant;\n\t        this.cases = cases;\n\t    }\n\t    return SwitchStatement;\n\t}());\n\texports.SwitchStatement = SwitchStatement;\n\tvar TaggedTemplateExpression = (function () {\n\t    function TaggedTemplateExpression(tag, quasi) {\n\t        this.type = syntax_1.Syntax.TaggedTemplateExpression;\n\t        this.tag = tag;\n\t        this.quasi = quasi;\n\t    }\n\t    return TaggedTemplateExpression;\n\t}());\n\texports.TaggedTemplateExpression = TaggedTemplateExpression;\n\tvar TemplateElement = (function () {\n\t    function TemplateElement(value, tail) {\n\t        this.type = syntax_1.Syntax.TemplateElement;\n\t        this.value = value;\n\t        this.tail = tail;\n\t    }\n\t    return TemplateElement;\n\t}());\n\texports.TemplateElement = TemplateElement;\n\tvar TemplateLiteral = (function () {\n\t    function TemplateLiteral(quasis, expressions) {\n\t        this.type = syntax_1.Syntax.TemplateLiteral;\n\t        this.quasis = quasis;\n\t        this.expressions = expressions;\n\t    }\n\t    return TemplateLiteral;\n\t}());\n\texports.TemplateLiteral = TemplateLiteral;\n\tvar ThisExpression = (function () {\n\t    function ThisExpression() {\n\t        this.type = syntax_1.Syntax.ThisExpression;\n\t    }\n\t    return ThisExpression;\n\t}());\n\texports.ThisExpression = ThisExpression;\n\tvar ThrowStatement = (function () {\n\t    function ThrowStatement(argument) {\n\t        this.type = syntax_1.Syntax.ThrowStatement;\n\t        this.argument = argument;\n\t    }\n\t    return ThrowStatement;\n\t}());\n\texports.ThrowStatement = ThrowStatement;\n\tvar TryStatement = (function () {\n\t    function TryStatement(block, handler, finalizer) {\n\t        this.type = syntax_1.Syntax.TryStatement;\n\t        this.block = block;\n\t        this.handler = handler;\n\t        this.finalizer = finalizer;\n\t    }\n\t    return TryStatement;\n\t}());\n\texports.TryStatement = TryStatement;\n\tvar UnaryExpression = (function () {\n\t    function UnaryExpression(operator, argument) {\n\t        this.type = syntax_1.Syntax.UnaryExpression;\n\t        this.operator = operator;\n\t        this.argument = argument;\n\t        this.prefix = true;\n\t    }\n\t    return UnaryExpression;\n\t}());\n\texports.UnaryExpression = UnaryExpression;\n\tvar UpdateExpression = (function () {\n\t    function UpdateExpression(operator, argument, prefix) {\n\t        this.type = syntax_1.Syntax.UpdateExpression;\n\t        this.operator = operator;\n\t        this.argument = argument;\n\t        this.prefix = prefix;\n\t    }\n\t    return UpdateExpression;\n\t}());\n\texports.UpdateExpression = UpdateExpression;\n\tvar VariableDeclaration = (function () {\n\t    function VariableDeclaration(declarations, kind) {\n\t        this.type = syntax_1.Syntax.VariableDeclaration;\n\t        this.declarations = declarations;\n\t        this.kind = kind;\n\t    }\n\t    return VariableDeclaration;\n\t}());\n\texports.VariableDeclaration = VariableDeclaration;\n\tvar VariableDeclarator = (function () {\n\t    function VariableDeclarator(id, init) {\n\t        this.type = syntax_1.Syntax.VariableDeclarator;\n\t        this.id = id;\n\t        this.init = init;\n\t    }\n\t    return VariableDeclarator;\n\t}());\n\texports.VariableDeclarator = VariableDeclarator;\n\tvar WhileStatement = (function () {\n\t    function WhileStatement(test, body) {\n\t        this.type = syntax_1.Syntax.WhileStatement;\n\t        this.test = test;\n\t        this.body = body;\n\t    }\n\t    return WhileStatement;\n\t}());\n\texports.WhileStatement = WhileStatement;\n\tvar WithStatement = (function () {\n\t    function WithStatement(object, body) {\n\t        this.type = syntax_1.Syntax.WithStatement;\n\t        this.object = object;\n\t        this.body = body;\n\t    }\n\t    return WithStatement;\n\t}());\n\texports.WithStatement = WithStatement;\n\tvar YieldExpression = (function () {\n\t    function YieldExpression(argument, delegate) {\n\t        this.type = syntax_1.Syntax.YieldExpression;\n\t        this.argument = argument;\n\t        this.delegate = delegate;\n\t    }\n\t    return YieldExpression;\n\t}());\n\texports.YieldExpression = YieldExpression;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n/* istanbul ignore next */\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t    function __() { this.constructor = d; }\n\t    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar character_1 = __webpack_require__(9);\n\tvar token_1 = __webpack_require__(7);\n\tvar parser_1 = __webpack_require__(3);\n\tvar xhtml_entities_1 = __webpack_require__(12);\n\tvar jsx_syntax_1 = __webpack_require__(13);\n\tvar Node = __webpack_require__(10);\n\tvar JSXNode = __webpack_require__(14);\n\tvar JSXToken;\n\t(function (JSXToken) {\n\t    JSXToken[JSXToken[\"Identifier\"] = 100] = \"Identifier\";\n\t    JSXToken[JSXToken[\"Text\"] = 101] = \"Text\";\n\t})(JSXToken || (JSXToken = {}));\n\ttoken_1.TokenName[JSXToken.Identifier] = 'JSXIdentifier';\n\ttoken_1.TokenName[JSXToken.Text] = 'JSXText';\n\t// Fully qualified element name, e.g. <svg:path> returns \"svg:path\"\n\tfunction getQualifiedElementName(elementName) {\n\t    var qualifiedName;\n\t    switch (elementName.type) {\n\t        case jsx_syntax_1.JSXSyntax.JSXIdentifier:\n\t            var id = (elementName);\n\t            qualifiedName = id.name;\n\t            break;\n\t        case jsx_syntax_1.JSXSyntax.JSXNamespacedName:\n\t            var ns = (elementName);\n\t            qualifiedName = getQualifiedElementName(ns.namespace) + ':' +\n\t                getQualifiedElementName(ns.name);\n\t            break;\n\t        case jsx_syntax_1.JSXSyntax.JSXMemberExpression:\n\t            var expr = (elementName);\n\t            qualifiedName = getQualifiedElementName(expr.object) + '.' +\n\t                getQualifiedElementName(expr.property);\n\t            break;\n\t    }\n\t    return qualifiedName;\n\t}\n\tvar JSXParser = (function (_super) {\n\t    __extends(JSXParser, _super);\n\t    function JSXParser(code, options, delegate) {\n\t        _super.call(this, code, options, delegate);\n\t    }\n\t    JSXParser.prototype.parsePrimaryExpression = function () {\n\t        return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);\n\t    };\n\t    JSXParser.prototype.startJSX = function () {\n\t        // Unwind the scanner before the lookahead token.\n\t        this.scanner.index = this.startMarker.index;\n\t        this.scanner.lineNumber = this.startMarker.lineNumber;\n\t        this.scanner.lineStart = this.startMarker.lineStart;\n\t    };\n\t    JSXParser.prototype.finishJSX = function () {\n\t        // Prime the next lookahead.\n\t        this.nextToken();\n\t    };\n\t    JSXParser.prototype.reenterJSX = function () {\n\t        this.startJSX();\n\t        this.expectJSX('}');\n\t        // Pop the closing '}' added from the lookahead.\n\t        if (this.config.tokens) {\n\t            this.tokens.pop();\n\t        }\n\t    };\n\t    JSXParser.prototype.createJSXNode = function () {\n\t        this.collectComments();\n\t        return {\n\t            index: this.scanner.index,\n\t            line: this.scanner.lineNumber,\n\t            column: this.scanner.index - this.scanner.lineStart\n\t        };\n\t    };\n\t    JSXParser.prototype.createJSXChildNode = function () {\n\t        return {\n\t            index: this.scanner.index,\n\t            line: this.scanner.lineNumber,\n\t            column: this.scanner.index - this.scanner.lineStart\n\t        };\n\t    };\n\t    JSXParser.prototype.scanXHTMLEntity = function (quote) {\n\t        var result = '&';\n\t        var valid = true;\n\t        var terminated = false;\n\t        var numeric = false;\n\t        var hex = false;\n\t        while (!this.scanner.eof() && valid && !terminated) {\n\t            var ch = this.scanner.source[this.scanner.index];\n\t            if (ch === quote) {\n\t                break;\n\t            }\n\t            terminated = (ch === ';');\n\t            result += ch;\n\t            ++this.scanner.index;\n\t            if (!terminated) {\n\t                switch (result.length) {\n\t                    case 2:\n\t                        // e.g. '&#123;'\n\t                        numeric = (ch === '#');\n\t                        break;\n\t                    case 3:\n\t                        if (numeric) {\n\t                            // e.g. '&#x41;'\n\t                            hex = (ch === 'x');\n\t                            valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));\n\t                            numeric = numeric && !hex;\n\t                        }\n\t                        break;\n\t                    default:\n\t                        valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));\n\t                        valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));\n\t                        break;\n\t                }\n\t            }\n\t        }\n\t        if (valid && terminated && result.length > 2) {\n\t            // e.g. '&#x41;' becomes just '#x41'\n\t            var str = result.substr(1, result.length - 2);\n\t            if (numeric && str.length > 1) {\n\t                result = String.fromCharCode(parseInt(str.substr(1), 10));\n\t            }\n\t            else if (hex && str.length > 2) {\n\t                result = String.fromCharCode(parseInt('0' + str.substr(1), 16));\n\t            }\n\t            else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {\n\t                result = xhtml_entities_1.XHTMLEntities[str];\n\t            }\n\t        }\n\t        return result;\n\t    };\n\t    // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.\n\t    JSXParser.prototype.lexJSX = function () {\n\t        var cp = this.scanner.source.charCodeAt(this.scanner.index);\n\t        // < > / : = { }\n\t        if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {\n\t            var value = this.scanner.source[this.scanner.index++];\n\t            return {\n\t                type: token_1.Token.Punctuator,\n\t                value: value,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: this.scanner.index - 1,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // \" '\n\t        if (cp === 34 || cp === 39) {\n\t            var start = this.scanner.index;\n\t            var quote = this.scanner.source[this.scanner.index++];\n\t            var str = '';\n\t            while (!this.scanner.eof()) {\n\t                var ch = this.scanner.source[this.scanner.index++];\n\t                if (ch === quote) {\n\t                    break;\n\t                }\n\t                else if (ch === '&') {\n\t                    str += this.scanXHTMLEntity(quote);\n\t                }\n\t                else {\n\t                    str += ch;\n\t                }\n\t            }\n\t            return {\n\t                type: token_1.Token.StringLiteral,\n\t                value: str,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: start,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // ... or .\n\t        if (cp === 46) {\n\t            var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);\n\t            var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);\n\t            var value = (n1 === 46 && n2 === 46) ? '...' : '.';\n\t            var start = this.scanner.index;\n\t            this.scanner.index += value.length;\n\t            return {\n\t                type: token_1.Token.Punctuator,\n\t                value: value,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: start,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // `\n\t        if (cp === 96) {\n\t            // Only placeholder, since it will be rescanned as a real assignment expression.\n\t            return {\n\t                type: token_1.Token.Template,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: this.scanner.index,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // Identifer can not contain backslash (char code 92).\n\t        if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {\n\t            var start = this.scanner.index;\n\t            ++this.scanner.index;\n\t            while (!this.scanner.eof()) {\n\t                var ch = this.scanner.source.charCodeAt(this.scanner.index);\n\t                if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {\n\t                    ++this.scanner.index;\n\t                }\n\t                else if (ch === 45) {\n\t                    // Hyphen (char code 45) can be part of an identifier.\n\t                    ++this.scanner.index;\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            var id = this.scanner.source.slice(start, this.scanner.index);\n\t            return {\n\t                type: JSXToken.Identifier,\n\t                value: id,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: start,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        this.scanner.throwUnexpectedToken();\n\t    };\n\t    JSXParser.prototype.nextJSXToken = function () {\n\t        this.collectComments();\n\t        this.startMarker.index = this.scanner.index;\n\t        this.startMarker.lineNumber = this.scanner.lineNumber;\n\t        this.startMarker.lineStart = this.scanner.lineStart;\n\t        var token = this.lexJSX();\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.lineNumber = this.scanner.lineNumber;\n\t        this.lastMarker.lineStart = this.scanner.lineStart;\n\t        if (this.config.tokens) {\n\t            this.tokens.push(this.convertToken(token));\n\t        }\n\t        return token;\n\t    };\n\t    JSXParser.prototype.nextJSXText = function () {\n\t        this.startMarker.index = this.scanner.index;\n\t        this.startMarker.lineNumber = this.scanner.lineNumber;\n\t        this.startMarker.lineStart = this.scanner.lineStart;\n\t        var start = this.scanner.index;\n\t        var text = '';\n\t        while (!this.scanner.eof()) {\n\t            var ch = this.scanner.source[this.scanner.index];\n\t            if (ch === '{' || ch === '<') {\n\t                break;\n\t            }\n\t            ++this.scanner.index;\n\t            text += ch;\n\t            if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                ++this.scanner.lineNumber;\n\t                if (ch === '\\r' && this.scanner.source[this.scanner.index] === '\\n') {\n\t                    ++this.scanner.index;\n\t                }\n\t                this.scanner.lineStart = this.scanner.index;\n\t            }\n\t        }\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.lineNumber = this.scanner.lineNumber;\n\t        this.lastMarker.lineStart = this.scanner.lineStart;\n\t        var token = {\n\t            type: JSXToken.Text,\n\t            value: text,\n\t            lineNumber: this.scanner.lineNumber,\n\t            lineStart: this.scanner.lineStart,\n\t            start: start,\n\t            end: this.scanner.index\n\t        };\n\t        if ((text.length > 0) && this.config.tokens) {\n\t            this.tokens.push(this.convertToken(token));\n\t        }\n\t        return token;\n\t    };\n\t    JSXParser.prototype.peekJSXToken = function () {\n\t        var previousIndex = this.scanner.index;\n\t        var previousLineNumber = this.scanner.lineNumber;\n\t        var previousLineStart = this.scanner.lineStart;\n\t        this.scanner.scanComments();\n\t        var next = this.lexJSX();\n\t        this.scanner.index = previousIndex;\n\t        this.scanner.lineNumber = previousLineNumber;\n\t        this.scanner.lineStart = previousLineStart;\n\t        return next;\n\t    };\n\t    // Expect the next JSX token to match the specified punctuator.\n\t    // If not, an exception will be thrown.\n\t    JSXParser.prototype.expectJSX = function (value) {\n\t        var token = this.nextJSXToken();\n\t        if (token.type !== token_1.Token.Punctuator || token.value !== value) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t    };\n\t    // Return true if the next JSX token matches the specified punctuator.\n\t    JSXParser.prototype.matchJSX = function (value) {\n\t        var next = this.peekJSXToken();\n\t        return next.type === token_1.Token.Punctuator && next.value === value;\n\t    };\n\t    JSXParser.prototype.parseJSXIdentifier = function () {\n\t        var node = this.createJSXNode();\n\t        var token = this.nextJSXToken();\n\t        if (token.type !== JSXToken.Identifier) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXIdentifier(token.value));\n\t    };\n\t    JSXParser.prototype.parseJSXElementName = function () {\n\t        var node = this.createJSXNode();\n\t        var elementName = this.parseJSXIdentifier();\n\t        if (this.matchJSX(':')) {\n\t            var namespace = elementName;\n\t            this.expectJSX(':');\n\t            var name_1 = this.parseJSXIdentifier();\n\t            elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));\n\t        }\n\t        else if (this.matchJSX('.')) {\n\t            while (this.matchJSX('.')) {\n\t                var object = elementName;\n\t                this.expectJSX('.');\n\t                var property = this.parseJSXIdentifier();\n\t                elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));\n\t            }\n\t        }\n\t        return elementName;\n\t    };\n\t    JSXParser.prototype.parseJSXAttributeName = function () {\n\t        var node = this.createJSXNode();\n\t        var attributeName;\n\t        var identifier = this.parseJSXIdentifier();\n\t        if (this.matchJSX(':')) {\n\t            var namespace = identifier;\n\t            this.expectJSX(':');\n\t            var name_2 = this.parseJSXIdentifier();\n\t            attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));\n\t        }\n\t        else {\n\t            attributeName = identifier;\n\t        }\n\t        return attributeName;\n\t    };\n\t    JSXParser.prototype.parseJSXStringLiteralAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        var token = this.nextJSXToken();\n\t        if (token.type !== token_1.Token.StringLiteral) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t        var raw = this.getTokenRaw(token);\n\t        return this.finalize(node, new Node.Literal(token.value, raw));\n\t    };\n\t    JSXParser.prototype.parseJSXExpressionAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('{');\n\t        this.finishJSX();\n\t        if (this.match('}')) {\n\t            this.tolerateError('JSX attributes must only be assigned a non-empty expression');\n\t        }\n\t        var expression = this.parseAssignmentExpression();\n\t        this.reenterJSX();\n\t        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));\n\t    };\n\t    JSXParser.prototype.parseJSXAttributeValue = function () {\n\t        return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :\n\t            this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();\n\t    };\n\t    JSXParser.prototype.parseJSXNameValueAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        var name = this.parseJSXAttributeName();\n\t        var value = null;\n\t        if (this.matchJSX('=')) {\n\t            this.expectJSX('=');\n\t            value = this.parseJSXAttributeValue();\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXAttribute(name, value));\n\t    };\n\t    JSXParser.prototype.parseJSXSpreadAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('{');\n\t        this.expectJSX('...');\n\t        this.finishJSX();\n\t        var argument = this.parseAssignmentExpression();\n\t        this.reenterJSX();\n\t        return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));\n\t    };\n\t    JSXParser.prototype.parseJSXAttributes = function () {\n\t        var attributes = [];\n\t        while (!this.matchJSX('/') && !this.matchJSX('>')) {\n\t            var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :\n\t                this.parseJSXNameValueAttribute();\n\t            attributes.push(attribute);\n\t        }\n\t        return attributes;\n\t    };\n\t    JSXParser.prototype.parseJSXOpeningElement = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('<');\n\t        var name = this.parseJSXElementName();\n\t        var attributes = this.parseJSXAttributes();\n\t        var selfClosing = this.matchJSX('/');\n\t        if (selfClosing) {\n\t            this.expectJSX('/');\n\t        }\n\t        this.expectJSX('>');\n\t        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));\n\t    };\n\t    JSXParser.prototype.parseJSXBoundaryElement = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('<');\n\t        if (this.matchJSX('/')) {\n\t            this.expectJSX('/');\n\t            var name_3 = this.parseJSXElementName();\n\t            this.expectJSX('>');\n\t            return this.finalize(node, new JSXNode.JSXClosingElement(name_3));\n\t        }\n\t        var name = this.parseJSXElementName();\n\t        var attributes = this.parseJSXAttributes();\n\t        var selfClosing = this.matchJSX('/');\n\t        if (selfClosing) {\n\t            this.expectJSX('/');\n\t        }\n\t        this.expectJSX('>');\n\t        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));\n\t    };\n\t    JSXParser.prototype.parseJSXEmptyExpression = function () {\n\t        var node = this.createJSXChildNode();\n\t        this.collectComments();\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.lineNumber = this.scanner.lineNumber;\n\t        this.lastMarker.lineStart = this.scanner.lineStart;\n\t        return this.finalize(node, new JSXNode.JSXEmptyExpression());\n\t    };\n\t    JSXParser.prototype.parseJSXExpressionContainer = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('{');\n\t        var expression;\n\t        if (this.matchJSX('}')) {\n\t            expression = this.parseJSXEmptyExpression();\n\t            this.expectJSX('}');\n\t        }\n\t        else {\n\t            this.finishJSX();\n\t            expression = this.parseAssignmentExpression();\n\t            this.reenterJSX();\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));\n\t    };\n\t    JSXParser.prototype.parseJSXChildren = function () {\n\t        var children = [];\n\t        while (!this.scanner.eof()) {\n\t            var node = this.createJSXChildNode();\n\t            var token = this.nextJSXText();\n\t            if (token.start < token.end) {\n\t                var raw = this.getTokenRaw(token);\n\t                var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));\n\t                children.push(child);\n\t            }\n\t            if (this.scanner.source[this.scanner.index] === '{') {\n\t                var container = this.parseJSXExpressionContainer();\n\t                children.push(container);\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return children;\n\t    };\n\t    JSXParser.prototype.parseComplexJSXElement = function (el) {\n\t        var stack = [];\n\t        while (!this.scanner.eof()) {\n\t            el.children = el.children.concat(this.parseJSXChildren());\n\t            var node = this.createJSXChildNode();\n\t            var element = this.parseJSXBoundaryElement();\n\t            if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {\n\t                var opening = (element);\n\t                if (opening.selfClosing) {\n\t                    var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));\n\t                    el.children.push(child);\n\t                }\n\t                else {\n\t                    stack.push(el);\n\t                    el = { node: node, opening: opening, closing: null, children: [] };\n\t                }\n\t            }\n\t            if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {\n\t                el.closing = (element);\n\t                var open_1 = getQualifiedElementName(el.opening.name);\n\t                var close_1 = getQualifiedElementName(el.closing.name);\n\t                if (open_1 !== close_1) {\n\t                    this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);\n\t                }\n\t                if (stack.length > 0) {\n\t                    var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));\n\t                    el = stack.pop();\n\t                    el.children.push(child);\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t        }\n\t        return el;\n\t    };\n\t    JSXParser.prototype.parseJSXElement = function () {\n\t        var node = this.createJSXNode();\n\t        var opening = this.parseJSXOpeningElement();\n\t        var children = [];\n\t        var closing = null;\n\t        if (!opening.selfClosing) {\n\t            var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });\n\t            children = el.children;\n\t            closing = el.closing;\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));\n\t    };\n\t    JSXParser.prototype.parseJSXRoot = function () {\n\t        // Pop the opening '<' added from the lookahead.\n\t        if (this.config.tokens) {\n\t            this.tokens.pop();\n\t        }\n\t        this.startJSX();\n\t        var element = this.parseJSXElement();\n\t        this.finishJSX();\n\t        return element;\n\t    };\n\t    return JSXParser;\n\t}(parser_1.Parser));\n\texports.JSXParser = JSXParser;\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t// Generated by generate-xhtml-entities.js. DO NOT MODIFY!\n\t\"use strict\";\n\texports.XHTMLEntities = {\n\t    quot: '\\u0022',\n\t    amp: '\\u0026',\n\t    apos: '\\u0027',\n\t    gt: '\\u003E',\n\t    nbsp: '\\u00A0',\n\t    iexcl: '\\u00A1',\n\t    cent: '\\u00A2',\n\t    pound: '\\u00A3',\n\t    curren: '\\u00A4',\n\t    yen: '\\u00A5',\n\t    brvbar: '\\u00A6',\n\t    sect: '\\u00A7',\n\t    uml: '\\u00A8',\n\t    copy: '\\u00A9',\n\t    ordf: '\\u00AA',\n\t    laquo: '\\u00AB',\n\t    not: '\\u00AC',\n\t    shy: '\\u00AD',\n\t    reg: '\\u00AE',\n\t    macr: '\\u00AF',\n\t    deg: '\\u00B0',\n\t    plusmn: '\\u00B1',\n\t    sup2: '\\u00B2',\n\t    sup3: '\\u00B3',\n\t    acute: '\\u00B4',\n\t    micro: '\\u00B5',\n\t    para: '\\u00B6',\n\t    middot: '\\u00B7',\n\t    cedil: '\\u00B8',\n\t    sup1: '\\u00B9',\n\t    ordm: '\\u00BA',\n\t    raquo: '\\u00BB',\n\t    frac14: '\\u00BC',\n\t    frac12: '\\u00BD',\n\t    frac34: '\\u00BE',\n\t    iquest: '\\u00BF',\n\t    Agrave: '\\u00C0',\n\t    Aacute: '\\u00C1',\n\t    Acirc: '\\u00C2',\n\t    Atilde: '\\u00C3',\n\t    Auml: '\\u00C4',\n\t    Aring: '\\u00C5',\n\t    AElig: '\\u00C6',\n\t    Ccedil: '\\u00C7',\n\t    Egrave: '\\u00C8',\n\t    Eacute: '\\u00C9',\n\t    Ecirc: '\\u00CA',\n\t    Euml: '\\u00CB',\n\t    Igrave: '\\u00CC',\n\t    Iacute: '\\u00CD',\n\t    Icirc: '\\u00CE',\n\t    Iuml: '\\u00CF',\n\t    ETH: '\\u00D0',\n\t    Ntilde: '\\u00D1',\n\t    Ograve: '\\u00D2',\n\t    Oacute: '\\u00D3',\n\t    Ocirc: '\\u00D4',\n\t    Otilde: '\\u00D5',\n\t    Ouml: '\\u00D6',\n\t    times: '\\u00D7',\n\t    Oslash: '\\u00D8',\n\t    Ugrave: '\\u00D9',\n\t    Uacute: '\\u00DA',\n\t    Ucirc: '\\u00DB',\n\t    Uuml: '\\u00DC',\n\t    Yacute: '\\u00DD',\n\t    THORN: '\\u00DE',\n\t    szlig: '\\u00DF',\n\t    agrave: '\\u00E0',\n\t    aacute: '\\u00E1',\n\t    acirc: '\\u00E2',\n\t    atilde: '\\u00E3',\n\t    auml: '\\u00E4',\n\t    aring: '\\u00E5',\n\t    aelig: '\\u00E6',\n\t    ccedil: '\\u00E7',\n\t    egrave: '\\u00E8',\n\t    eacute: '\\u00E9',\n\t    ecirc: '\\u00EA',\n\t    euml: '\\u00EB',\n\t    igrave: '\\u00EC',\n\t    iacute: '\\u00ED',\n\t    icirc: '\\u00EE',\n\t    iuml: '\\u00EF',\n\t    eth: '\\u00F0',\n\t    ntilde: '\\u00F1',\n\t    ograve: '\\u00F2',\n\t    oacute: '\\u00F3',\n\t    ocirc: '\\u00F4',\n\t    otilde: '\\u00F5',\n\t    ouml: '\\u00F6',\n\t    divide: '\\u00F7',\n\t    oslash: '\\u00F8',\n\t    ugrave: '\\u00F9',\n\t    uacute: '\\u00FA',\n\t    ucirc: '\\u00FB',\n\t    uuml: '\\u00FC',\n\t    yacute: '\\u00FD',\n\t    thorn: '\\u00FE',\n\t    yuml: '\\u00FF',\n\t    OElig: '\\u0152',\n\t    oelig: '\\u0153',\n\t    Scaron: '\\u0160',\n\t    scaron: '\\u0161',\n\t    Yuml: '\\u0178',\n\t    fnof: '\\u0192',\n\t    circ: '\\u02C6',\n\t    tilde: '\\u02DC',\n\t    Alpha: '\\u0391',\n\t    Beta: '\\u0392',\n\t    Gamma: '\\u0393',\n\t    Delta: '\\u0394',\n\t    Epsilon: '\\u0395',\n\t    Zeta: '\\u0396',\n\t    Eta: '\\u0397',\n\t    Theta: '\\u0398',\n\t    Iota: '\\u0399',\n\t    Kappa: '\\u039A',\n\t    Lambda: '\\u039B',\n\t    Mu: '\\u039C',\n\t    Nu: '\\u039D',\n\t    Xi: '\\u039E',\n\t    Omicron: '\\u039F',\n\t    Pi: '\\u03A0',\n\t    Rho: '\\u03A1',\n\t    Sigma: '\\u03A3',\n\t    Tau: '\\u03A4',\n\t    Upsilon: '\\u03A5',\n\t    Phi: '\\u03A6',\n\t    Chi: '\\u03A7',\n\t    Psi: '\\u03A8',\n\t    Omega: '\\u03A9',\n\t    alpha: '\\u03B1',\n\t    beta: '\\u03B2',\n\t    gamma: '\\u03B3',\n\t    delta: '\\u03B4',\n\t    epsilon: '\\u03B5',\n\t    zeta: '\\u03B6',\n\t    eta: '\\u03B7',\n\t    theta: '\\u03B8',\n\t    iota: '\\u03B9',\n\t    kappa: '\\u03BA',\n\t    lambda: '\\u03BB',\n\t    mu: '\\u03BC',\n\t    nu: '\\u03BD',\n\t    xi: '\\u03BE',\n\t    omicron: '\\u03BF',\n\t    pi: '\\u03C0',\n\t    rho: '\\u03C1',\n\t    sigmaf: '\\u03C2',\n\t    sigma: '\\u03C3',\n\t    tau: '\\u03C4',\n\t    upsilon: '\\u03C5',\n\t    phi: '\\u03C6',\n\t    chi: '\\u03C7',\n\t    psi: '\\u03C8',\n\t    omega: '\\u03C9',\n\t    thetasym: '\\u03D1',\n\t    upsih: '\\u03D2',\n\t    piv: '\\u03D6',\n\t    ensp: '\\u2002',\n\t    emsp: '\\u2003',\n\t    thinsp: '\\u2009',\n\t    zwnj: '\\u200C',\n\t    zwj: '\\u200D',\n\t    lrm: '\\u200E',\n\t    rlm: '\\u200F',\n\t    ndash: '\\u2013',\n\t    mdash: '\\u2014',\n\t    lsquo: '\\u2018',\n\t    rsquo: '\\u2019',\n\t    sbquo: '\\u201A',\n\t    ldquo: '\\u201C',\n\t    rdquo: '\\u201D',\n\t    bdquo: '\\u201E',\n\t    dagger: '\\u2020',\n\t    Dagger: '\\u2021',\n\t    bull: '\\u2022',\n\t    hellip: '\\u2026',\n\t    permil: '\\u2030',\n\t    prime: '\\u2032',\n\t    Prime: '\\u2033',\n\t    lsaquo: '\\u2039',\n\t    rsaquo: '\\u203A',\n\t    oline: '\\u203E',\n\t    frasl: '\\u2044',\n\t    euro: '\\u20AC',\n\t    image: '\\u2111',\n\t    weierp: '\\u2118',\n\t    real: '\\u211C',\n\t    trade: '\\u2122',\n\t    alefsym: '\\u2135',\n\t    larr: '\\u2190',\n\t    uarr: '\\u2191',\n\t    rarr: '\\u2192',\n\t    darr: '\\u2193',\n\t    harr: '\\u2194',\n\t    crarr: '\\u21B5',\n\t    lArr: '\\u21D0',\n\t    uArr: '\\u21D1',\n\t    rArr: '\\u21D2',\n\t    dArr: '\\u21D3',\n\t    hArr: '\\u21D4',\n\t    forall: '\\u2200',\n\t    part: '\\u2202',\n\t    exist: '\\u2203',\n\t    empty: '\\u2205',\n\t    nabla: '\\u2207',\n\t    isin: '\\u2208',\n\t    notin: '\\u2209',\n\t    ni: '\\u220B',\n\t    prod: '\\u220F',\n\t    sum: '\\u2211',\n\t    minus: '\\u2212',\n\t    lowast: '\\u2217',\n\t    radic: '\\u221A',\n\t    prop: '\\u221D',\n\t    infin: '\\u221E',\n\t    ang: '\\u2220',\n\t    and: '\\u2227',\n\t    or: '\\u2228',\n\t    cap: '\\u2229',\n\t    cup: '\\u222A',\n\t    int: '\\u222B',\n\t    there4: '\\u2234',\n\t    sim: '\\u223C',\n\t    cong: '\\u2245',\n\t    asymp: '\\u2248',\n\t    ne: '\\u2260',\n\t    equiv: '\\u2261',\n\t    le: '\\u2264',\n\t    ge: '\\u2265',\n\t    sub: '\\u2282',\n\t    sup: '\\u2283',\n\t    nsub: '\\u2284',\n\t    sube: '\\u2286',\n\t    supe: '\\u2287',\n\t    oplus: '\\u2295',\n\t    otimes: '\\u2297',\n\t    perp: '\\u22A5',\n\t    sdot: '\\u22C5',\n\t    lceil: '\\u2308',\n\t    rceil: '\\u2309',\n\t    lfloor: '\\u230A',\n\t    rfloor: '\\u230B',\n\t    loz: '\\u25CA',\n\t    spades: '\\u2660',\n\t    clubs: '\\u2663',\n\t    hearts: '\\u2665',\n\t    diams: '\\u2666',\n\t    lang: '\\u27E8',\n\t    rang: '\\u27E9'\n\t};\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\texports.JSXSyntax = {\n\t    JSXAttribute: 'JSXAttribute',\n\t    JSXClosingElement: 'JSXClosingElement',\n\t    JSXElement: 'JSXElement',\n\t    JSXEmptyExpression: 'JSXEmptyExpression',\n\t    JSXExpressionContainer: 'JSXExpressionContainer',\n\t    JSXIdentifier: 'JSXIdentifier',\n\t    JSXMemberExpression: 'JSXMemberExpression',\n\t    JSXNamespacedName: 'JSXNamespacedName',\n\t    JSXOpeningElement: 'JSXOpeningElement',\n\t    JSXSpreadAttribute: 'JSXSpreadAttribute',\n\t    JSXText: 'JSXText'\n\t};\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar jsx_syntax_1 = __webpack_require__(13);\n\tvar JSXClosingElement = (function () {\n\t    function JSXClosingElement(name) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;\n\t        this.name = name;\n\t    }\n\t    return JSXClosingElement;\n\t}());\n\texports.JSXClosingElement = JSXClosingElement;\n\tvar JSXElement = (function () {\n\t    function JSXElement(openingElement, children, closingElement) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXElement;\n\t        this.openingElement = openingElement;\n\t        this.children = children;\n\t        this.closingElement = closingElement;\n\t    }\n\t    return JSXElement;\n\t}());\n\texports.JSXElement = JSXElement;\n\tvar JSXEmptyExpression = (function () {\n\t    function JSXEmptyExpression() {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;\n\t    }\n\t    return JSXEmptyExpression;\n\t}());\n\texports.JSXEmptyExpression = JSXEmptyExpression;\n\tvar JSXExpressionContainer = (function () {\n\t    function JSXExpressionContainer(expression) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;\n\t        this.expression = expression;\n\t    }\n\t    return JSXExpressionContainer;\n\t}());\n\texports.JSXExpressionContainer = JSXExpressionContainer;\n\tvar JSXIdentifier = (function () {\n\t    function JSXIdentifier(name) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;\n\t        this.name = name;\n\t    }\n\t    return JSXIdentifier;\n\t}());\n\texports.JSXIdentifier = JSXIdentifier;\n\tvar JSXMemberExpression = (function () {\n\t    function JSXMemberExpression(object, property) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;\n\t        this.object = object;\n\t        this.property = property;\n\t    }\n\t    return JSXMemberExpression;\n\t}());\n\texports.JSXMemberExpression = JSXMemberExpression;\n\tvar JSXAttribute = (function () {\n\t    function JSXAttribute(name, value) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;\n\t        this.name = name;\n\t        this.value = value;\n\t    }\n\t    return JSXAttribute;\n\t}());\n\texports.JSXAttribute = JSXAttribute;\n\tvar JSXNamespacedName = (function () {\n\t    function JSXNamespacedName(namespace, name) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;\n\t        this.namespace = namespace;\n\t        this.name = name;\n\t    }\n\t    return JSXNamespacedName;\n\t}());\n\texports.JSXNamespacedName = JSXNamespacedName;\n\tvar JSXOpeningElement = (function () {\n\t    function JSXOpeningElement(name, selfClosing, attributes) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;\n\t        this.name = name;\n\t        this.selfClosing = selfClosing;\n\t        this.attributes = attributes;\n\t    }\n\t    return JSXOpeningElement;\n\t}());\n\texports.JSXOpeningElement = JSXOpeningElement;\n\tvar JSXSpreadAttribute = (function () {\n\t    function JSXSpreadAttribute(argument) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;\n\t        this.argument = argument;\n\t    }\n\t    return JSXSpreadAttribute;\n\t}());\n\texports.JSXSpreadAttribute = JSXSpreadAttribute;\n\tvar JSXText = (function () {\n\t    function JSXText(value, raw) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXText;\n\t        this.value = value;\n\t        this.raw = raw;\n\t    }\n\t    return JSXText;\n\t}());\n\texports.JSXText = JSXText;\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar scanner_1 = __webpack_require__(8);\n\tvar error_handler_1 = __webpack_require__(6);\n\tvar token_1 = __webpack_require__(7);\n\tvar Reader = (function () {\n\t    function Reader() {\n\t        this.values = [];\n\t        this.curly = this.paren = -1;\n\t    }\n\t    ;\n\t    // A function following one of those tokens is an expression.\n\t    Reader.prototype.beforeFunctionExpression = function (t) {\n\t        return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',\n\t            'return', 'case', 'delete', 'throw', 'void',\n\t            // assignment operators\n\t            '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=',\n\t            '&=', '|=', '^=', ',',\n\t            // binary/unary operators\n\t            '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&',\n\t            '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',\n\t            '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0;\n\t    };\n\t    ;\n\t    // Determine if forward slash (/) is an operator or part of a regular expression\n\t    // https://github.com/mozilla/sweet.js/wiki/design\n\t    Reader.prototype.isRegexStart = function () {\n\t        var previous = this.values[this.values.length - 1];\n\t        var regex = (previous !== null);\n\t        switch (previous) {\n\t            case 'this':\n\t            case ']':\n\t                regex = false;\n\t                break;\n\t            case ')':\n\t                var check = this.values[this.paren - 1];\n\t                regex = (check === 'if' || check === 'while' || check === 'for' || check === 'with');\n\t                break;\n\t            case '}':\n\t                // Dividing a function by anything makes little sense,\n\t                // but we have to check for that.\n\t                regex = false;\n\t                if (this.values[this.curly - 3] === 'function') {\n\t                    // Anonymous function, e.g. function(){} /42\n\t                    var check_1 = this.values[this.curly - 4];\n\t                    regex = check_1 ? !this.beforeFunctionExpression(check_1) : false;\n\t                }\n\t                else if (this.values[this.curly - 4] === 'function') {\n\t                    // Named function, e.g. function f(){} /42/\n\t                    var check_2 = this.values[this.curly - 5];\n\t                    regex = check_2 ? !this.beforeFunctionExpression(check_2) : true;\n\t                }\n\t        }\n\t        return regex;\n\t    };\n\t    ;\n\t    Reader.prototype.push = function (token) {\n\t        if (token.type === token_1.Token.Punctuator || token.type === token_1.Token.Keyword) {\n\t            if (token.value === '{') {\n\t                this.curly = this.values.length;\n\t            }\n\t            else if (token.value === '(') {\n\t                this.paren = this.values.length;\n\t            }\n\t            this.values.push(token.value);\n\t        }\n\t        else {\n\t            this.values.push(null);\n\t        }\n\t    };\n\t    ;\n\t    return Reader;\n\t}());\n\tvar Tokenizer = (function () {\n\t    function Tokenizer(code, config) {\n\t        this.errorHandler = new error_handler_1.ErrorHandler();\n\t        this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false;\n\t        this.scanner = new scanner_1.Scanner(code, this.errorHandler);\n\t        this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false;\n\t        this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false;\n\t        this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false;\n\t        this.buffer = [];\n\t        this.reader = new Reader();\n\t    }\n\t    ;\n\t    Tokenizer.prototype.errors = function () {\n\t        return this.errorHandler.errors;\n\t    };\n\t    ;\n\t    Tokenizer.prototype.getNextToken = function () {\n\t        if (this.buffer.length === 0) {\n\t            var comments = this.scanner.scanComments();\n\t            if (this.scanner.trackComment) {\n\t                for (var i = 0; i < comments.length; ++i) {\n\t                    var e = comments[i];\n\t                    var comment = void 0;\n\t                    var value = this.scanner.source.slice(e.slice[0], e.slice[1]);\n\t                    comment = {\n\t                        type: e.multiLine ? 'BlockComment' : 'LineComment',\n\t                        value: value\n\t                    };\n\t                    if (this.trackRange) {\n\t                        comment.range = e.range;\n\t                    }\n\t                    if (this.trackLoc) {\n\t                        comment.loc = e.loc;\n\t                    }\n\t                    this.buffer.push(comment);\n\t                }\n\t            }\n\t            if (!this.scanner.eof()) {\n\t                var loc = void 0;\n\t                if (this.trackLoc) {\n\t                    loc = {\n\t                        start: {\n\t                            line: this.scanner.lineNumber,\n\t                            column: this.scanner.index - this.scanner.lineStart\n\t                        },\n\t                        end: {}\n\t                    };\n\t                }\n\t                var token = void 0;\n\t                if (this.scanner.source[this.scanner.index] === '/') {\n\t                    token = this.reader.isRegexStart() ? this.scanner.scanRegExp() : this.scanner.scanPunctuator();\n\t                }\n\t                else {\n\t                    token = this.scanner.lex();\n\t                }\n\t                this.reader.push(token);\n\t                var entry = void 0;\n\t                entry = {\n\t                    type: token_1.TokenName[token.type],\n\t                    value: this.scanner.source.slice(token.start, token.end)\n\t                };\n\t                if (this.trackRange) {\n\t                    entry.range = [token.start, token.end];\n\t                }\n\t                if (this.trackLoc) {\n\t                    loc.end = {\n\t                        line: this.scanner.lineNumber,\n\t                        column: this.scanner.index - this.scanner.lineStart\n\t                    };\n\t                    entry.loc = loc;\n\t                }\n\t                if (token.regex) {\n\t                    entry.regex = token.regex;\n\t                }\n\t                this.buffer.push(entry);\n\t            }\n\t        }\n\t        return this.buffer.shift();\n\t    };\n\t    ;\n\t    return Tokenizer;\n\t}());\n\texports.Tokenizer = Tokenizer;\n\n\n/***/ }\n/******/ ])\n});\n;\n},{}],157:[function(require,module,exports){\n/*\n  Copyright (C) 2012-2013 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n/*jslint vars:false, bitwise:true*/\n/*jshint indent:4*/\n/*global exports:true*/\n(function clone(exports) {\n    'use strict';\n\n    var Syntax,\n        isArray,\n        VisitorOption,\n        VisitorKeys,\n        objectCreate,\n        objectKeys,\n        BREAK,\n        SKIP,\n        REMOVE;\n\n    function ignoreJSHintError() { }\n\n    isArray = Array.isArray;\n    if (!isArray) {\n        isArray = function isArray(array) {\n            return Object.prototype.toString.call(array) === '[object Array]';\n        };\n    }\n\n    function deepCopy(obj) {\n        var ret = {}, key, val;\n        for (key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                val = obj[key];\n                if (typeof val === 'object' && val !== null) {\n                    ret[key] = deepCopy(val);\n                } else {\n                    ret[key] = val;\n                }\n            }\n        }\n        return ret;\n    }\n\n    function shallowCopy(obj) {\n        var ret = {}, key;\n        for (key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                ret[key] = obj[key];\n            }\n        }\n        return ret;\n    }\n    ignoreJSHintError(shallowCopy);\n\n    // based on LLVM libc++ upper_bound / lower_bound\n    // MIT License\n\n    function upperBound(array, func) {\n        var diff, len, i, current;\n\n        len = array.length;\n        i = 0;\n\n        while (len) {\n            diff = len >>> 1;\n            current = i + diff;\n            if (func(array[current])) {\n                len = diff;\n            } else {\n                i = current + 1;\n                len -= diff + 1;\n            }\n        }\n        return i;\n    }\n\n    function lowerBound(array, func) {\n        var diff, len, i, current;\n\n        len = array.length;\n        i = 0;\n\n        while (len) {\n            diff = len >>> 1;\n            current = i + diff;\n            if (func(array[current])) {\n                i = current + 1;\n                len -= diff + 1;\n            } else {\n                len = diff;\n            }\n        }\n        return i;\n    }\n    ignoreJSHintError(lowerBound);\n\n    objectCreate = Object.create || (function () {\n        function F() { }\n\n        return function (o) {\n            F.prototype = o;\n            return new F();\n        };\n    })();\n\n    objectKeys = Object.keys || function (o) {\n        var keys = [], key;\n        for (key in o) {\n            keys.push(key);\n        }\n        return keys;\n    };\n\n    function extend(to, from) {\n        var keys = objectKeys(from), key, i, len;\n        for (i = 0, len = keys.length; i < len; i += 1) {\n            key = keys[i];\n            to[key] = from[key];\n        }\n        return to;\n    }\n\n    Syntax = {\n        AssignmentExpression: 'AssignmentExpression',\n        AssignmentPattern: 'AssignmentPattern',\n        ArrayExpression: 'ArrayExpression',\n        ArrayPattern: 'ArrayPattern',\n        ArrowFunctionExpression: 'ArrowFunctionExpression',\n        AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.\n        BlockStatement: 'BlockStatement',\n        BinaryExpression: 'BinaryExpression',\n        BreakStatement: 'BreakStatement',\n        CallExpression: 'CallExpression',\n        CatchClause: 'CatchClause',\n        ClassBody: 'ClassBody',\n        ClassDeclaration: 'ClassDeclaration',\n        ClassExpression: 'ClassExpression',\n        ComprehensionBlock: 'ComprehensionBlock',  // CAUTION: It's deferred to ES7.\n        ComprehensionExpression: 'ComprehensionExpression',  // CAUTION: It's deferred to ES7.\n        ConditionalExpression: 'ConditionalExpression',\n        ContinueStatement: 'ContinueStatement',\n        DebuggerStatement: 'DebuggerStatement',\n        DirectiveStatement: 'DirectiveStatement',\n        DoWhileStatement: 'DoWhileStatement',\n        EmptyStatement: 'EmptyStatement',\n        ExportAllDeclaration: 'ExportAllDeclaration',\n        ExportDefaultDeclaration: 'ExportDefaultDeclaration',\n        ExportNamedDeclaration: 'ExportNamedDeclaration',\n        ExportSpecifier: 'ExportSpecifier',\n        ExpressionStatement: 'ExpressionStatement',\n        ForStatement: 'ForStatement',\n        ForInStatement: 'ForInStatement',\n        ForOfStatement: 'ForOfStatement',\n        FunctionDeclaration: 'FunctionDeclaration',\n        FunctionExpression: 'FunctionExpression',\n        GeneratorExpression: 'GeneratorExpression',  // CAUTION: It's deferred to ES7.\n        Identifier: 'Identifier',\n        IfStatement: 'IfStatement',\n        ImportDeclaration: 'ImportDeclaration',\n        ImportDefaultSpecifier: 'ImportDefaultSpecifier',\n        ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\n        ImportSpecifier: 'ImportSpecifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        MetaProperty: 'MetaProperty',\n        MethodDefinition: 'MethodDefinition',\n        ModuleSpecifier: 'ModuleSpecifier',\n        NewExpression: 'NewExpression',\n        ObjectExpression: 'ObjectExpression',\n        ObjectPattern: 'ObjectPattern',\n        Program: 'Program',\n        Property: 'Property',\n        RestElement: 'RestElement',\n        ReturnStatement: 'ReturnStatement',\n        SequenceExpression: 'SequenceExpression',\n        SpreadElement: 'SpreadElement',\n        Super: 'Super',\n        SwitchStatement: 'SwitchStatement',\n        SwitchCase: 'SwitchCase',\n        TaggedTemplateExpression: 'TaggedTemplateExpression',\n        TemplateElement: 'TemplateElement',\n        TemplateLiteral: 'TemplateLiteral',\n        ThisExpression: 'ThisExpression',\n        ThrowStatement: 'ThrowStatement',\n        TryStatement: 'TryStatement',\n        UnaryExpression: 'UnaryExpression',\n        UpdateExpression: 'UpdateExpression',\n        VariableDeclaration: 'VariableDeclaration',\n        VariableDeclarator: 'VariableDeclarator',\n        WhileStatement: 'WhileStatement',\n        WithStatement: 'WithStatement',\n        YieldExpression: 'YieldExpression'\n    };\n\n    VisitorKeys = {\n        AssignmentExpression: ['left', 'right'],\n        AssignmentPattern: ['left', 'right'],\n        ArrayExpression: ['elements'],\n        ArrayPattern: ['elements'],\n        ArrowFunctionExpression: ['params', 'body'],\n        AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.\n        BlockStatement: ['body'],\n        BinaryExpression: ['left', 'right'],\n        BreakStatement: ['label'],\n        CallExpression: ['callee', 'arguments'],\n        CatchClause: ['param', 'body'],\n        ClassBody: ['body'],\n        ClassDeclaration: ['id', 'superClass', 'body'],\n        ClassExpression: ['id', 'superClass', 'body'],\n        ComprehensionBlock: ['left', 'right'],  // CAUTION: It's deferred to ES7.\n        ComprehensionExpression: ['blocks', 'filter', 'body'],  // CAUTION: It's deferred to ES7.\n        ConditionalExpression: ['test', 'consequent', 'alternate'],\n        ContinueStatement: ['label'],\n        DebuggerStatement: [],\n        DirectiveStatement: [],\n        DoWhileStatement: ['body', 'test'],\n        EmptyStatement: [],\n        ExportAllDeclaration: ['source'],\n        ExportDefaultDeclaration: ['declaration'],\n        ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],\n        ExportSpecifier: ['exported', 'local'],\n        ExpressionStatement: ['expression'],\n        ForStatement: ['init', 'test', 'update', 'body'],\n        ForInStatement: ['left', 'right', 'body'],\n        ForOfStatement: ['left', 'right', 'body'],\n        FunctionDeclaration: ['id', 'params', 'body'],\n        FunctionExpression: ['id', 'params', 'body'],\n        GeneratorExpression: ['blocks', 'filter', 'body'],  // CAUTION: It's deferred to ES7.\n        Identifier: [],\n        IfStatement: ['test', 'consequent', 'alternate'],\n        ImportDeclaration: ['specifiers', 'source'],\n        ImportDefaultSpecifier: ['local'],\n        ImportNamespaceSpecifier: ['local'],\n        ImportSpecifier: ['imported', 'local'],\n        Literal: [],\n        LabeledStatement: ['label', 'body'],\n        LogicalExpression: ['left', 'right'],\n        MemberExpression: ['object', 'property'],\n        MetaProperty: ['meta', 'property'],\n        MethodDefinition: ['key', 'value'],\n        ModuleSpecifier: [],\n        NewExpression: ['callee', 'arguments'],\n        ObjectExpression: ['properties'],\n        ObjectPattern: ['properties'],\n        Program: ['body'],\n        Property: ['key', 'value'],\n        RestElement: [ 'argument' ],\n        ReturnStatement: ['argument'],\n        SequenceExpression: ['expressions'],\n        SpreadElement: ['argument'],\n        Super: [],\n        SwitchStatement: ['discriminant', 'cases'],\n        SwitchCase: ['test', 'consequent'],\n        TaggedTemplateExpression: ['tag', 'quasi'],\n        TemplateElement: [],\n        TemplateLiteral: ['quasis', 'expressions'],\n        ThisExpression: [],\n        ThrowStatement: ['argument'],\n        TryStatement: ['block', 'handler', 'finalizer'],\n        UnaryExpression: ['argument'],\n        UpdateExpression: ['argument'],\n        VariableDeclaration: ['declarations'],\n        VariableDeclarator: ['id', 'init'],\n        WhileStatement: ['test', 'body'],\n        WithStatement: ['object', 'body'],\n        YieldExpression: ['argument']\n    };\n\n    // unique id\n    BREAK = {};\n    SKIP = {};\n    REMOVE = {};\n\n    VisitorOption = {\n        Break: BREAK,\n        Skip: SKIP,\n        Remove: REMOVE\n    };\n\n    function Reference(parent, key) {\n        this.parent = parent;\n        this.key = key;\n    }\n\n    Reference.prototype.replace = function replace(node) {\n        this.parent[this.key] = node;\n    };\n\n    Reference.prototype.remove = function remove() {\n        if (isArray(this.parent)) {\n            this.parent.splice(this.key, 1);\n            return true;\n        } else {\n            this.replace(null);\n            return false;\n        }\n    };\n\n    function Element(node, path, wrap, ref) {\n        this.node = node;\n        this.path = path;\n        this.wrap = wrap;\n        this.ref = ref;\n    }\n\n    function Controller() { }\n\n    // API:\n    // return property path array from root to current node\n    Controller.prototype.path = function path() {\n        var i, iz, j, jz, result, element;\n\n        function addToPath(result, path) {\n            if (isArray(path)) {\n                for (j = 0, jz = path.length; j < jz; ++j) {\n                    result.push(path[j]);\n                }\n            } else {\n                result.push(path);\n            }\n        }\n\n        // root node\n        if (!this.__current.path) {\n            return null;\n        }\n\n        // first node is sentinel, second node is root element\n        result = [];\n        for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {\n            element = this.__leavelist[i];\n            addToPath(result, element.path);\n        }\n        addToPath(result, this.__current.path);\n        return result;\n    };\n\n    // API:\n    // return type of current node\n    Controller.prototype.type = function () {\n        var node = this.current();\n        return node.type || this.__current.wrap;\n    };\n\n    // API:\n    // return array of parent elements\n    Controller.prototype.parents = function parents() {\n        var i, iz, result;\n\n        // first node is sentinel\n        result = [];\n        for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {\n            result.push(this.__leavelist[i].node);\n        }\n\n        return result;\n    };\n\n    // API:\n    // return current node\n    Controller.prototype.current = function current() {\n        return this.__current.node;\n    };\n\n    Controller.prototype.__execute = function __execute(callback, element) {\n        var previous, result;\n\n        result = undefined;\n\n        previous  = this.__current;\n        this.__current = element;\n        this.__state = null;\n        if (callback) {\n            result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);\n        }\n        this.__current = previous;\n\n        return result;\n    };\n\n    // API:\n    // notify control skip / break\n    Controller.prototype.notify = function notify(flag) {\n        this.__state = flag;\n    };\n\n    // API:\n    // skip child nodes of current node\n    Controller.prototype.skip = function () {\n        this.notify(SKIP);\n    };\n\n    // API:\n    // break traversals\n    Controller.prototype['break'] = function () {\n        this.notify(BREAK);\n    };\n\n    // API:\n    // remove node\n    Controller.prototype.remove = function () {\n        this.notify(REMOVE);\n    };\n\n    Controller.prototype.__initialize = function(root, visitor) {\n        this.visitor = visitor;\n        this.root = root;\n        this.__worklist = [];\n        this.__leavelist = [];\n        this.__current = null;\n        this.__state = null;\n        this.__fallback = null;\n        if (visitor.fallback === 'iteration') {\n            this.__fallback = objectKeys;\n        } else if (typeof visitor.fallback === 'function') {\n            this.__fallback = visitor.fallback;\n        }\n\n        this.__keys = VisitorKeys;\n        if (visitor.keys) {\n            this.__keys = extend(objectCreate(this.__keys), visitor.keys);\n        }\n    };\n\n    function isNode(node) {\n        if (node == null) {\n            return false;\n        }\n        return typeof node === 'object' && typeof node.type === 'string';\n    }\n\n    function isProperty(nodeType, key) {\n        return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;\n    }\n\n    Controller.prototype.traverse = function traverse(root, visitor) {\n        var worklist,\n            leavelist,\n            element,\n            node,\n            nodeType,\n            ret,\n            key,\n            current,\n            current2,\n            candidates,\n            candidate,\n            sentinel;\n\n        this.__initialize(root, visitor);\n\n        sentinel = {};\n\n        // reference\n        worklist = this.__worklist;\n        leavelist = this.__leavelist;\n\n        // initialize\n        worklist.push(new Element(root, null, null, null));\n        leavelist.push(new Element(null, null, null, null));\n\n        while (worklist.length) {\n            element = worklist.pop();\n\n            if (element === sentinel) {\n                element = leavelist.pop();\n\n                ret = this.__execute(visitor.leave, element);\n\n                if (this.__state === BREAK || ret === BREAK) {\n                    return;\n                }\n                continue;\n            }\n\n            if (element.node) {\n\n                ret = this.__execute(visitor.enter, element);\n\n                if (this.__state === BREAK || ret === BREAK) {\n                    return;\n                }\n\n                worklist.push(sentinel);\n                leavelist.push(element);\n\n                if (this.__state === SKIP || ret === SKIP) {\n                    continue;\n                }\n\n                node = element.node;\n                nodeType = node.type || element.wrap;\n                candidates = this.__keys[nodeType];\n                if (!candidates) {\n                    if (this.__fallback) {\n                        candidates = this.__fallback(node);\n                    } else {\n                        throw new Error('Unknown node type ' + nodeType + '.');\n                    }\n                }\n\n                current = candidates.length;\n                while ((current -= 1) >= 0) {\n                    key = candidates[current];\n                    candidate = node[key];\n                    if (!candidate) {\n                        continue;\n                    }\n\n                    if (isArray(candidate)) {\n                        current2 = candidate.length;\n                        while ((current2 -= 1) >= 0) {\n                            if (!candidate[current2]) {\n                                continue;\n                            }\n                            if (isProperty(nodeType, candidates[current])) {\n                                element = new Element(candidate[current2], [key, current2], 'Property', null);\n                            } else if (isNode(candidate[current2])) {\n                                element = new Element(candidate[current2], [key, current2], null, null);\n                            } else {\n                                continue;\n                            }\n                            worklist.push(element);\n                        }\n                    } else if (isNode(candidate)) {\n                        worklist.push(new Element(candidate, key, null, null));\n                    }\n                }\n            }\n        }\n    };\n\n    Controller.prototype.replace = function replace(root, visitor) {\n        var worklist,\n            leavelist,\n            node,\n            nodeType,\n            target,\n            element,\n            current,\n            current2,\n            candidates,\n            candidate,\n            sentinel,\n            outer,\n            key;\n\n        function removeElem(element) {\n            var i,\n                key,\n                nextElem,\n                parent;\n\n            if (element.ref.remove()) {\n                // When the reference is an element of an array.\n                key = element.ref.key;\n                parent = element.ref.parent;\n\n                // If removed from array, then decrease following items' keys.\n                i = worklist.length;\n                while (i--) {\n                    nextElem = worklist[i];\n                    if (nextElem.ref && nextElem.ref.parent === parent) {\n                        if  (nextElem.ref.key < key) {\n                            break;\n                        }\n                        --nextElem.ref.key;\n                    }\n                }\n            }\n        }\n\n        this.__initialize(root, visitor);\n\n        sentinel = {};\n\n        // reference\n        worklist = this.__worklist;\n        leavelist = this.__leavelist;\n\n        // initialize\n        outer = {\n            root: root\n        };\n        element = new Element(root, null, null, new Reference(outer, 'root'));\n        worklist.push(element);\n        leavelist.push(element);\n\n        while (worklist.length) {\n            element = worklist.pop();\n\n            if (element === sentinel) {\n                element = leavelist.pop();\n\n                target = this.__execute(visitor.leave, element);\n\n                // node may be replaced with null,\n                // so distinguish between undefined and null in this place\n                if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {\n                    // replace\n                    element.ref.replace(target);\n                }\n\n                if (this.__state === REMOVE || target === REMOVE) {\n                    removeElem(element);\n                }\n\n                if (this.__state === BREAK || target === BREAK) {\n                    return outer.root;\n                }\n                continue;\n            }\n\n            target = this.__execute(visitor.enter, element);\n\n            // node may be replaced with null,\n            // so distinguish between undefined and null in this place\n            if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {\n                // replace\n                element.ref.replace(target);\n                element.node = target;\n            }\n\n            if (this.__state === REMOVE || target === REMOVE) {\n                removeElem(element);\n                element.node = null;\n            }\n\n            if (this.__state === BREAK || target === BREAK) {\n                return outer.root;\n            }\n\n            // node may be null\n            node = element.node;\n            if (!node) {\n                continue;\n            }\n\n            worklist.push(sentinel);\n            leavelist.push(element);\n\n            if (this.__state === SKIP || target === SKIP) {\n                continue;\n            }\n\n            nodeType = node.type || element.wrap;\n            candidates = this.__keys[nodeType];\n            if (!candidates) {\n                if (this.__fallback) {\n                    candidates = this.__fallback(node);\n                } else {\n                    throw new Error('Unknown node type ' + nodeType + '.');\n                }\n            }\n\n            current = candidates.length;\n            while ((current -= 1) >= 0) {\n                key = candidates[current];\n                candidate = node[key];\n                if (!candidate) {\n                    continue;\n                }\n\n                if (isArray(candidate)) {\n                    current2 = candidate.length;\n                    while ((current2 -= 1) >= 0) {\n                        if (!candidate[current2]) {\n                            continue;\n                        }\n                        if (isProperty(nodeType, candidates[current])) {\n                            element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));\n                        } else if (isNode(candidate[current2])) {\n                            element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));\n                        } else {\n                            continue;\n                        }\n                        worklist.push(element);\n                    }\n                } else if (isNode(candidate)) {\n                    worklist.push(new Element(candidate, key, null, new Reference(node, key)));\n                }\n            }\n        }\n\n        return outer.root;\n    };\n\n    function traverse(root, visitor) {\n        var controller = new Controller();\n        return controller.traverse(root, visitor);\n    }\n\n    function replace(root, visitor) {\n        var controller = new Controller();\n        return controller.replace(root, visitor);\n    }\n\n    function extendCommentRange(comment, tokens) {\n        var target;\n\n        target = upperBound(tokens, function search(token) {\n            return token.range[0] > comment.range[0];\n        });\n\n        comment.extendedRange = [comment.range[0], comment.range[1]];\n\n        if (target !== tokens.length) {\n            comment.extendedRange[1] = tokens[target].range[0];\n        }\n\n        target -= 1;\n        if (target >= 0) {\n            comment.extendedRange[0] = tokens[target].range[1];\n        }\n\n        return comment;\n    }\n\n    function attachComments(tree, providedComments, tokens) {\n        // At first, we should calculate extended comment ranges.\n        var comments = [], comment, len, i, cursor;\n\n        if (!tree.range) {\n            throw new Error('attachComments needs range information');\n        }\n\n        // tokens array is empty, we attach comments to tree as 'leadingComments'\n        if (!tokens.length) {\n            if (providedComments.length) {\n                for (i = 0, len = providedComments.length; i < len; i += 1) {\n                    comment = deepCopy(providedComments[i]);\n                    comment.extendedRange = [0, tree.range[0]];\n                    comments.push(comment);\n                }\n                tree.leadingComments = comments;\n            }\n            return tree;\n        }\n\n        for (i = 0, len = providedComments.length; i < len; i += 1) {\n            comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));\n        }\n\n        // This is based on John Freeman's implementation.\n        cursor = 0;\n        traverse(tree, {\n            enter: function (node) {\n                var comment;\n\n                while (cursor < comments.length) {\n                    comment = comments[cursor];\n                    if (comment.extendedRange[1] > node.range[0]) {\n                        break;\n                    }\n\n                    if (comment.extendedRange[1] === node.range[0]) {\n                        if (!node.leadingComments) {\n                            node.leadingComments = [];\n                        }\n                        node.leadingComments.push(comment);\n                        comments.splice(cursor, 1);\n                    } else {\n                        cursor += 1;\n                    }\n                }\n\n                // already out of owned node\n                if (cursor === comments.length) {\n                    return VisitorOption.Break;\n                }\n\n                if (comments[cursor].extendedRange[0] > node.range[1]) {\n                    return VisitorOption.Skip;\n                }\n            }\n        });\n\n        cursor = 0;\n        traverse(tree, {\n            leave: function (node) {\n                var comment;\n\n                while (cursor < comments.length) {\n                    comment = comments[cursor];\n                    if (node.range[1] < comment.extendedRange[0]) {\n                        break;\n                    }\n\n                    if (node.range[1] === comment.extendedRange[0]) {\n                        if (!node.trailingComments) {\n                            node.trailingComments = [];\n                        }\n                        node.trailingComments.push(comment);\n                        comments.splice(cursor, 1);\n                    } else {\n                        cursor += 1;\n                    }\n                }\n\n                // already out of owned node\n                if (cursor === comments.length) {\n                    return VisitorOption.Break;\n                }\n\n                if (comments[cursor].extendedRange[0] > node.range[1]) {\n                    return VisitorOption.Skip;\n                }\n            }\n        });\n\n        return tree;\n    }\n\n    exports.version = require('./package.json').version;\n    exports.Syntax = Syntax;\n    exports.traverse = traverse;\n    exports.replace = replace;\n    exports.attachComments = attachComments;\n    exports.VisitorKeys = VisitorKeys;\n    exports.VisitorOption = VisitorOption;\n    exports.Controller = Controller;\n    exports.cloneEnvironment = function () { return clone({}); };\n\n    return exports;\n}(exports));\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n},{\"./package.json\":158}],158:[function(require,module,exports){\nmodule.exports={\n  \"_from\": \"estraverse@^4.2.0\",\n  \"_id\": \"estraverse@4.2.0\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=\",\n  \"_location\": \"/estraverse\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"range\",\n    \"registry\": true,\n    \"raw\": \"estraverse@^4.2.0\",\n    \"name\": \"estraverse\",\n    \"escapedName\": \"estraverse\",\n    \"rawSpec\": \"^4.2.0\",\n    \"saveSpec\": null,\n    \"fetchSpec\": \"^4.2.0\"\n  },\n  \"_requiredBy\": [\n    \"/\",\n    \"/@jscad/core\",\n    \"/babel-plugin-espower\",\n    \"/call-matcher\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz\",\n  \"_shasum\": \"0dee3fed31fcd469618ce7342099fc1afa0bdb13\",\n  \"_spec\": \"estraverse@^4.2.0\",\n  \"_where\": \"C:\\\\webroot\\\\octogonio\\\\apps\\\\OpenJSCAD.org\\\\packages\\\\web\",\n  \"bugs\": {\n    \"url\": \"https://github.com/estools/estraverse/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"deprecated\": false,\n  \"description\": \"ECMAScript JS AST traversal functions\",\n  \"devDependencies\": {\n    \"babel-preset-es2015\": \"^6.3.13\",\n    \"babel-register\": \"^6.3.13\",\n    \"chai\": \"^2.1.1\",\n    \"espree\": \"^1.11.0\",\n    \"gulp\": \"^3.8.10\",\n    \"gulp-bump\": \"^0.2.2\",\n    \"gulp-filter\": \"^2.0.0\",\n    \"gulp-git\": \"^1.0.1\",\n    \"gulp-tag-version\": \"^1.2.1\",\n    \"jshint\": \"^2.5.6\",\n    \"mocha\": \"^2.1.0\"\n  },\n  \"engines\": {\n    \"node\": \">=0.10.0\"\n  },\n  \"homepage\": \"https://github.com/estools/estraverse\",\n  \"license\": \"BSD-2-Clause\",\n  \"main\": \"estraverse.js\",\n  \"maintainers\": [\n    {\n      \"name\": \"Yusuke Suzuki\",\n      \"email\": \"utatane.tea@gmail.com\",\n      \"url\": \"http://github.com/Constellation\"\n    }\n  ],\n  \"name\": \"estraverse\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+ssh://git@github.com/estools/estraverse.git\"\n  },\n  \"scripts\": {\n    \"lint\": \"jshint estraverse.js\",\n    \"test\": \"npm run-script lint && npm run-script unit-test\",\n    \"unit-test\": \"mocha --compilers js:babel-register\"\n  },\n  \"version\": \"4.2.0\"\n}\n\n},{}],159:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},{}],160:[function(require,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],161:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n},{}],162:[function(require,module,exports){\n/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n},{}],163:[function(require,module,exports){\nvar toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n},{}],164:[function(require,module,exports){\n(function (global){\n/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.11';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim = /^\\s+|\\s+$/g,\n      reTrimStart = /^\\s+/,\n      reTrimEnd = /\\s+$/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n\n        return result;\n      }\n\n      if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n\n        return result;\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        if (isObject(srcValue)) {\n          stack || (stack = new Stack);\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      var index = -1;\n      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array == null ? 0 : array.length,\n          valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(array);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = value.replace(reTrim, '');\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      var sourceURL = '//# sourceURL=' +\n        ('sourceURL' in options\n          ? options.sourceURL\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrim, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimEnd, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = (lodashFunc.name + ''),\n            names = realNames[key] || (realNames[key] = []);\n\n        names.push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],165:[function(require,module,exports){\nconst { merge } = require('most')\n\n// based on http://jsfiddle.net/mattpodwysocki/pfCqq/\nfunction mouseDrags (mouseDowns$, mouseUps, mouseMoves, settings) {\n  const {pixelRatio} = settings\n  return mouseDowns$.flatMap(function (md) {\n    // calculate offsets when mouse down\n    let startX = md.pageX * pixelRatio\n    let startY = md.pageY * pixelRatio\n    // Calculate delta with mousemove until mouseup\n    let prevX = startX\n    let prevY = startY\n\n    return mouseMoves\n      .map(function (e) {\n        let curX = e.pageX * pixelRatio\n        let curY = e.pageY * pixelRatio\n\n        let delta = {\n          left: curX - startX,\n          top: curY - startY,\n          x: prevX - curX,\n          y: curY - prevY\n        }\n\n        prevX = curX\n        prevY = curY\n\n        const normalized = {x: curX, y: curY}\n        return {originalEvents: [e], delta, normalized, type: 'mouse'}\n      })\n      .takeUntil(mouseUps)\n  })\n}\n\nfunction touchDrags (touchStarts$, touchEnds$, touchMoves$, settings) {\n  const {pixelRatio} = settings\n  return touchStarts$\n    .flatMap(function (e) {\n      let startX = e.touches[0].pageX * pixelRatio\n      let startY = e.touches[0].pageY * pixelRatio\n\n      let prevX = startX\n      let prevY = startY\n\n      return touchMoves$\n        .map(function (e) {\n          let curX = e.touches[0].pageX * pixelRatio\n          let curY = e.touches[0].pageY * pixelRatio\n\n          let delta = {\n            left: curX - startX,\n            top: curY - startY,\n            x: prevX - curX,\n            y: curY - prevY\n          }\n\n          prevX = curX\n          prevY = curY\n\n          const normalized = {x: curX, y: curY}\n          return {originalEvents: [e], delta, normalized, type: 'touch'}\n        })\n        .takeUntil(touchEnds$)\n    })\n}\n\n/* drag move interactions press & move(continuously firing)\n*/\nfunction drags ({mouseDowns$, mouseUps$, mouseMoves$, touchStarts$, touchEnds$, longTaps$, touchMoves$}, settings) {\n  touchMoves$ = touchMoves$.filter(t => t.touches.length === 1)\n  const drags$ = merge(\n    mouseDrags(mouseDowns$, mouseUps$, mouseMoves$, settings),\n    touchDrags(touchStarts$, touchEnds$, touchMoves$, settings)\n  )\n  // .merge(merge(touchEnds$, mouseUps$).map(undefined))\n  // .tap(e=>console.log('dragMoves',e))\n\n  // .takeUntil(longTaps$) // .repeat() // no drag moves if there is a context action already taking place\n\n  return drags$\n}\n\nmodule.exports = {mouseDrags, touchDrags, drags}\n\n},{\"most\":207}],166:[function(require,module,exports){\nconst { fromEvent, merge } = require('most')\nconst { normalizeWheel, preventDefault } = require('./utils')\nconst { presses } = require('./presses')\nconst { taps } = require('./taps')\nconst { drags } = require('./drags')\nconst { zooms } = require('./zooms')\n\nfunction baseInteractionsFromEvents (targetEl, options) {\n  const defaults = {\n    preventScroll: true\n  }\n  options = Object.assign({}, defaults, options)\n\n  const mouseDowns$ = fromEvent('mousedown', targetEl)\n  const mouseUps$ = fromEvent('mouseup', targetEl)\n  // const mouseLeaves$ = fromEvent('mouseleave', targetEl).merge(fromEvent('mouseout', targetEl))\n  const mouseMoves$ = fromEvent('mousemove', targetEl) // .takeUntil(mouseLeaves$) // altMouseMoves(fromEvent(targetEl, 'mousemove')).takeUntil(mouseLeaves$)\n  const rightClicks$ = fromEvent('contextmenu', targetEl).tap(preventDefault) // disable the context menu / right click\n\n  const touchStarts$ = fromEvent('touchstart', targetEl)\n  const touchMoves$ = fromEvent('touchmove', targetEl)\n  const touchEnds$ = fromEvent('touchend', targetEl)\n\n  // const gestureChange$ = fromEvent('gesturechange', targetEl)\n  // const gestureStart$ = fromEvent('gesturestart', targetEl)\n  // const gestureEnd$ = fromEvent('gestureend', targetEl)\n\n  const pointerDowns$ = merge(mouseDowns$, touchStarts$) // mouse & touch interactions starts\n  const pointerUps$ = merge(mouseUps$, touchEnds$) // mouse & touch interactions ends\n  const pointerMoves$ = merge(mouseMoves$, touchMoves$.filter(t => t.touches.length === 1))\n\n  function preventScroll (targetEl) {\n    fromEvent('mousewheel', targetEl).forEach(preventDefault)\n    fromEvent('DOMMouseScroll', targetEl).forEach(preventDefault)\n    fromEvent('wheel', targetEl).forEach(preventDefault)\n    fromEvent('touchmove', targetEl).forEach(preventDefault)\n  }\n\n  if (options.preventScroll) {\n    preventScroll(targetEl)\n  }\n\n  const wheel$ = merge(\n    fromEvent('wheel', targetEl),\n    fromEvent('DOMMouseScroll', targetEl),\n    fromEvent('mousewheel', targetEl)\n  ).map(normalizeWheel)\n\n  return {\n    mouseDowns$,\n    mouseUps$,\n    mouseMoves$,\n\n    rightClicks$,\n    wheel$,\n\n    touchStarts$,\n    touchMoves$,\n    touchEnds$,\n\n    pointerDowns$,\n    pointerUps$,\n    pointerMoves$}\n}\n\nfunction pointerGestures (input, options) {\n  let baseInteractions = 'addEventListener' in input ? baseInteractionsFromEvents(input, options) : input\n\n  const defaults = {\n    multiTapDelay: 250, // delay between clicks/taps\n    longPressDelay: 250, // delay after which we have a 'hold'\n    maxStaticDeltaSqr: 100, // maximum delta (in pixels squared) above which we are not static\n    zoomMultiplier: 200, // zoomFactor for normalized interactions across browsers\n    pinchThreshold: 4000, // The minimum amount in pixels the inputs must move until it is fired.\n    pixelRatio: (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1\n  }\n  const settings = Object.assign({}, defaults, options)\n\n  const press$ = presses(baseInteractions, settings)\n  const holds$ = press$ // longTaps/holds: either HELD leftmouse/pointer or HELD right click\n    .filter(e => e.timeDelta > settings.longPressDelay)\n    .filter(e => e.moveDelta.sqrd < settings.maxStaticDeltaSqr) // when the square distance is bigger than this, it is a movement, not a tap\n    // .map(e => e.value)\n  const taps$ = taps(press$, settings)\n  const drags$ = drags(baseInteractions, settings)\n  const zooms$ = zooms(baseInteractions, settings)\n\n  // FIXME: use 'press' as higher level above tap & click\n\n  return {\n    press: press$,\n    holds: holds$,\n    taps: taps$,\n    drags: drags$,\n    zooms: zooms$\n  }\n}\n\nmodule.exports = {baseInteractionsFromEvents, pointerGestures}\n\n},{\"./drags\":165,\"./presses\":167,\"./taps\":168,\"./utils\":169,\"./zooms\":170,\"most\":207}],167:[function(require,module,exports){\nconst { just, merge, empty } = require('most')\nconst { exists, isMoving } = require('./utils')\n/* alternative \"clicks\" (ie mouseDown -> mouseUp ) implementation, with more fine\ngrained control\n*/\nfunction basePresses ({mouseDowns$, mouseUps$, mouseMoves$, touchStarts$, touchEnds$, touchMoves$}, settings) {\n  touchMoves$ = touchMoves$.filter(t => t.touches.length === 1)\n\n  const starts$ = merge(mouseDowns$, touchStarts$) // mouse & touch interactions starts\n  const ends$ = merge(mouseUps$, touchEnds$) // mouse & touch interactions ends\n  const moves$ = merge(mouseMoves$, touchMoves$)\n  // only doing any \"clicks if the time between mDOWN and mUP is below longpressDelay\"\n  // any small mouseMove is ignored (shaky hands)\n\n  return starts$.timestamp()\n    .flatMap(function (downEvent) {\n      return merge(\n        just(downEvent),\n        // moves$.take(1).flatMap(x => empty()).timestamp(), // Skip if we get a movement before a mouse up\n        ends$.take(1).timestamp()\n      )\n    })\n    .loop(function (acc, current) {\n      let result\n      if (acc.length === 1) {\n        const timeDelta = current.time - acc[0].time\n\n        const curX = 'touches' in current.value ? current.value.changedTouches[0].pageX : current.value.pageX//* pixelRatio\n        const curY = 'touches' in current.value ? current.value.changedTouches[0].pageY : current.value.pageY//* pixelRatio\n\n        const prevX = 'touches' in acc[0].value ? acc[0].value.touches[0].pageX : acc[0].value.pageX\n        const prevY = 'touches' in acc[0].value ? acc[0].value.touches[0].pageY : acc[0].value.pageY\n\n        let delta = [curX - prevX, curY - prevY] // FIXME: duplicate of mouseDrags !\n        delta = delta[0] * delta[0] + delta[1] * delta[1] // squared distance\n        let moveDelta = {\n          x: prevX - curX,\n          y: curY - prevY,\n          sqrd: delta\n        }\n\n        result = {value: current.value, originalEvent: current.value, timeDelta, moveDelta, x: curX, y: curY}\n        acc = []\n      } else {\n        acc.push(current)\n      }\n      return {seed: acc, value: result}\n    }, [])\n    .filter(exists)\n    .filter(x => x.value !== undefined)\n    .multicast()\n}\n\nfunction presses (baseInteractions, settings) {\n  const presses$ = basePresses(baseInteractions, settings)\n\n  /*\n  // exploring of more composition based system : much clearer, but needs work\n\n  // Imagine map and filter are curried\n  const mapc = curry2(map)\n  const filterc = curry2(filter)\n\n  const deltaBelowMax = x => x.moveDelta < maxStaticDeltaSqr\n  const intervalBelowLongPress = x => x.interval <= longPressDelay\n  const validButton = event => 'button' in event && event.button === 0\n  const exists = x => x !== undefined\n\n  const pluckValue = x => x.value\n  const pluckList = x => x.list\n  const first = x => x[0]\n\n  const shortTaps = compose(\n    filterc(deltaBelowMax),\n    filterc(intervalBelowLongPress),\n    mapc(pluckValue),\n    filterc(validButton)\n  )\n\n  const firstInList = compose(\n    mapc(pluckList),\n    mapc(first)\n  )\n\n  //const tapsByNumber = tapCount => compose(filterc(x => x.nb === tapCount), firstInList()) */\n\n  return presses$\n}\n\nmodule.exports = {presses}\n\n},{\"./utils\":169,\"most\":207}],168:[function(require,module,exports){\nconst { exists } = require('./utils')\n\n/**\n * tap on screen , either via gestures or clicks,\n * IF the movement was short (settable)\n * AND there was little movement only (settable)\n * @param  {Number} longPressDelay any tap shorter than this time is a short one\n * @param  {Number} maxStaticDeltaSqr  when the square distance is bigger than this, it is a movement, not a tap\n * @param  {Number} multiTapDelay  delay between taps for multi tap detection\n */\nfunction taps (presses$, settings) {\n  const {longPressDelay, maxStaticDeltaSqr, multiTapDelay} = settings\n  const taps$ = presses$\n    .filter(e => e.timeDelta <= longPressDelay) // any tap shorter than this time is a short one\n    .filter(e => e.moveDelta.sqrd < maxStaticDeltaSqr) // when the square distance is bigger than this, it is a movement, not a tap\n    .map(data => ({type: 'data', data}))\n    .merge(presses$.debounce(multiTapDelay).map(data => ({type: 'reset'})))\n    .loop(function (seed, {type, data}) {\n      let value\n      if (type === 'data') {\n        seed.push(data)\n      } else {\n        value = seed\n        seed = []\n      }\n      return {seed, value}\n    }, [])\n    .filter(exists)\n    // .buffer(function () { return taps$.debounce(multiTapDelay) })// buffer all inputs, and emit at then end of multiTapDelay\n    .map(list => ({list: list, nb: list.length}))\n    .multicast()\n\n  return taps$\n}\n\nmodule.exports = {taps}\n\n},{\"./utils\":169}],169:[function(require,module,exports){\nconst { empty, continueWith } = require('most')\n\n// for most.js\nconst repeat = (n, stream) => n === 0 ? empty()\n  : n === 1 ? stream\n    : continueWith(() => repeat(n - 1, stream), stream)\n\n// see https://github.com/cujojs/most/issues/20\n\n// this is in another package/module normally\nfunction preventDefault (event) {\n  event.preventDefault()\n  return event\n}\n\n/* determine if distance was 'enough' to consider it a ...movement */\nfunction isMoving (moveDelta, deltaSqr) {\n  return true\n/* let distSqr = (moveDelta.x * moveDelta.x + moveDelta.y * moveDelta.y)\nlet isMoving = (distSqr > deltaSqr)\n// console.log(\"moving\",isMoving)\nreturn isMoving */\n}\n\nfunction normalizeWheel (event) {\n  let delta = {x: 0, y: 0}\n  if (event.wheelDelta) { // WebKit / Opera / Explorer 9\n    delta = event.wheelDelta\n  } else if (event.detail) { // Firefox older\n    delta = -event.detail\n  } else if (event.deltaY) { // Firefox\n    delta = -event.deltaY\n  }\n  delta = delta >= 0 ? 1 : -1\n  return delta\n}\n\nfunction exists (data) {\n  return data !== null && data !== undefined\n}\n\nfunction bufferUntil (obsToBuffer, obsEnd) {\n  return obsToBuffer\n    .map(data => ({type: 'data', data}))\n    .merge(taps$.debounce(multiTapDelay).map(data => ({type: 'reset'})))\n    .loop(function (seed, {type, data}) {\n      let value\n      if (type === 'data') {\n        seed.push(data)\n      } else {\n        value = seed\n        seed = []\n      }\n      return {seed, value}\n    }, [])\n    .filter(exists)\n\n/* const baseBuffer$ =\n  obsToBuffer.scan(function (acc, current) {\n    acc.push(current)\n    return acc\n}, [])\n\nreturn baseBuffer$\n  .until(obsEnd) */\n}\n\nmodule.exports = {repeat, preventDefault, isMoving, normalizeWheel, exists}\n\n},{\"most\":207}],170:[function(require,module,exports){\nconst { merge } = require('most')\n\n// this one is not reliable enough\nfunction pinchZooms_old (gestureChange$, gestureStart$, gestureEnd$) {\n  return gestureStart$\n    .flatMap(function (gs) {\n      return gestureChange$\n        .map(x => x.scale)\n        // .loop((prev, cur) => ({seed: cur, value: prev ? cur - prev : prev}), undefined)\n        .loop(function (prev, cur) {\n          console.log('prev', prev, 'cur', cur, 'value', prev ? cur - prev : prev)\n          let value = prev ? cur - prev : prev\n\n          if (value > 0) {\n            value = Math.min(Math.max(value, 0), 2)\n          } else {\n            value = Math.min(Math.max(value, 2), 0)\n          }\n\n          return {seed: cur, value}\n        }, undefined)\n        .filter(x => x !== undefined)\n        // .map(x => x / x)\n        .takeUntil(gestureEnd$)\n    }).tap(e => console.log('pinchZooms', e))\n}\n\nfunction pinchZooms ({touchStarts$, touchMoves$, touchEnds$}, settings) {\n  const {pixelRatio, pinchThreshold} = settings\n  // generic custom gesture handling\n  // very very vaguely based on http://stackoverflow.com/questions/11183174/simplest-way-to-detect-a-pinch\n  return touchStarts$\n    .filter(t => t.touches.length === 2)\n    .flatMap(function (ts) {\n      let startX1 = ts.touches[0].pageX * pixelRatio\n      let startY1 = ts.touches[0].pageY * pixelRatio\n\n      let startX2 = ts.touches[1].pageX * pixelRatio\n      let startY2 = ts.touches[1].pageY * pixelRatio\n\n      const startDist = ((startX1 - startX2) * (startX1 - startX2)) + ((startY1 - startY2) * (startY1 - startY2))\n\n      return touchMoves$\n        .tap(e => e.preventDefault())\n        .filter(t => t.touches.length === 2)\n        .map(function (e) {\n          let curX1 = e.touches[0].pageX * pixelRatio\n          let curY1 = e.touches[0].pageY * pixelRatio\n\n          let curX2 = e.touches[1].pageX * pixelRatio\n          let curY2 = e.touches[1].pageY * pixelRatio\n\n          const currentDist = ((curX1 - curX2) * (curX1 - curX2)) + ((curY1 - curY2) * (curY1 - curY2))\n          return currentDist\n        })\n        .loop(function (prev, cur) {\n          if (prev) {\n            if (Math.abs(cur - prev) < pinchThreshold) {\n              return {seed: cur, value: undefined}\n            }\n            return {seed: cur, value: cur - prev}\n          }\n          return {seed: cur, value: cur - startDist}\n        }, undefined)\n        .filter(x => x !== undefined)\n        .map(x => x * 0.000003) // arbitrary, in order to harmonise desktop /mobile up to a point\n        /* .map(function (e) {\n          const scale = e > 0 ? Math.sqrt(e) : -Math.sqrt(Math.abs(e))\n          return scale\n        }) */\n        .takeUntil(touchEnds$)\n    })\n}\n\nfunction zooms ({touchStarts$, touchMoves$, touchEnds$, wheel$}, settings) {\n  const zooms$ = merge(\n    pinchZooms({touchStarts$, touchMoves$, touchEnds$}, settings), // for Android (no gestureXX events)\n    wheel$\n  )\n    .map(x => x * settings.zoomMultiplier)\n  return zooms$\n}\n\nmodule.exports = {pinchZooms, zooms}\n\n},{\"most\":207}],171:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = LinkedList;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\n/**\n * Doubly linked list\n * @constructor\n */\nfunction LinkedList() {\n  this.head = null;\n  this.length = 0;\n}\n\n/**\n * Add a node to the end of the list\n * @param {{prev:Object|null, next:Object|null, dispose:function}} x node to add\n */\nLinkedList.prototype.add = function (x) {\n  if (this.head !== null) {\n    this.head.prev = x;\n    x.next = this.head;\n  }\n  this.head = x;\n  ++this.length;\n};\n\n/**\n * Remove the provided node from the list\n * @param {{prev:Object|null, next:Object|null, dispose:function}} x node to remove\n */\nLinkedList.prototype.remove = function (x) {\n  // eslint-disable-line  complexity\n  --this.length;\n  if (x === this.head) {\n    this.head = this.head.next;\n  }\n  if (x.next !== null) {\n    x.next.prev = x.prev;\n    x.next = null;\n  }\n  if (x.prev !== null) {\n    x.prev.next = x.next;\n    x.prev = null;\n  }\n};\n\n/**\n * @returns {boolean} true iff there are no nodes in the list\n */\nLinkedList.prototype.isEmpty = function () {\n  return this.length === 0;\n};\n\n/**\n * Dispose all nodes\n * @returns {Promise} promise that fulfills when all nodes have been disposed,\n *  or rejects if an error occurs while disposing\n */\nLinkedList.prototype.dispose = function () {\n  if (this.isEmpty()) {\n    return Promise.resolve();\n  }\n\n  var promises = [];\n  var x = this.head;\n  this.head = null;\n  this.length = 0;\n\n  while (x !== null) {\n    promises.push(x.dispose());\n    x = x.next;\n  }\n\n  return Promise.all(promises);\n};\n},{}],172:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isPromise = isPromise;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction isPromise(p) {\n  return p !== null && typeof p === 'object' && typeof p.then === 'function';\n}\n},{}],173:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Queue;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\n// Based on https://github.com/petkaantonov/deque\n\nfunction Queue(capPow2) {\n  this._capacity = capPow2 || 32;\n  this._length = 0;\n  this._head = 0;\n}\n\nQueue.prototype.push = function (x) {\n  var len = this._length;\n  this._checkCapacity(len + 1);\n\n  var i = this._head + len & this._capacity - 1;\n  this[i] = x;\n  this._length = len + 1;\n};\n\nQueue.prototype.shift = function () {\n  var head = this._head;\n  var x = this[head];\n\n  this[head] = void 0;\n  this._head = head + 1 & this._capacity - 1;\n  this._length--;\n  return x;\n};\n\nQueue.prototype.isEmpty = function () {\n  return this._length === 0;\n};\n\nQueue.prototype.length = function () {\n  return this._length;\n};\n\nQueue.prototype._checkCapacity = function (size) {\n  if (this._capacity < size) {\n    this._ensureCapacity(this._capacity << 1);\n  }\n};\n\nQueue.prototype._ensureCapacity = function (capacity) {\n  var oldCapacity = this._capacity;\n  this._capacity = capacity;\n\n  var last = this._head + this._length;\n\n  if (last > oldCapacity) {\n    copy(this, 0, this, oldCapacity, last & oldCapacity - 1);\n  }\n};\n\nfunction copy(src, srcIndex, dst, dstIndex, len) {\n  for (var j = 0; j < len; ++j) {\n    dst[j + dstIndex] = src[j + srcIndex];\n    src[j + srcIndex] = void 0;\n  }\n}\n},{}],174:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Stream;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction Stream(source) {\n  this.source = source;\n}\n\nStream.prototype.run = function (sink, scheduler) {\n  return this.source.run(sink, scheduler);\n};\n},{}],175:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.scan = scan;\nexports.reduce = reduce;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _runSource = require('../runSource');\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _PropagateTask = require('../scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Create a stream containing successive reduce results of applying f to\n * the previous reduce result and the current stream item.\n * @param {function(result:*, x:*):*} f reducer function\n * @param {*} initial initial value\n * @param {Stream} stream stream to scan\n * @returns {Stream} new stream containing successive reduce results\n */\nfunction scan(f, initial, stream) {\n  return new _Stream2.default(new Scan(f, initial, stream.source));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction Scan(f, z, source) {\n  this.source = source;\n  this.f = f;\n  this.value = z;\n}\n\nScan.prototype.run = function (sink, scheduler) {\n  var d1 = scheduler.asap(_PropagateTask2.default.event(this.value, sink));\n  var d2 = this.source.run(new ScanSink(this.f, this.value, sink), scheduler);\n  return dispose.all([d1, d2]);\n};\n\nfunction ScanSink(f, z, sink) {\n  this.f = f;\n  this.value = z;\n  this.sink = sink;\n}\n\nScanSink.prototype.event = function (t, x) {\n  var f = this.f;\n  this.value = f(this.value, x);\n  this.sink.event(t, this.value);\n};\n\nScanSink.prototype.error = _Pipe2.default.prototype.error;\nScanSink.prototype.end = _Pipe2.default.prototype.end;\n\n/**\n* Reduce a stream to produce a single result.  Note that reducing an infinite\n* stream will return a Promise that never fulfills, but that may reject if an error\n* occurs.\n* @param {function(result:*, x:*):*} f reducer function\n* @param {*} initial initial value\n* @param {Stream} stream to reduce\n* @returns {Promise} promise for the file result of the reduce\n*/\nfunction reduce(f, initial, stream) {\n  return (0, _runSource.withDefaultScheduler)(new Reduce(f, initial, stream.source));\n}\n\nfunction Reduce(f, z, source) {\n  this.source = source;\n  this.f = f;\n  this.value = z;\n}\n\nReduce.prototype.run = function (sink, scheduler) {\n  return this.source.run(new ReduceSink(this.f, this.value, sink), scheduler);\n};\n\nfunction ReduceSink(f, z, sink) {\n  this.f = f;\n  this.value = z;\n  this.sink = sink;\n}\n\nReduceSink.prototype.event = function (t, x) {\n  var f = this.f;\n  this.value = f(this.value, x);\n  this.sink.event(t, this.value);\n};\n\nReduceSink.prototype.error = _Pipe2.default.prototype.error;\n\nReduceSink.prototype.end = function (t) {\n  this.sink.end(t, this.value);\n};\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../runSource\":213,\"../scheduler/PropagateTask\":215,\"../sink/Pipe\":222}],176:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ap = ap;\n\nvar _combine = require('./combine');\n\nvar _prelude = require('@most/prelude');\n\n/**\n * Assume fs is a stream containing functions, and apply the latest function\n * in fs to the latest value in xs.\n * fs:         --f---------g--------h------>\n * xs:         -a-------b-------c-------d-->\n * ap(fs, xs): --fa-----fb-gb---gc--hc--hd->\n * @param {Stream} fs stream of functions to apply to the latest x\n * @param {Stream} xs stream of values to which to apply all the latest f\n * @returns {Stream} stream containing all the applications of fs to xs\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction ap(fs, xs) {\n  return (0, _combine.combine)(_prelude.apply, fs, xs);\n}\n},{\"./combine\":178,\"@most/prelude\":143}],177:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cons = cons;\nexports.concat = concat;\n\nvar _core = require('../source/core');\n\nvar _continueWith = require('./continueWith');\n\n/**\n * @param {*} x value to prepend\n * @param {Stream} stream\n * @returns {Stream} new stream with x prepended\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction cons(x, stream) {\n  return concat((0, _core.of)(x), stream);\n}\n\n/**\n* @param {Stream} left\n* @param {Stream} right\n* @returns {Stream} new stream containing all events in left followed by all\n*  events in right.  This *timeshifts* right to the end of left.\n*/\nfunction concat(left, right) {\n  return (0, _continueWith.continueWith)(function () {\n    return right;\n  }, left);\n}\n},{\"../source/core\":226,\"./continueWith\":180}],178:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.combine = combine;\nexports.combineArray = combineArray;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _transform = require('./transform');\n\nvar transform = _interopRequireWildcard(_transform);\n\nvar _core = require('../source/core');\n\nvar core = _interopRequireWildcard(_core);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _IndexSink = require('../sink/IndexSink');\n\nvar _IndexSink2 = _interopRequireDefault(_IndexSink);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nvar _invoke = require('../invoke');\n\nvar _invoke2 = _interopRequireDefault(_invoke);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nvar map = base.map;\nvar tail = base.tail;\n\n/**\n * Combine latest events from all input streams\n * @param {function(...events):*} f function to combine most recent events\n * @returns {Stream} stream containing the result of applying f to the most recent\n *  event of each input stream, whenever a new event arrives on any stream.\n */\nfunction combine(f /*, ...streams */) {\n  return combineArray(f, tail(arguments));\n}\n\n/**\n* Combine latest events from all input streams\n* @param {function(...events):*} f function to combine most recent events\n* @param {[Stream]} streams most recent events\n* @returns {Stream} stream containing the result of applying f to the most recent\n*  event of each input stream, whenever a new event arrives on any stream.\n*/\nfunction combineArray(f, streams) {\n  var l = streams.length;\n  return l === 0 ? core.empty() : l === 1 ? transform.map(f, streams[0]) : new _Stream2.default(combineSources(f, streams));\n}\n\nfunction combineSources(f, streams) {\n  return new Combine(f, map(getSource, streams));\n}\n\nfunction getSource(stream) {\n  return stream.source;\n}\n\nfunction Combine(f, sources) {\n  this.f = f;\n  this.sources = sources;\n}\n\nCombine.prototype.run = function (sink, scheduler) {\n  var this$1 = this;\n\n  var l = this.sources.length;\n  var disposables = new Array(l);\n  var sinks = new Array(l);\n\n  var mergeSink = new CombineSink(disposables, sinks, sink, this.f);\n\n  for (var indexSink, i = 0; i < l; ++i) {\n    indexSink = sinks[i] = new _IndexSink2.default(i, mergeSink);\n    disposables[i] = this$1.sources[i].run(indexSink, scheduler);\n  }\n\n  return dispose.all(disposables);\n};\n\nfunction CombineSink(disposables, sinks, sink, f) {\n  var this$1 = this;\n\n  this.sink = sink;\n  this.disposables = disposables;\n  this.sinks = sinks;\n  this.f = f;\n\n  var l = sinks.length;\n  this.awaiting = l;\n  this.values = new Array(l);\n  this.hasValue = new Array(l);\n  for (var i = 0; i < l; ++i) {\n    this$1.hasValue[i] = false;\n  }\n\n  this.activeCount = sinks.length;\n}\n\nCombineSink.prototype.error = _Pipe2.default.prototype.error;\n\nCombineSink.prototype.event = function (t, indexedValue) {\n  var i = indexedValue.index;\n  var awaiting = this._updateReady(i);\n\n  this.values[i] = indexedValue.value;\n  if (awaiting === 0) {\n    this.sink.event(t, (0, _invoke2.default)(this.f, this.values));\n  }\n};\n\nCombineSink.prototype._updateReady = function (index) {\n  if (this.awaiting > 0) {\n    if (!this.hasValue[index]) {\n      this.hasValue[index] = true;\n      this.awaiting -= 1;\n    }\n  }\n  return this.awaiting;\n};\n\nCombineSink.prototype.end = function (t, indexedValue) {\n  dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink);\n  if (--this.activeCount === 0) {\n    this.sink.end(t, indexedValue.value);\n  }\n};\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../invoke\":208,\"../sink/IndexSink\":221,\"../sink/Pipe\":222,\"../source/core\":226,\"./transform\":198,\"@most/prelude\":143}],179:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.concatMap = concatMap;\n\nvar _mergeConcurrently = require('./mergeConcurrently');\n\n/**\n * Map each value in stream to a new stream, and concatenate them all\n * stream:              -a---b---cX\n * f(a):                 1-1-1-1X\n * f(b):                        -2-2-2-2X\n * f(c):                                -3-3-3-3X\n * stream.concatMap(f): -1-1-1-1-2-2-2-2-3-3-3-3X\n * @param {function(x:*):Stream} f function to map each value to a stream\n * @param {Stream} stream\n * @returns {Stream} new stream containing all events from each stream returned by f\n */\nfunction concatMap(f, stream) {\n  return (0, _mergeConcurrently.mergeMapConcurrently)(f, 1, stream);\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n},{\"./mergeConcurrently\":188}],180:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.continueWith = continueWith;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction continueWith(f, stream) {\n  return new _Stream2.default(new ContinueWith(f, stream.source));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction ContinueWith(f, source) {\n  this.f = f;\n  this.source = source;\n}\n\nContinueWith.prototype.run = function (sink, scheduler) {\n  return new ContinueWithSink(this.f, this.source, sink, scheduler);\n};\n\nfunction ContinueWithSink(f, source, sink, scheduler) {\n  this.f = f;\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.active = true;\n  this.disposable = dispose.once(source.run(this, scheduler));\n}\n\nContinueWithSink.prototype.error = _Pipe2.default.prototype.error;\n\nContinueWithSink.prototype.event = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n  this.sink.event(t, x);\n};\n\nContinueWithSink.prototype.end = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n\n  dispose.tryDispose(t, this.disposable, this.sink);\n  this._startNext(t, x, this.sink);\n};\n\nContinueWithSink.prototype._startNext = function (t, x, sink) {\n  try {\n    this.disposable = this._continue(this.f, x, sink);\n  } catch (e) {\n    sink.error(t, e);\n  }\n};\n\nContinueWithSink.prototype._continue = function (f, x, sink) {\n  return f(x).source.run(sink, this.scheduler);\n};\n\nContinueWithSink.prototype.dispose = function () {\n  this.active = false;\n  return this.disposable.dispose();\n};\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../sink/Pipe\":222}],181:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.delay = delay;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _PropagateTask = require('../scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @param {Number} delayTime milliseconds to delay each item\n * @param {Stream} stream\n * @returns {Stream} new stream containing the same items, but delayed by ms\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction delay(delayTime, stream) {\n  return delayTime <= 0 ? stream : new _Stream2.default(new Delay(delayTime, stream.source));\n}\n\nfunction Delay(dt, source) {\n  this.dt = dt;\n  this.source = source;\n}\n\nDelay.prototype.run = function (sink, scheduler) {\n  var delaySink = new DelaySink(this.dt, sink, scheduler);\n  return dispose.all([delaySink, this.source.run(delaySink, scheduler)]);\n};\n\nfunction DelaySink(dt, sink, scheduler) {\n  this.dt = dt;\n  this.sink = sink;\n  this.scheduler = scheduler;\n}\n\nDelaySink.prototype.dispose = function () {\n  var self = this;\n  this.scheduler.cancelAll(function (scheduledTask) {\n    return scheduledTask.task.sink === self.sink;\n  });\n};\n\nDelaySink.prototype.event = function (t, x) {\n  this.scheduler.delay(this.dt, _PropagateTask2.default.event(x, this.sink));\n};\n\nDelaySink.prototype.end = function (t, x) {\n  this.scheduler.delay(this.dt, _PropagateTask2.default.end(x, this.sink));\n};\n\nDelaySink.prototype.error = _Pipe2.default.prototype.error;\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../scheduler/PropagateTask\":215,\"../sink/Pipe\":222}],182:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.flatMapError = undefined;\nexports.recoverWith = recoverWith;\nexports.throwError = throwError;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _SafeSink = require('../sink/SafeSink');\n\nvar _SafeSink2 = _interopRequireDefault(_SafeSink);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _tryEvent = require('../source/tryEvent');\n\nvar tryEvent = _interopRequireWildcard(_tryEvent);\n\nvar _PropagateTask = require('../scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * If stream encounters an error, recover and continue with items from stream\n * returned by f.\n * @param {function(error:*):Stream} f function which returns a new stream\n * @param {Stream} stream\n * @returns {Stream} new stream which will recover from an error by calling f\n */\nfunction recoverWith(f, stream) {\n  return new _Stream2.default(new RecoverWith(f, stream.source));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nvar flatMapError = exports.flatMapError = recoverWith;\n\n/**\n * Create a stream containing only an error\n * @param {*} e error value, preferably an Error or Error subtype\n * @returns {Stream} new stream containing only an error\n */\nfunction throwError(e) {\n  return new _Stream2.default(new ErrorSource(e));\n}\n\nfunction ErrorSource(e) {\n  this.value = e;\n}\n\nErrorSource.prototype.run = function (sink, scheduler) {\n  return scheduler.asap(new _PropagateTask2.default(runError, this.value, sink));\n};\n\nfunction runError(t, e, sink) {\n  sink.error(t, e);\n}\n\nfunction RecoverWith(f, source) {\n  this.f = f;\n  this.source = source;\n}\n\nRecoverWith.prototype.run = function (sink, scheduler) {\n  return new RecoverWithSink(this.f, this.source, sink, scheduler);\n};\n\nfunction RecoverWithSink(f, source, sink, scheduler) {\n  this.f = f;\n  this.sink = new _SafeSink2.default(sink);\n  this.scheduler = scheduler;\n  this.disposable = source.run(this, scheduler);\n}\n\nRecoverWithSink.prototype.event = function (t, x) {\n  tryEvent.tryEvent(t, x, this.sink);\n};\n\nRecoverWithSink.prototype.end = function (t, x) {\n  tryEvent.tryEnd(t, x, this.sink);\n};\n\nRecoverWithSink.prototype.error = function (t, e) {\n  var nextSink = this.sink.disable();\n\n  dispose.tryDispose(t, this.disposable, this.sink);\n  this._startNext(t, e, nextSink);\n};\n\nRecoverWithSink.prototype._startNext = function (t, x, sink) {\n  try {\n    this.disposable = this._continue(this.f, x, sink);\n  } catch (e) {\n    sink.error(t, e);\n  }\n};\n\nRecoverWithSink.prototype._continue = function (f, x, sink) {\n  var stream = f(x);\n  return stream.source.run(sink, this.scheduler);\n};\n\nRecoverWithSink.prototype.dispose = function () {\n  return this.disposable.dispose();\n};\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../scheduler/PropagateTask\":215,\"../sink/SafeSink\":223,\"../source/tryEvent\":234}],183:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.filter = filter;\nexports.skipRepeats = skipRepeats;\nexports.skipRepeatsWith = skipRepeatsWith;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _Filter = require('../fusion/Filter');\n\nvar _Filter2 = _interopRequireDefault(_Filter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Retain only items matching a predicate\n * @param {function(x:*):boolean} p filtering predicate called for each item\n * @param {Stream} stream stream to filter\n * @returns {Stream} stream containing only items for which predicate returns truthy\n */\nfunction filter(p, stream) {\n  return new _Stream2.default(_Filter2.default.create(p, stream.source));\n}\n\n/**\n * Skip repeated events, using === to detect duplicates\n * @param {Stream} stream stream from which to omit repeated events\n * @returns {Stream} stream without repeated events\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction skipRepeats(stream) {\n  return skipRepeatsWith(same, stream);\n}\n\n/**\n * Skip repeated events using the provided equals function to detect duplicates\n * @param {function(a:*, b:*):boolean} equals optional function to compare items\n * @param {Stream} stream stream from which to omit repeated events\n * @returns {Stream} stream without repeated events\n */\nfunction skipRepeatsWith(equals, stream) {\n  return new _Stream2.default(new SkipRepeats(equals, stream.source));\n}\n\nfunction SkipRepeats(equals, source) {\n  this.equals = equals;\n  this.source = source;\n}\n\nSkipRepeats.prototype.run = function (sink, scheduler) {\n  return this.source.run(new SkipRepeatsSink(this.equals, sink), scheduler);\n};\n\nfunction SkipRepeatsSink(equals, sink) {\n  this.equals = equals;\n  this.sink = sink;\n  this.value = void 0;\n  this.init = true;\n}\n\nSkipRepeatsSink.prototype.end = _Pipe2.default.prototype.end;\nSkipRepeatsSink.prototype.error = _Pipe2.default.prototype.error;\n\nSkipRepeatsSink.prototype.event = function (t, x) {\n  if (this.init) {\n    this.init = false;\n    this.value = x;\n    this.sink.event(t, x);\n  } else if (!this.equals(this.value, x)) {\n    this.value = x;\n    this.sink.event(t, x);\n  }\n};\n\nfunction same(a, b) {\n  return a === b;\n}\n},{\"../Stream\":174,\"../fusion/Filter\":204,\"../sink/Pipe\":222}],184:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.flatMap = flatMap;\nexports.join = join;\n\nvar _mergeConcurrently = require('./mergeConcurrently');\n\n/**\n * Map each value in the stream to a new stream, and merge it into the\n * returned outer stream. Event arrival times are preserved.\n * @param {function(x:*):Stream} f chaining function, must return a Stream\n * @param {Stream} stream\n * @returns {Stream} new stream containing all events from each stream returned by f\n */\nfunction flatMap(f, stream) {\n  return (0, _mergeConcurrently.mergeMapConcurrently)(f, Infinity, stream);\n}\n\n/**\n * Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner\n * streams to the outer. Event arrival times are preserved.\n * @param {Stream<Stream<X>>} stream stream of streams\n * @returns {Stream<X>} new stream containing all events of all inner streams\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction join(stream) {\n  return (0, _mergeConcurrently.mergeConcurrently)(Infinity, stream);\n}\n},{\"./mergeConcurrently\":188}],185:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.throttle = throttle;\nexports.debounce = debounce;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _Map = require('../fusion/Map');\n\nvar _Map2 = _interopRequireDefault(_Map);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Limit the rate of events by suppressing events that occur too often\n * @param {Number} period time to suppress events\n * @param {Stream} stream\n * @returns {Stream}\n */\nfunction throttle(period, stream) {\n  return new _Stream2.default(throttleSource(period, stream.source));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction throttleSource(period, source) {\n  return source instanceof _Map2.default ? commuteMapThrottle(period, source) : source instanceof Throttle ? fuseThrottle(period, source) : new Throttle(period, source);\n}\n\nfunction commuteMapThrottle(period, source) {\n  return _Map2.default.create(source.f, throttleSource(period, source.source));\n}\n\nfunction fuseThrottle(period, source) {\n  return new Throttle(Math.max(period, source.period), source.source);\n}\n\nfunction Throttle(period, source) {\n  this.period = period;\n  this.source = source;\n}\n\nThrottle.prototype.run = function (sink, scheduler) {\n  return this.source.run(new ThrottleSink(this.period, sink), scheduler);\n};\n\nfunction ThrottleSink(period, sink) {\n  this.time = 0;\n  this.period = period;\n  this.sink = sink;\n}\n\nThrottleSink.prototype.event = function (t, x) {\n  if (t >= this.time) {\n    this.time = t + this.period;\n    this.sink.event(t, x);\n  }\n};\n\nThrottleSink.prototype.end = _Pipe2.default.prototype.end;\n\nThrottleSink.prototype.error = _Pipe2.default.prototype.error;\n\n/**\n * Wait for a burst of events to subside and emit only the last event in the burst\n * @param {Number} period events occuring more frequently than this\n *  will be suppressed\n * @param {Stream} stream stream to debounce\n * @returns {Stream} new debounced stream\n */\nfunction debounce(period, stream) {\n  return new _Stream2.default(new Debounce(period, stream.source));\n}\n\nfunction Debounce(dt, source) {\n  this.dt = dt;\n  this.source = source;\n}\n\nDebounce.prototype.run = function (sink, scheduler) {\n  return new DebounceSink(this.dt, this.source, sink, scheduler);\n};\n\nfunction DebounceSink(dt, source, sink, scheduler) {\n  this.dt = dt;\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.value = void 0;\n  this.timer = null;\n  this.disposable = source.run(this, scheduler);\n}\n\nDebounceSink.prototype.event = function (t, x) {\n  this._clearTimer();\n  this.value = x;\n  this.timer = this.scheduler.delay(this.dt, new DebounceTask(this, x));\n};\n\nDebounceSink.prototype._event = function (t, x) {\n  this._clearTimer();\n  this.sink.event(t, x);\n};\n\nDebounceSink.prototype.end = function (t, x) {\n  if (this._clearTimer()) {\n    this.sink.event(t, this.value);\n    this.value = void 0;\n  }\n  this.sink.end(t, x);\n};\n\nDebounceSink.prototype.error = function (t, x) {\n  this._clearTimer();\n  this.sink.error(t, x);\n};\n\nDebounceSink.prototype.dispose = function () {\n  this._clearTimer();\n  return this.disposable.dispose();\n};\n\nDebounceSink.prototype._clearTimer = function () {\n  if (this.timer === null) {\n    return false;\n  }\n  this.timer.dispose();\n  this.timer = null;\n  return true;\n};\n\nfunction DebounceTask(debounce, value) {\n  this.debounce = debounce;\n  this.value = value;\n}\n\nDebounceTask.prototype.run = function (t) {\n  this.debounce._event(t, this.value);\n};\n\nDebounceTask.prototype.error = function (t, e) {\n  this.debounce.error(t, e);\n};\n\nDebounceTask.prototype.dispose = function () {};\n},{\"../Stream\":174,\"../fusion/Map\":206,\"../sink/Pipe\":222}],186:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.loop = loop;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Generalized feedback loop. Call a stepper function for each event. The stepper\n * will be called with 2 params: the current seed and the an event value.  It must\n * return a new { seed, value } pair. The `seed` will be fed back into the next\n * invocation of stepper, and the `value` will be propagated as the event value.\n * @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function\n * @param {*} seed initial seed value passed to first stepper call\n * @param {Stream} stream event stream\n * @returns {Stream} new stream whose values are the `value` field of the objects\n * returned by the stepper\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction loop(stepper, seed, stream) {\n  return new _Stream2.default(new Loop(stepper, seed, stream.source));\n}\n\nfunction Loop(stepper, seed, source) {\n  this.step = stepper;\n  this.seed = seed;\n  this.source = source;\n}\n\nLoop.prototype.run = function (sink, scheduler) {\n  return this.source.run(new LoopSink(this.step, this.seed, sink), scheduler);\n};\n\nfunction LoopSink(stepper, seed, sink) {\n  this.step = stepper;\n  this.seed = seed;\n  this.sink = sink;\n}\n\nLoopSink.prototype.error = _Pipe2.default.prototype.error;\n\nLoopSink.prototype.event = function (t, x) {\n  var result = this.step(this.seed, x);\n  this.seed = result.seed;\n  this.sink.event(t, result.value);\n};\n\nLoopSink.prototype.end = function (t) {\n  this.sink.end(t, this.seed);\n};\n},{\"../Stream\":174,\"../sink/Pipe\":222}],187:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.merge = merge;\nexports.mergeArray = mergeArray;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _IndexSink = require('../sink/IndexSink');\n\nvar _IndexSink2 = _interopRequireDefault(_IndexSink);\n\nvar _core = require('../source/core');\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nvar copy = base.copy;\nvar reduce = base.reduce;\n\n/**\n * @returns {Stream} stream containing events from all streams in the argument\n * list in time order.  If two events are simultaneous they will be merged in\n * arbitrary order.\n */\nfunction merge() /* ...streams */{\n  return mergeArray(copy(arguments));\n}\n\n/**\n * @param {Array} streams array of stream to merge\n * @returns {Stream} stream containing events from all input observables\n * in time order.  If two events are simultaneous they will be merged in\n * arbitrary order.\n */\nfunction mergeArray(streams) {\n  var l = streams.length;\n  return l === 0 ? (0, _core.empty)() : l === 1 ? streams[0] : new _Stream2.default(mergeSources(streams));\n}\n\n/**\n * This implements fusion/flattening for merge.  It will\n * fuse adjacent merge operations.  For example:\n * - a.merge(b).merge(c) effectively becomes merge(a, b, c)\n * - merge(a, merge(b, c)) effectively becomes merge(a, b, c)\n * It does this by concatenating the sources arrays of\n * any nested Merge sources, in effect \"flattening\" nested\n * merge operations into a single merge.\n */\nfunction mergeSources(streams) {\n  return new Merge(reduce(appendSources, [], streams));\n}\n\nfunction appendSources(sources, stream) {\n  var source = stream.source;\n  return source instanceof Merge ? sources.concat(source.sources) : sources.concat(source);\n}\n\nfunction Merge(sources) {\n  this.sources = sources;\n}\n\nMerge.prototype.run = function (sink, scheduler) {\n  var this$1 = this;\n\n  var l = this.sources.length;\n  var disposables = new Array(l);\n  var sinks = new Array(l);\n\n  var mergeSink = new MergeSink(disposables, sinks, sink);\n\n  for (var indexSink, i = 0; i < l; ++i) {\n    indexSink = sinks[i] = new _IndexSink2.default(i, mergeSink);\n    disposables[i] = this$1.sources[i].run(indexSink, scheduler);\n  }\n\n  return dispose.all(disposables);\n};\n\nfunction MergeSink(disposables, sinks, sink) {\n  this.sink = sink;\n  this.disposables = disposables;\n  this.activeCount = sinks.length;\n}\n\nMergeSink.prototype.error = _Pipe2.default.prototype.error;\n\nMergeSink.prototype.event = function (t, indexValue) {\n  this.sink.event(t, indexValue.value);\n};\n\nMergeSink.prototype.end = function (t, indexedValue) {\n  dispose.tryDispose(t, this.disposables[indexedValue.index], this.sink);\n  if (--this.activeCount === 0) {\n    this.sink.end(t, indexedValue.value);\n  }\n};\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../sink/IndexSink\":221,\"../sink/Pipe\":222,\"../source/core\":226,\"@most/prelude\":143}],188:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.mergeConcurrently = mergeConcurrently;\nexports.mergeMapConcurrently = mergeMapConcurrently;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _LinkedList = require('../LinkedList');\n\nvar _LinkedList2 = _interopRequireDefault(_LinkedList);\n\nvar _prelude = require('@most/prelude');\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction mergeConcurrently(concurrency, stream) {\n  return mergeMapConcurrently(_prelude.id, concurrency, stream);\n}\n\nfunction mergeMapConcurrently(f, concurrency, stream) {\n  return new _Stream2.default(new MergeConcurrently(f, concurrency, stream.source));\n}\n\nfunction MergeConcurrently(f, concurrency, source) {\n  this.f = f;\n  this.concurrency = concurrency;\n  this.source = source;\n}\n\nMergeConcurrently.prototype.run = function (sink, scheduler) {\n  return new Outer(this.f, this.concurrency, this.source, sink, scheduler);\n};\n\nfunction Outer(f, concurrency, source, sink, scheduler) {\n  this.f = f;\n  this.concurrency = concurrency;\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.pending = [];\n  this.current = new _LinkedList2.default();\n  this.disposable = dispose.once(source.run(this, scheduler));\n  this.active = true;\n}\n\nOuter.prototype.event = function (t, x) {\n  this._addInner(t, x);\n};\n\nOuter.prototype._addInner = function (t, x) {\n  if (this.current.length < this.concurrency) {\n    this._startInner(t, x);\n  } else {\n    this.pending.push(x);\n  }\n};\n\nOuter.prototype._startInner = function (t, x) {\n  try {\n    this._initInner(t, x);\n  } catch (e) {\n    this.error(t, e);\n  }\n};\n\nOuter.prototype._initInner = function (t, x) {\n  var innerSink = new Inner(t, this, this.sink);\n  innerSink.disposable = mapAndRun(this.f, x, innerSink, this.scheduler);\n  this.current.add(innerSink);\n};\n\nfunction mapAndRun(f, x, sink, scheduler) {\n  return f(x).source.run(sink, scheduler);\n}\n\nOuter.prototype.end = function (t, x) {\n  this.active = false;\n  dispose.tryDispose(t, this.disposable, this.sink);\n  this._checkEnd(t, x);\n};\n\nOuter.prototype.error = function (t, e) {\n  this.active = false;\n  this.sink.error(t, e);\n};\n\nOuter.prototype.dispose = function () {\n  this.active = false;\n  this.pending.length = 0;\n  return Promise.all([this.disposable.dispose(), this.current.dispose()]);\n};\n\nOuter.prototype._endInner = function (t, x, inner) {\n  this.current.remove(inner);\n  dispose.tryDispose(t, inner, this);\n\n  if (this.pending.length === 0) {\n    this._checkEnd(t, x);\n  } else {\n    this._startInner(t, this.pending.shift());\n  }\n};\n\nOuter.prototype._checkEnd = function (t, x) {\n  if (!this.active && this.current.isEmpty()) {\n    this.sink.end(t, x);\n  }\n};\n\nfunction Inner(time, outer, sink) {\n  this.prev = this.next = null;\n  this.time = time;\n  this.outer = outer;\n  this.sink = sink;\n  this.disposable = void 0;\n}\n\nInner.prototype.event = function (t, x) {\n  this.sink.event(Math.max(t, this.time), x);\n};\n\nInner.prototype.end = function (t, x) {\n  this.outer._endInner(Math.max(t, this.time), x, this);\n};\n\nInner.prototype.error = function (t, e) {\n  this.outer.error(Math.max(t, this.time), e);\n};\n\nInner.prototype.dispose = function () {\n  return this.disposable.dispose();\n};\n},{\"../LinkedList\":171,\"../Stream\":174,\"../disposable/dispose\":202,\"@most/prelude\":143}],189:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.observe = observe;\nexports.drain = drain;\n\nvar _runSource = require('../runSource');\n\nvar _transform = require('./transform');\n\n/**\n * Observe all the event values in the stream in time order. The\n * provided function `f` will be called for each event value\n * @param {function(x:T):*} f function to call with each event value\n * @param {Stream<T>} stream stream to observe\n * @return {Promise} promise that fulfills after the stream ends without\n *  an error, or rejects if the stream ends with an error.\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction observe(f, stream) {\n  return drain((0, _transform.tap)(f, stream));\n}\n\n/**\n * \"Run\" a stream by creating demand and consuming all events\n * @param {Stream<T>} stream stream to drain\n * @return {Promise} promise that fulfills after the stream ends without\n *  an error, or rejects if the stream ends with an error.\n */\nfunction drain(stream) {\n  return (0, _runSource.withDefaultScheduler)(stream.source);\n}\n},{\"../runSource\":213,\"./transform\":198}],190:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fromPromise = fromPromise;\nexports.awaitPromises = awaitPromises;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _fatalError = require('../fatalError');\n\nvar _fatalError2 = _interopRequireDefault(_fatalError);\n\nvar _core = require('../source/core');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Create a stream containing only the promise's fulfillment\n * value at the time it fulfills.\n * @param {Promise<T>} p promise\n * @return {Stream<T>} stream containing promise's fulfillment value.\n *  If the promise rejects, the stream will error\n */\nfunction fromPromise(p) {\n  return awaitPromises((0, _core.of)(p));\n}\n\n/**\n * Turn a Stream<Promise<T>> into Stream<T> by awaiting each promise.\n * Event order is preserved.\n * @param {Stream<Promise<T>>} stream\n * @return {Stream<T>} stream of fulfillment values.  The stream will\n * error if any promise rejects.\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction awaitPromises(stream) {\n  return new _Stream2.default(new Await(stream.source));\n}\n\nfunction Await(source) {\n  this.source = source;\n}\n\nAwait.prototype.run = function (sink, scheduler) {\n  return this.source.run(new AwaitSink(sink, scheduler), scheduler);\n};\n\nfunction AwaitSink(sink, scheduler) {\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.queue = Promise.resolve();\n  var self = this;\n\n  // Pre-create closures, to avoid creating them per event\n  this._eventBound = function (x) {\n    self.sink.event(self.scheduler.now(), x);\n  };\n\n  this._endBound = function (x) {\n    self.sink.end(self.scheduler.now(), x);\n  };\n\n  this._errorBound = function (e) {\n    self.sink.error(self.scheduler.now(), e);\n  };\n}\n\nAwaitSink.prototype.event = function (t, promise) {\n  var self = this;\n  this.queue = this.queue.then(function () {\n    return self._event(promise);\n  }).catch(this._errorBound);\n};\n\nAwaitSink.prototype.end = function (t, x) {\n  var self = this;\n  this.queue = this.queue.then(function () {\n    return self._end(x);\n  }).catch(this._errorBound);\n};\n\nAwaitSink.prototype.error = function (t, e) {\n  var self = this;\n  // Don't resolve error values, propagate directly\n  this.queue = this.queue.then(function () {\n    return self._errorBound(e);\n  }).catch(_fatalError2.default);\n};\n\nAwaitSink.prototype._event = function (promise) {\n  return promise.then(this._eventBound);\n};\n\nAwaitSink.prototype._end = function (x) {\n  return Promise.resolve(x).then(this._endBound);\n};\n},{\"../Stream\":174,\"../fatalError\":203,\"../source/core\":226}],191:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sample = sample;\nexports.sampleWith = sampleWith;\nexports.sampleArray = sampleArray;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nvar _invoke = require('../invoke');\n\nvar _invoke2 = _interopRequireDefault(_invoke);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * When an event arrives on sampler, emit the result of calling f with the latest\n * values of all streams being sampled\n * @param {function(...values):*} f function to apply to each set of sampled values\n * @param {Stream} sampler streams will be sampled whenever an event arrives\n *  on sampler\n * @returns {Stream} stream of sampled and transformed values\n */\nfunction sample(f, sampler /*, ...streams */) {\n  return sampleArray(f, sampler, base.drop(2, arguments));\n}\n\n/**\n * When an event arrives on sampler, emit the latest event value from stream.\n * @param {Stream} sampler stream of events at whose arrival time\n *  stream's latest value will be propagated\n * @param {Stream} stream stream of values\n * @returns {Stream} sampled stream of values\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction sampleWith(sampler, stream) {\n  return new _Stream2.default(new Sampler(base.id, sampler.source, [stream.source]));\n}\n\nfunction sampleArray(f, sampler, streams) {\n  return new _Stream2.default(new Sampler(f, sampler.source, base.map(getSource, streams)));\n}\n\nfunction getSource(stream) {\n  return stream.source;\n}\n\nfunction Sampler(f, sampler, sources) {\n  this.f = f;\n  this.sampler = sampler;\n  this.sources = sources;\n}\n\nSampler.prototype.run = function (sink, scheduler) {\n  var this$1 = this;\n\n  var l = this.sources.length;\n  var disposables = new Array(l + 1);\n  var sinks = new Array(l);\n\n  var sampleSink = new SampleSink(this.f, sinks, sink);\n\n  for (var hold, i = 0; i < l; ++i) {\n    hold = sinks[i] = new Hold(sampleSink);\n    disposables[i] = this$1.sources[i].run(hold, scheduler);\n  }\n\n  disposables[i] = this.sampler.run(sampleSink, scheduler);\n\n  return dispose.all(disposables);\n};\n\nfunction Hold(sink) {\n  this.sink = sink;\n  this.hasValue = false;\n}\n\nHold.prototype.event = function (t, x) {\n  this.value = x;\n  this.hasValue = true;\n  this.sink._notify(this);\n};\n\nHold.prototype.end = function () {};\nHold.prototype.error = _Pipe2.default.prototype.error;\n\nfunction SampleSink(f, sinks, sink) {\n  this.f = f;\n  this.sinks = sinks;\n  this.sink = sink;\n  this.active = false;\n}\n\nSampleSink.prototype._notify = function () {\n  if (!this.active) {\n    this.active = this.sinks.every(hasValue);\n  }\n};\n\nSampleSink.prototype.event = function (t) {\n  if (this.active) {\n    this.sink.event(t, (0, _invoke2.default)(this.f, base.map(getValue, this.sinks)));\n  }\n};\n\nSampleSink.prototype.end = _Pipe2.default.prototype.end;\nSampleSink.prototype.error = _Pipe2.default.prototype.error;\n\nfunction hasValue(hold) {\n  return hold.hasValue;\n}\n\nfunction getValue(hold) {\n  return hold.value;\n}\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../invoke\":208,\"../sink/Pipe\":222,\"@most/prelude\":143}],192:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.take = take;\nexports.skip = skip;\nexports.slice = slice;\nexports.takeWhile = takeWhile;\nexports.skipWhile = skipWhile;\nexports.skipAfter = skipAfter;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _core = require('../source/core');\n\nvar core = _interopRequireWildcard(_core);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _Map = require('../fusion/Map');\n\nvar _Map2 = _interopRequireDefault(_Map);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @param {number} n\n * @param {Stream} stream\n * @returns {Stream} new stream containing only up to the first n items from stream\n */\nfunction take(n, stream) {\n  return slice(0, n, stream);\n}\n\n/**\n * @param {number} n\n * @param {Stream} stream\n * @returns {Stream} new stream with the first n items removed\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction skip(n, stream) {\n  return slice(n, Infinity, stream);\n}\n\n/**\n * Slice a stream by index. Negative start/end indexes are not supported\n * @param {number} start\n * @param {number} end\n * @param {Stream} stream\n * @returns {Stream} stream containing items where start <= index < end\n */\nfunction slice(start, end, stream) {\n  return end <= start ? core.empty() : new _Stream2.default(sliceSource(start, end, stream.source));\n}\n\nfunction sliceSource(start, end, source) {\n  return source instanceof _Map2.default ? commuteMapSlice(start, end, source) : source instanceof Slice ? fuseSlice(start, end, source) : new Slice(start, end, source);\n}\n\nfunction commuteMapSlice(start, end, source) {\n  return _Map2.default.create(source.f, sliceSource(start, end, source.source));\n}\n\nfunction fuseSlice(start, end, source) {\n  start += source.min;\n  end = Math.min(end + source.min, source.max);\n  return new Slice(start, end, source.source);\n}\n\nfunction Slice(min, max, source) {\n  this.source = source;\n  this.min = min;\n  this.max = max;\n}\n\nSlice.prototype.run = function (sink, scheduler) {\n  var disposable = dispose.settable();\n  var sliceSink = new SliceSink(this.min, this.max - this.min, sink, disposable);\n\n  disposable.setDisposable(this.source.run(sliceSink, scheduler));\n  return disposable;\n};\n\nfunction SliceSink(skip, take, sink, disposable) {\n  this.sink = sink;\n  this.skip = skip;\n  this.take = take;\n  this.disposable = disposable;\n}\n\nSliceSink.prototype.end = _Pipe2.default.prototype.end;\nSliceSink.prototype.error = _Pipe2.default.prototype.error;\n\nSliceSink.prototype.event = function (t, x) {\n  /* eslint complexity: [1, 4] */\n  if (this.skip > 0) {\n    this.skip -= 1;\n    return;\n  }\n\n  if (this.take === 0) {\n    return;\n  }\n\n  this.take -= 1;\n  this.sink.event(t, x);\n  if (this.take === 0) {\n    this.disposable.dispose();\n    this.sink.end(t, x);\n  }\n};\n\nfunction takeWhile(p, stream) {\n  return new _Stream2.default(new TakeWhile(p, stream.source));\n}\n\nfunction TakeWhile(p, source) {\n  this.p = p;\n  this.source = source;\n}\n\nTakeWhile.prototype.run = function (sink, scheduler) {\n  var disposable = dispose.settable();\n  var takeWhileSink = new TakeWhileSink(this.p, sink, disposable);\n\n  disposable.setDisposable(this.source.run(takeWhileSink, scheduler));\n  return disposable;\n};\n\nfunction TakeWhileSink(p, sink, disposable) {\n  this.p = p;\n  this.sink = sink;\n  this.active = true;\n  this.disposable = disposable;\n}\n\nTakeWhileSink.prototype.end = _Pipe2.default.prototype.end;\nTakeWhileSink.prototype.error = _Pipe2.default.prototype.error;\n\nTakeWhileSink.prototype.event = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n\n  var p = this.p;\n  this.active = p(x);\n  if (this.active) {\n    this.sink.event(t, x);\n  } else {\n    this.disposable.dispose();\n    this.sink.end(t, x);\n  }\n};\n\nfunction skipWhile(p, stream) {\n  return new _Stream2.default(new SkipWhile(p, stream.source));\n}\n\nfunction SkipWhile(p, source) {\n  this.p = p;\n  this.source = source;\n}\n\nSkipWhile.prototype.run = function (sink, scheduler) {\n  return this.source.run(new SkipWhileSink(this.p, sink), scheduler);\n};\n\nfunction SkipWhileSink(p, sink) {\n  this.p = p;\n  this.sink = sink;\n  this.skipping = true;\n}\n\nSkipWhileSink.prototype.end = _Pipe2.default.prototype.end;\nSkipWhileSink.prototype.error = _Pipe2.default.prototype.error;\n\nSkipWhileSink.prototype.event = function (t, x) {\n  if (this.skipping) {\n    var p = this.p;\n    this.skipping = p(x);\n    if (this.skipping) {\n      return;\n    }\n  }\n\n  this.sink.event(t, x);\n};\n\nfunction skipAfter(p, stream) {\n  return new _Stream2.default(new SkipAfter(p, stream.source));\n}\n\nfunction SkipAfter(p, source) {\n  this.p = p;\n  this.source = source;\n}\n\nSkipAfter.prototype.run = function run(sink, scheduler) {\n  return this.source.run(new SkipAfterSink(this.p, sink), scheduler);\n};\n\nfunction SkipAfterSink(p, sink) {\n  this.p = p;\n  this.sink = sink;\n  this.skipping = false;\n}\n\nSkipAfterSink.prototype.event = function event(t, x) {\n  if (this.skipping) {\n    return;\n  }\n\n  var p = this.p;\n  this.skipping = p(x);\n  this.sink.event(t, x);\n\n  if (this.skipping) {\n    this.sink.end(t, x);\n  }\n};\n\nSkipAfterSink.prototype.end = _Pipe2.default.prototype.end;\nSkipAfterSink.prototype.error = _Pipe2.default.prototype.error;\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../fusion/Map\":206,\"../sink/Pipe\":222,\"../source/core\":226}],193:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.switch = undefined;\nexports.switchLatest = switchLatest;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Given a stream of streams, return a new stream that adopts the behavior\n * of the most recent inner stream.\n * @param {Stream} stream of streams on which to switch\n * @returns {Stream} switching stream\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction switchLatest(stream) {\n  return new _Stream2.default(new Switch(stream.source));\n}\n\nexports.switch = switchLatest;\n\n\nfunction Switch(source) {\n  this.source = source;\n}\n\nSwitch.prototype.run = function (sink, scheduler) {\n  var switchSink = new SwitchSink(sink, scheduler);\n  return dispose.all([switchSink, this.source.run(switchSink, scheduler)]);\n};\n\nfunction SwitchSink(sink, scheduler) {\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.current = null;\n  this.ended = false;\n}\n\nSwitchSink.prototype.event = function (t, stream) {\n  this._disposeCurrent(t); // TODO: capture the result of this dispose\n  this.current = new Segment(t, Infinity, this, this.sink);\n  this.current.disposable = stream.source.run(this.current, this.scheduler);\n};\n\nSwitchSink.prototype.end = function (t, x) {\n  this.ended = true;\n  this._checkEnd(t, x);\n};\n\nSwitchSink.prototype.error = function (t, e) {\n  this.ended = true;\n  this.sink.error(t, e);\n};\n\nSwitchSink.prototype.dispose = function () {\n  return this._disposeCurrent(this.scheduler.now());\n};\n\nSwitchSink.prototype._disposeCurrent = function (t) {\n  if (this.current !== null) {\n    return this.current._dispose(t);\n  }\n};\n\nSwitchSink.prototype._disposeInner = function (t, inner) {\n  inner._dispose(t); // TODO: capture the result of this dispose\n  if (inner === this.current) {\n    this.current = null;\n  }\n};\n\nSwitchSink.prototype._checkEnd = function (t, x) {\n  if (this.ended && this.current === null) {\n    this.sink.end(t, x);\n  }\n};\n\nSwitchSink.prototype._endInner = function (t, x, inner) {\n  this._disposeInner(t, inner);\n  this._checkEnd(t, x);\n};\n\nSwitchSink.prototype._errorInner = function (t, e, inner) {\n  this._disposeInner(t, inner);\n  this.sink.error(t, e);\n};\n\nfunction Segment(min, max, outer, sink) {\n  this.min = min;\n  this.max = max;\n  this.outer = outer;\n  this.sink = sink;\n  this.disposable = dispose.empty();\n}\n\nSegment.prototype.event = function (t, x) {\n  if (t < this.max) {\n    this.sink.event(Math.max(t, this.min), x);\n  }\n};\n\nSegment.prototype.end = function (t, x) {\n  this.outer._endInner(Math.max(t, this.min), x, this);\n};\n\nSegment.prototype.error = function (t, e) {\n  this.outer._errorInner(Math.max(t, this.min), e, this);\n};\n\nSegment.prototype._dispose = function (t) {\n  this.max = t;\n  dispose.tryDispose(t, this.disposable, this.sink);\n};\n},{\"../Stream\":174,\"../disposable/dispose\":202}],194:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.thru = thru;\n/** @license MIT License (c) copyright 2010-2017 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction thru(f, stream) {\n  return f(stream);\n}\n},{}],195:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.takeUntil = takeUntil;\nexports.skipUntil = skipUntil;\nexports.during = during;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _flatMap = require('../combinator/flatMap');\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction takeUntil(signal, stream) {\n  return new _Stream2.default(new Until(signal.source, stream.source));\n}\n\nfunction skipUntil(signal, stream) {\n  return new _Stream2.default(new Since(signal.source, stream.source));\n}\n\nfunction during(timeWindow, stream) {\n  return takeUntil((0, _flatMap.join)(timeWindow), skipUntil(timeWindow, stream));\n}\n\nfunction Until(maxSignal, source) {\n  this.maxSignal = maxSignal;\n  this.source = source;\n}\n\nUntil.prototype.run = function (sink, scheduler) {\n  var min = new Bound(-Infinity, sink);\n  var max = new UpperBound(this.maxSignal, sink, scheduler);\n  var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler);\n\n  return dispose.all([min, max, disposable]);\n};\n\nfunction Since(minSignal, source) {\n  this.minSignal = minSignal;\n  this.source = source;\n}\n\nSince.prototype.run = function (sink, scheduler) {\n  var min = new LowerBound(this.minSignal, sink, scheduler);\n  var max = new Bound(Infinity, sink);\n  var disposable = this.source.run(new TimeWindowSink(min, max, sink), scheduler);\n\n  return dispose.all([min, max, disposable]);\n};\n\nfunction Bound(value, sink) {\n  this.value = value;\n  this.sink = sink;\n}\n\nBound.prototype.error = _Pipe2.default.prototype.error;\nBound.prototype.event = noop;\nBound.prototype.end = noop;\nBound.prototype.dispose = noop;\n\nfunction TimeWindowSink(min, max, sink) {\n  this.min = min;\n  this.max = max;\n  this.sink = sink;\n}\n\nTimeWindowSink.prototype.event = function (t, x) {\n  if (t >= this.min.value && t < this.max.value) {\n    this.sink.event(t, x);\n  }\n};\n\nTimeWindowSink.prototype.error = _Pipe2.default.prototype.error;\nTimeWindowSink.prototype.end = _Pipe2.default.prototype.end;\n\nfunction LowerBound(signal, sink, scheduler) {\n  this.value = Infinity;\n  this.sink = sink;\n  this.disposable = signal.run(this, scheduler);\n}\n\nLowerBound.prototype.event = function (t /*, x */) {\n  if (t < this.value) {\n    this.value = t;\n  }\n};\n\nLowerBound.prototype.end = noop;\nLowerBound.prototype.error = _Pipe2.default.prototype.error;\n\nLowerBound.prototype.dispose = function () {\n  return this.disposable.dispose();\n};\n\nfunction UpperBound(signal, sink, scheduler) {\n  this.value = Infinity;\n  this.sink = sink;\n  this.disposable = signal.run(this, scheduler);\n}\n\nUpperBound.prototype.event = function (t, x) {\n  if (t < this.value) {\n    this.value = t;\n    this.sink.end(t, x);\n  }\n};\n\nUpperBound.prototype.end = noop;\nUpperBound.prototype.error = _Pipe2.default.prototype.error;\n\nUpperBound.prototype.dispose = function () {\n  return this.disposable.dispose();\n};\n\nfunction noop() {}\n},{\"../Stream\":174,\"../combinator/flatMap\":184,\"../disposable/dispose\":202,\"../sink/Pipe\":222}],196:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.timestamp = timestamp;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction timestamp(stream) {\n  return new _Stream2.default(new Timestamp(stream.source));\n}\n\nfunction Timestamp(source) {\n  this.source = source;\n}\n\nTimestamp.prototype.run = function (sink, scheduler) {\n  return this.source.run(new TimestampSink(sink), scheduler);\n};\n\nfunction TimestampSink(sink) {\n  this.sink = sink;\n}\n\nTimestampSink.prototype.end = _Pipe2.default.prototype.end;\nTimestampSink.prototype.error = _Pipe2.default.prototype.error;\n\nTimestampSink.prototype.event = function (t, x) {\n  this.sink.event(t, { time: t, value: x });\n};\n},{\"../Stream\":174,\"../sink/Pipe\":222}],197:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.transduce = transduce;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Transform a stream by passing its events through a transducer.\n * @param  {function} transducer transducer function\n * @param  {Stream} stream stream whose events will be passed through the\n *  transducer\n * @return {Stream} stream of events transformed by the transducer\n */\nfunction transduce(transducer, stream) {\n  return new _Stream2.default(new Transduce(transducer, stream.source));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction Transduce(transducer, source) {\n  this.transducer = transducer;\n  this.source = source;\n}\n\nTransduce.prototype.run = function (sink, scheduler) {\n  var xf = this.transducer(new Transformer(sink));\n  return this.source.run(new TransduceSink(getTxHandler(xf), sink), scheduler);\n};\n\nfunction TransduceSink(adapter, sink) {\n  this.xf = adapter;\n  this.sink = sink;\n}\n\nTransduceSink.prototype.event = function (t, x) {\n  var next = this.xf.step(t, x);\n\n  return this.xf.isReduced(next) ? this.sink.end(t, this.xf.getResult(next)) : next;\n};\n\nTransduceSink.prototype.end = function (t, x) {\n  return this.xf.result(x);\n};\n\nTransduceSink.prototype.error = function (t, e) {\n  return this.sink.error(t, e);\n};\n\nfunction Transformer(sink) {\n  this.time = -Infinity;\n  this.sink = sink;\n}\n\nTransformer.prototype['@@transducer/init'] = Transformer.prototype.init = function () {};\n\nTransformer.prototype['@@transducer/step'] = Transformer.prototype.step = function (t, x) {\n  if (!isNaN(t)) {\n    this.time = Math.max(t, this.time);\n  }\n  return this.sink.event(this.time, x);\n};\n\nTransformer.prototype['@@transducer/result'] = Transformer.prototype.result = function (x) {\n  return this.sink.end(this.time, x);\n};\n\n/**\n* Given an object supporting the new or legacy transducer protocol,\n* create an adapter for it.\n* @param {object} tx transform\n* @returns {TxAdapter|LegacyTxAdapter}\n*/\nfunction getTxHandler(tx) {\n  return typeof tx['@@transducer/step'] === 'function' ? new TxAdapter(tx) : new LegacyTxAdapter(tx);\n}\n\n/**\n* Adapter for new official transducer protocol\n* @param {object} tx transform\n* @constructor\n*/\nfunction TxAdapter(tx) {\n  this.tx = tx;\n}\n\nTxAdapter.prototype.step = function (t, x) {\n  return this.tx['@@transducer/step'](t, x);\n};\nTxAdapter.prototype.result = function (x) {\n  return this.tx['@@transducer/result'](x);\n};\nTxAdapter.prototype.isReduced = function (x) {\n  return x != null && x['@@transducer/reduced'];\n};\nTxAdapter.prototype.getResult = function (x) {\n  return x['@@transducer/value'];\n};\n\n/**\n* Adapter for older transducer protocol\n* @param {object} tx transform\n* @constructor\n*/\nfunction LegacyTxAdapter(tx) {\n  this.tx = tx;\n}\n\nLegacyTxAdapter.prototype.step = function (t, x) {\n  return this.tx.step(t, x);\n};\nLegacyTxAdapter.prototype.result = function (x) {\n  return this.tx.result(x);\n};\nLegacyTxAdapter.prototype.isReduced = function (x) {\n  return x != null && x.__transducers_reduced__;\n};\nLegacyTxAdapter.prototype.getResult = function (x) {\n  return x.value;\n};\n},{\"../Stream\":174}],198:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.map = map;\nexports.constant = constant;\nexports.tap = tap;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _Map = require('../fusion/Map');\n\nvar _Map2 = _interopRequireDefault(_Map);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Transform each value in the stream by applying f to each\n * @param {function(*):*} f mapping function\n * @param {Stream} stream stream to map\n * @returns {Stream} stream containing items transformed by f\n */\nfunction map(f, stream) {\n  return new _Stream2.default(_Map2.default.create(f, stream.source));\n}\n\n/**\n* Replace each value in the stream with x\n* @param {*} x\n* @param {Stream} stream\n* @returns {Stream} stream containing items replaced with x\n*/\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction constant(x, stream) {\n  return map(function () {\n    return x;\n  }, stream);\n}\n\n/**\n* Perform a side effect for each item in the stream\n* @param {function(x:*):*} f side effect to execute for each item. The\n*  return value will be discarded.\n* @param {Stream} stream stream to tap\n* @returns {Stream} new stream containing the same items as this stream\n*/\nfunction tap(f, stream) {\n  return new _Stream2.default(new Tap(f, stream.source));\n}\n\nfunction Tap(f, source) {\n  this.source = source;\n  this.f = f;\n}\n\nTap.prototype.run = function (sink, scheduler) {\n  return this.source.run(new TapSink(this.f, sink), scheduler);\n};\n\nfunction TapSink(f, sink) {\n  this.sink = sink;\n  this.f = f;\n}\n\nTapSink.prototype.end = _Pipe2.default.prototype.end;\nTapSink.prototype.error = _Pipe2.default.prototype.error;\n\nTapSink.prototype.event = function (t, x) {\n  var f = this.f;\n  f(x);\n  this.sink.event(t, x);\n};\n},{\"../Stream\":174,\"../fusion/Map\":206,\"../sink/Pipe\":222}],199:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.zip = zip;\nexports.zipArray = zipArray;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _transform = require('./transform');\n\nvar transform = _interopRequireWildcard(_transform);\n\nvar _core = require('../source/core');\n\nvar core = _interopRequireWildcard(_core);\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _IndexSink = require('../sink/IndexSink');\n\nvar _IndexSink2 = _interopRequireDefault(_IndexSink);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nvar _invoke = require('../invoke');\n\nvar _invoke2 = _interopRequireDefault(_invoke);\n\nvar _Queue = require('../Queue');\n\nvar _Queue2 = _interopRequireDefault(_Queue);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar map = base.map; /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nvar tail = base.tail;\n\n/**\n * Combine streams pairwise (or tuple-wise) by index by applying f to values\n * at corresponding indices.  The returned stream ends when any of the input\n * streams ends.\n * @param {function} f function to combine values\n * @returns {Stream} new stream with items at corresponding indices combined\n *  using f\n */\nfunction zip(f /*, ...streams */) {\n  return zipArray(f, tail(arguments));\n}\n\n/**\n* Combine streams pairwise (or tuple-wise) by index by applying f to values\n* at corresponding indices.  The returned stream ends when any of the input\n* streams ends.\n* @param {function} f function to combine values\n* @param {[Stream]} streams streams to zip using f\n* @returns {Stream} new stream with items at corresponding indices combined\n*  using f\n*/\nfunction zipArray(f, streams) {\n  return streams.length === 0 ? core.empty() : streams.length === 1 ? transform.map(f, streams[0]) : new _Stream2.default(new Zip(f, map(getSource, streams)));\n}\n\nfunction getSource(stream) {\n  return stream.source;\n}\n\nfunction Zip(f, sources) {\n  this.f = f;\n  this.sources = sources;\n}\n\nZip.prototype.run = function (sink, scheduler) {\n  var this$1 = this;\n\n  var l = this.sources.length;\n  var disposables = new Array(l);\n  var sinks = new Array(l);\n  var buffers = new Array(l);\n\n  var zipSink = new ZipSink(this.f, buffers, sinks, sink);\n\n  for (var indexSink, i = 0; i < l; ++i) {\n    buffers[i] = new _Queue2.default();\n    indexSink = sinks[i] = new _IndexSink2.default(i, zipSink);\n    disposables[i] = this$1.sources[i].run(indexSink, scheduler);\n  }\n\n  return dispose.all(disposables);\n};\n\nfunction ZipSink(f, buffers, sinks, sink) {\n  this.f = f;\n  this.sinks = sinks;\n  this.sink = sink;\n  this.buffers = buffers;\n}\n\nZipSink.prototype.event = function (t, indexedValue) {\n  // eslint-disable-line complexity\n  var buffers = this.buffers;\n  var buffer = buffers[indexedValue.index];\n\n  buffer.push(indexedValue.value);\n\n  if (buffer.length() === 1) {\n    if (!ready(this.buffers)) {\n      return;\n    }\n\n    emitZipped(this.f, t, buffers, this.sink);\n\n    if (ended(this.buffers, this.sinks)) {\n      this.sink.end(t, void 0);\n    }\n  }\n};\n\nZipSink.prototype.end = function (t, indexedValue) {\n  var buffer = this.buffers[indexedValue.index];\n  if (buffer.isEmpty()) {\n    this.sink.end(t, indexedValue.value);\n  }\n};\n\nZipSink.prototype.error = _Pipe2.default.prototype.error;\n\nfunction emitZipped(f, t, buffers, sink) {\n  sink.event(t, (0, _invoke2.default)(f, map(head, buffers)));\n}\n\nfunction head(buffer) {\n  return buffer.shift();\n}\n\nfunction ended(buffers, sinks) {\n  for (var i = 0, l = buffers.length; i < l; ++i) {\n    if (buffers[i].isEmpty() && !sinks[i].active) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction ready(buffers) {\n  for (var i = 0, l = buffers.length; i < l; ++i) {\n    if (buffers[i].isEmpty()) {\n      return false;\n    }\n  }\n  return true;\n}\n},{\"../Queue\":173,\"../Stream\":174,\"../disposable/dispose\":202,\"../invoke\":208,\"../sink/IndexSink\":221,\"../sink/Pipe\":222,\"../source/core\":226,\"./transform\":198,\"@most/prelude\":143}],200:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Disposable;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\n/**\n * Create a new Disposable which will dispose its underlying resource.\n * @param {function} dispose function\n * @param {*?} data any data to be passed to disposer function\n * @constructor\n */\nfunction Disposable(dispose, data) {\n  this._dispose = dispose;\n  this._data = data;\n}\n\nDisposable.prototype.dispose = function () {\n  return this._dispose(this._data);\n};\n},{}],201:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = SettableDisposable;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction SettableDisposable() {\n  this.disposable = void 0;\n  this.disposed = false;\n  this._resolve = void 0;\n\n  var self = this;\n  this.result = new Promise(function (resolve) {\n    self._resolve = resolve;\n  });\n}\n\nSettableDisposable.prototype.setDisposable = function (disposable) {\n  if (this.disposable !== void 0) {\n    throw new Error('setDisposable called more than once');\n  }\n\n  this.disposable = disposable;\n\n  if (this.disposed) {\n    this._resolve(disposable.dispose());\n  }\n};\n\nSettableDisposable.prototype.dispose = function () {\n  if (this.disposed) {\n    return this.result;\n  }\n\n  this.disposed = true;\n\n  if (this.disposable !== void 0) {\n    this.result = this.disposable.dispose();\n  }\n\n  return this.result;\n};\n},{}],202:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.tryDispose = tryDispose;\nexports.create = create;\nexports.empty = empty;\nexports.all = all;\nexports.promised = promised;\nexports.settable = settable;\nexports.once = once;\n\nvar _Disposable = require('./Disposable');\n\nvar _Disposable2 = _interopRequireDefault(_Disposable);\n\nvar _SettableDisposable = require('./SettableDisposable');\n\nvar _SettableDisposable2 = _interopRequireDefault(_SettableDisposable);\n\nvar _Promise = require('../Promise');\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\nvar map = base.map;\nvar identity = base.id;\n\n/**\n * Call disposable.dispose.  If it returns a promise, catch promise\n * error and forward it through the provided sink.\n * @param {number} t time\n * @param {{dispose: function}} disposable\n * @param {{error: function}} sink\n * @return {*} result of disposable.dispose\n */\nfunction tryDispose(t, disposable, sink) {\n  var result = disposeSafely(disposable);\n  return (0, _Promise.isPromise)(result) ? result.catch(function (e) {\n    sink.error(t, e);\n  }) : result;\n}\n\n/**\n * Create a new Disposable which will dispose its underlying resource\n * at most once.\n * @param {function} dispose function\n * @param {*?} data any data to be passed to disposer function\n * @return {Disposable}\n */\nfunction create(dispose, data) {\n  return once(new _Disposable2.default(dispose, data));\n}\n\n/**\n * Create a noop disposable. Can be used to satisfy a Disposable\n * requirement when no actual resource needs to be disposed.\n * @return {Disposable|exports|module.exports}\n */\nfunction empty() {\n  return new _Disposable2.default(identity, void 0);\n}\n\n/**\n * Create a disposable that will dispose all input disposables in parallel.\n * @param {Array<Disposable>} disposables\n * @return {Disposable}\n */\nfunction all(disposables) {\n  return create(disposeAll, disposables);\n}\n\nfunction disposeAll(disposables) {\n  return Promise.all(map(disposeSafely, disposables));\n}\n\nfunction disposeSafely(disposable) {\n  try {\n    return disposable.dispose();\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\n\n/**\n * Create a disposable from a promise for another disposable\n * @param {Promise<Disposable>} disposablePromise\n * @return {Disposable}\n */\nfunction promised(disposablePromise) {\n  return create(disposePromise, disposablePromise);\n}\n\nfunction disposePromise(disposablePromise) {\n  return disposablePromise.then(disposeOne);\n}\n\nfunction disposeOne(disposable) {\n  return disposable.dispose();\n}\n\n/**\n * Create a disposable proxy that allows its underlying disposable to\n * be set later.\n * @return {SettableDisposable}\n */\nfunction settable() {\n  return new _SettableDisposable2.default();\n}\n\n/**\n * Wrap an existing disposable (which may not already have been once()d)\n * so that it will only dispose its underlying resource at most once.\n * @param {{ dispose: function() }} disposable\n * @return {Disposable} wrapped disposable\n */\nfunction once(disposable) {\n  return new _Disposable2.default(disposeMemoized, memoized(disposable));\n}\n\nfunction disposeMemoized(memoized) {\n  if (!memoized.disposed) {\n    memoized.disposed = true;\n    memoized.value = disposeSafely(memoized.disposable);\n    memoized.disposable = void 0;\n  }\n\n  return memoized.value;\n}\n\nfunction memoized(disposable) {\n  return { disposed: false, disposable: disposable, value: void 0 };\n}\n},{\"../Promise\":172,\"./Disposable\":200,\"./SettableDisposable\":201,\"@most/prelude\":143}],203:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = fatalError;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction fatalError(e) {\n  setTimeout(function () {\n    throw e;\n  }, 0);\n}\n},{}],204:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Filter;\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Filter(p, source) {\n  this.p = p;\n  this.source = source;\n}\n\n/**\n * Create a filtered source, fusing adjacent filter.filter if possible\n * @param {function(x:*):boolean} p filtering predicate\n * @param {{run:function}} source source to filter\n * @returns {Filter} filtered source\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nFilter.create = function createFilter(p, source) {\n  if (source instanceof Filter) {\n    return new Filter(and(source.p, p), source.source);\n  }\n\n  return new Filter(p, source);\n};\n\nFilter.prototype.run = function (sink, scheduler) {\n  return this.source.run(new FilterSink(this.p, sink), scheduler);\n};\n\nfunction FilterSink(p, sink) {\n  this.p = p;\n  this.sink = sink;\n}\n\nFilterSink.prototype.end = _Pipe2.default.prototype.end;\nFilterSink.prototype.error = _Pipe2.default.prototype.error;\n\nFilterSink.prototype.event = function (t, x) {\n  var p = this.p;\n  p(x) && this.sink.event(t, x);\n};\n\nfunction and(p, q) {\n  return function (x) {\n    return p(x) && q(x);\n  };\n}\n},{\"../sink/Pipe\":222}],205:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = FilterMap;\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction FilterMap(p, f, source) {\n  this.p = p;\n  this.f = f;\n  this.source = source;\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nFilterMap.prototype.run = function (sink, scheduler) {\n  return this.source.run(new FilterMapSink(this.p, this.f, sink), scheduler);\n};\n\nfunction FilterMapSink(p, f, sink) {\n  this.p = p;\n  this.f = f;\n  this.sink = sink;\n}\n\nFilterMapSink.prototype.event = function (t, x) {\n  var f = this.f;\n  var p = this.p;\n  p(x) && this.sink.event(t, f(x));\n};\n\nFilterMapSink.prototype.end = _Pipe2.default.prototype.end;\nFilterMapSink.prototype.error = _Pipe2.default.prototype.error;\n},{\"../sink/Pipe\":222}],206:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Map;\n\nvar _Pipe = require('../sink/Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nvar _Filter = require('./Filter');\n\nvar _Filter2 = _interopRequireDefault(_Filter);\n\nvar _FilterMap = require('./FilterMap');\n\nvar _FilterMap2 = _interopRequireDefault(_FilterMap);\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction Map(f, source) {\n  this.f = f;\n  this.source = source;\n}\n\n/**\n * Create a mapped source, fusing adjacent map.map, filter.map,\n * and filter.map.map if possible\n * @param {function(*):*} f mapping function\n * @param {{run:function}} source source to map\n * @returns {Map|FilterMap} mapped source, possibly fused\n */\nMap.create = function createMap(f, source) {\n  if (source instanceof Map) {\n    return new Map(base.compose(f, source.f), source.source);\n  }\n\n  if (source instanceof _Filter2.default) {\n    return new _FilterMap2.default(source.p, f, source.source);\n  }\n\n  return new Map(f, source);\n};\n\nMap.prototype.run = function (sink, scheduler) {\n  // eslint-disable-line no-extend-native\n  return this.source.run(new MapSink(this.f, sink), scheduler);\n};\n\nfunction MapSink(f, sink) {\n  this.f = f;\n  this.sink = sink;\n}\n\nMapSink.prototype.end = _Pipe2.default.prototype.end;\nMapSink.prototype.error = _Pipe2.default.prototype.error;\n\nMapSink.prototype.event = function (t, x) {\n  var f = this.f;\n  this.sink.event(t, f(x));\n};\n},{\"../sink/Pipe\":222,\"./Filter\":204,\"./FilterMap\":205,\"@most/prelude\":143}],207:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PropagateTask = exports.defaultScheduler = exports.multicast = exports.throwError = exports.flatMapError = exports.recoverWith = exports.await = exports.awaitPromises = exports.fromPromise = exports.debounce = exports.throttle = exports.timestamp = exports.delay = exports.during = exports.since = exports.skipUntil = exports.until = exports.takeUntil = exports.skipAfter = exports.skipWhile = exports.takeWhile = exports.slice = exports.skip = exports.take = exports.distinctBy = exports.skipRepeatsWith = exports.distinct = exports.skipRepeats = exports.filter = exports.switch = exports.switchLatest = exports.zipArray = exports.zip = exports.sampleWith = exports.sampleArray = exports.sample = exports.combineArray = exports.combine = exports.mergeArray = exports.merge = exports.mergeConcurrently = exports.concatMap = exports.flatMapEnd = exports.continueWith = exports.join = exports.chain = exports.flatMap = exports.transduce = exports.ap = exports.tap = exports.constant = exports.map = exports.startWith = exports.concat = exports.generate = exports.iterate = exports.unfold = exports.reduce = exports.scan = exports.loop = exports.drain = exports.forEach = exports.observe = exports.fromEvent = exports.periodic = exports.from = exports.never = exports.empty = exports.just = exports.of = exports.Stream = undefined;\n\nvar _fromEvent = require('./source/fromEvent');\n\nObject.defineProperty(exports, 'fromEvent', {\n  enumerable: true,\n  get: function () {\n    return _fromEvent.fromEvent;\n  }\n});\n\nvar _unfold = require('./source/unfold');\n\nObject.defineProperty(exports, 'unfold', {\n  enumerable: true,\n  get: function () {\n    return _unfold.unfold;\n  }\n});\n\nvar _iterate = require('./source/iterate');\n\nObject.defineProperty(exports, 'iterate', {\n  enumerable: true,\n  get: function () {\n    return _iterate.iterate;\n  }\n});\n\nvar _generate = require('./source/generate');\n\nObject.defineProperty(exports, 'generate', {\n  enumerable: true,\n  get: function () {\n    return _generate.generate;\n  }\n});\n\nvar _Stream = require('./Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nvar _core = require('./source/core');\n\nvar _from = require('./source/from');\n\nvar _periodic = require('./source/periodic');\n\nvar _symbolObservable = require('symbol-observable');\n\nvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\nvar _subscribe = require('./observable/subscribe');\n\nvar _thru = require('./combinator/thru');\n\nvar _observe = require('./combinator/observe');\n\nvar _loop = require('./combinator/loop');\n\nvar _accumulate = require('./combinator/accumulate');\n\nvar _build = require('./combinator/build');\n\nvar _transform = require('./combinator/transform');\n\nvar _applicative = require('./combinator/applicative');\n\nvar _transduce = require('./combinator/transduce');\n\nvar _flatMap = require('./combinator/flatMap');\n\nvar _continueWith = require('./combinator/continueWith');\n\nvar _concatMap = require('./combinator/concatMap');\n\nvar _mergeConcurrently = require('./combinator/mergeConcurrently');\n\nvar _merge = require('./combinator/merge');\n\nvar _combine = require('./combinator/combine');\n\nvar _sample = require('./combinator/sample');\n\nvar _zip = require('./combinator/zip');\n\nvar _switch = require('./combinator/switch');\n\nvar _filter = require('./combinator/filter');\n\nvar _slice = require('./combinator/slice');\n\nvar _timeslice = require('./combinator/timeslice');\n\nvar _delay = require('./combinator/delay');\n\nvar _timestamp = require('./combinator/timestamp');\n\nvar _limit = require('./combinator/limit');\n\nvar _promises = require('./combinator/promises');\n\nvar _errors = require('./combinator/errors');\n\nvar _multicast = require('@most/multicast');\n\nvar _multicast2 = _interopRequireDefault(_multicast);\n\nvar _defaultScheduler = require('./scheduler/defaultScheduler');\n\nvar _defaultScheduler2 = _interopRequireDefault(_defaultScheduler);\n\nvar _PropagateTask = require('./scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Core stream type\n * @type {Stream}\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\n/* eslint import/first: 0 */\n\nexports.Stream = _Stream2.default;\n\n// Add of and empty to constructor for fantasy-land compat\n\n_Stream2.default.of = _core.of;\n_Stream2.default.empty = _core.empty;\n// Add from to constructor for ES Observable compat\n_Stream2.default.from = _from.from;\nexports.of = _core.of;\nexports.just = _core.of;\nexports.empty = _core.empty;\nexports.never = _core.never;\nexports.from = _from.from;\nexports.periodic = _periodic.periodic;\n\n// -----------------------------------------------------------------------\n// Draft ES Observable proposal interop\n// https://github.com/zenparsing/es-observable\n\n_Stream2.default.prototype.subscribe = function (subscriber) {\n  return (0, _subscribe.subscribe)(subscriber, this);\n};\n\n_Stream2.default.prototype[_symbolObservable2.default] = function () {\n  return this;\n};\n\n// -----------------------------------------------------------------------\n// Fluent adapter\n\n/**\n * Adapt a functional stream transform to fluent style.\n * It applies f to the this stream object\n * @param  {function(s: Stream): Stream} f function that\n * receives the stream itself and must return a new stream\n * @return {Stream}\n */\n_Stream2.default.prototype.thru = function (f) {\n  return (0, _thru.thru)(f, this);\n};\n\n// -----------------------------------------------------------------------\n// Adapting other sources\n\n/**\n * Create a stream of events from the supplied EventTarget or EventEmitter\n * @param {String} event event name\n * @param {EventTarget|EventEmitter} source EventTarget or EventEmitter. The source\n *  must support either addEventListener/removeEventListener (w3c EventTarget:\n *  http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget),\n *  or addListener/removeListener (node EventEmitter: http://nodejs.org/api/events.html)\n * @returns {Stream} stream of events of the specified type from the source\n */\n\n\n// -----------------------------------------------------------------------\n// Observing\n\nexports.observe = _observe.observe;\nexports.forEach = _observe.observe;\nexports.drain = _observe.drain;\n\n/**\n * Process all the events in the stream\n * @returns {Promise} promise that fulfills when the stream ends, or rejects\n *  if the stream fails with an unhandled error.\n */\n\n_Stream2.default.prototype.observe = _Stream2.default.prototype.forEach = function (f) {\n  return (0, _observe.observe)(f, this);\n};\n\n/**\n * Consume all events in the stream, without providing a function to process each.\n * This causes a stream to become active and begin emitting events, and is useful\n * in cases where all processing has been setup upstream via other combinators, and\n * there is no need to process the terminal events.\n * @returns {Promise} promise that fulfills when the stream ends, or rejects\n *  if the stream fails with an unhandled error.\n */\n_Stream2.default.prototype.drain = function () {\n  return (0, _observe.drain)(this);\n};\n\n// -------------------------------------------------------\n\nexports.loop = _loop.loop;\n\n/**\n * Generalized feedback loop. Call a stepper function for each event. The stepper\n * will be called with 2 params: the current seed and the an event value.  It must\n * return a new { seed, value } pair. The `seed` will be fed back into the next\n * invocation of stepper, and the `value` will be propagated as the event value.\n * @param {function(seed:*, value:*):{seed:*, value:*}} stepper loop step function\n * @param {*} seed initial seed value passed to first stepper call\n * @returns {Stream} new stream whose values are the `value` field of the objects\n * returned by the stepper\n */\n\n_Stream2.default.prototype.loop = function (stepper, seed) {\n  return (0, _loop.loop)(stepper, seed, this);\n};\n\n// -------------------------------------------------------\n\nexports.scan = _accumulate.scan;\nexports.reduce = _accumulate.reduce;\n\n/**\n * Create a stream containing successive reduce results of applying f to\n * the previous reduce result and the current stream item.\n * @param {function(result:*, x:*):*} f reducer function\n * @param {*} initial initial value\n * @returns {Stream} new stream containing successive reduce results\n */\n\n_Stream2.default.prototype.scan = function (f, initial) {\n  return (0, _accumulate.scan)(f, initial, this);\n};\n\n/**\n * Reduce the stream to produce a single result.  Note that reducing an infinite\n * stream will return a Promise that never fulfills, but that may reject if an error\n * occurs.\n * @param {function(result:*, x:*):*} f reducer function\n * @param {*} initial optional initial value\n * @returns {Promise} promise for the file result of the reduce\n */\n_Stream2.default.prototype.reduce = function (f, initial) {\n  return (0, _accumulate.reduce)(f, initial, this);\n};\n\n// -----------------------------------------------------------------------\n// Building and extending\n\nexports.concat = _build.concat;\nexports.startWith = _build.cons;\n\n/**\n * @param {Stream} tail\n * @returns {Stream} new stream containing all items in this followed by\n *  all items in tail\n */\n\n_Stream2.default.prototype.concat = function (tail) {\n  return (0, _build.concat)(this, tail);\n};\n\n/**\n * @param {*} x value to prepend\n * @returns {Stream} a new stream with x prepended\n */\n_Stream2.default.prototype.startWith = function (x) {\n  return (0, _build.cons)(x, this);\n};\n\n// -----------------------------------------------------------------------\n// Transforming\n\nexports.map = _transform.map;\nexports.constant = _transform.constant;\nexports.tap = _transform.tap;\nexports.ap = _applicative.ap;\n\n/**\n * Transform each value in the stream by applying f to each\n * @param {function(*):*} f mapping function\n * @returns {Stream} stream containing items transformed by f\n */\n\n_Stream2.default.prototype.map = function (f) {\n  return (0, _transform.map)(f, this);\n};\n\n/**\n * Assume this stream contains functions, and apply each function to each item\n * in the provided stream.  This generates, in effect, a cross product.\n * @param {Stream} xs stream of items to which\n * @returns {Stream} stream containing the cross product of items\n */\n_Stream2.default.prototype.ap = function (xs) {\n  return (0, _applicative.ap)(this, xs);\n};\n\n/**\n * Replace each value in the stream with x\n * @param {*} x\n * @returns {Stream} stream containing items replaced with x\n */\n_Stream2.default.prototype.constant = function (x) {\n  return (0, _transform.constant)(x, this);\n};\n\n/**\n * Perform a side effect for each item in the stream\n * @param {function(x:*):*} f side effect to execute for each item. The\n *  return value will be discarded.\n * @returns {Stream} new stream containing the same items as this stream\n */\n_Stream2.default.prototype.tap = function (f) {\n  return (0, _transform.tap)(f, this);\n};\n\n// -----------------------------------------------------------------------\n// Transducer support\n\nexports.transduce = _transduce.transduce;\n\n/**\n * Transform this stream by passing its events through a transducer.\n * @param  {function} transducer transducer function\n * @return {Stream} stream of events transformed by the transducer\n */\n\n_Stream2.default.prototype.transduce = function (transducer) {\n  return (0, _transduce.transduce)(transducer, this);\n};\n\n// -----------------------------------------------------------------------\n// FlatMapping\n\n// @deprecated flatMap, use chain instead\nexports.flatMap = _flatMap.flatMap;\nexports.chain = _flatMap.flatMap;\nexports.join = _flatMap.join;\n\n/**\n * Map each value in the stream to a new stream, and merge it into the\n * returned outer stream. Event arrival times are preserved.\n * @param {function(x:*):Stream} f chaining function, must return a Stream\n * @returns {Stream} new stream containing all events from each stream returned by f\n */\n\n_Stream2.default.prototype.chain = function (f) {\n  return (0, _flatMap.flatMap)(f, this);\n};\n\n// @deprecated use chain instead\n_Stream2.default.prototype.flatMap = _Stream2.default.prototype.chain;\n\n/**\n* Monadic join. Flatten a Stream<Stream<X>> to Stream<X> by merging inner\n* streams to the outer. Event arrival times are preserved.\n* @returns {Stream<X>} new stream containing all events of all inner streams\n*/\n_Stream2.default.prototype.join = function () {\n  return (0, _flatMap.join)(this);\n};\n\n// @deprecated flatMapEnd, use continueWith instead\nexports.continueWith = _continueWith.continueWith;\nexports.flatMapEnd = _continueWith.continueWith;\n\n/**\n * Map the end event to a new stream, and begin emitting its values.\n * @param {function(x:*):Stream} f function that receives the end event value,\n * and *must* return a new Stream to continue with.\n * @returns {Stream} new stream that emits all events from the original stream,\n * followed by all events from the stream returned by f.\n */\n\n_Stream2.default.prototype.continueWith = function (f) {\n  return (0, _continueWith.continueWith)(f, this);\n};\n\n// @deprecated use continueWith instead\n_Stream2.default.prototype.flatMapEnd = _Stream2.default.prototype.continueWith;\n\nexports.concatMap = _concatMap.concatMap;\n\n\n_Stream2.default.prototype.concatMap = function (f) {\n  return (0, _concatMap.concatMap)(f, this);\n};\n\n// -----------------------------------------------------------------------\n// Concurrent merging\n\nexports.mergeConcurrently = _mergeConcurrently.mergeConcurrently;\n\n/**\n * Flatten a Stream<Stream<X>> to Stream<X> by merging inner\n * streams to the outer, limiting the number of inner streams that may\n * be active concurrently.\n * @param {number} concurrency at most this many inner streams will be\n *  allowed to be active concurrently.\n * @return {Stream<X>} new stream containing all events of all inner\n *  streams, with limited concurrency.\n */\n\n_Stream2.default.prototype.mergeConcurrently = function (concurrency) {\n  return (0, _mergeConcurrently.mergeConcurrently)(concurrency, this);\n};\n\n// -----------------------------------------------------------------------\n// Merging\n\nexports.merge = _merge.merge;\nexports.mergeArray = _merge.mergeArray;\n\n/**\n * Merge this stream and all the provided streams\n * @returns {Stream} stream containing items from this stream and s in time\n * order.  If two events are simultaneous they will be merged in\n * arbitrary order.\n */\n\n_Stream2.default.prototype.merge = function () /* ...streams */{\n  return (0, _merge.mergeArray)(base.cons(this, arguments));\n};\n\n// -----------------------------------------------------------------------\n// Combining\n\nexports.combine = _combine.combine;\nexports.combineArray = _combine.combineArray;\n\n/**\n * Combine latest events from all input streams\n * @param {function(...events):*} f function to combine most recent events\n * @returns {Stream} stream containing the result of applying f to the most recent\n *  event of each input stream, whenever a new event arrives on any stream.\n */\n\n_Stream2.default.prototype.combine = function (f /*, ...streams */) {\n  return (0, _combine.combineArray)(f, base.replace(this, 0, arguments));\n};\n\n// -----------------------------------------------------------------------\n// Sampling\n\nexports.sample = _sample.sample;\nexports.sampleArray = _sample.sampleArray;\nexports.sampleWith = _sample.sampleWith;\n\n/**\n * When an event arrives on sampler, emit the latest event value from stream.\n * @param {Stream} sampler stream of events at whose arrival time\n *  signal's latest value will be propagated\n * @returns {Stream} sampled stream of values\n */\n\n_Stream2.default.prototype.sampleWith = function (sampler) {\n  return (0, _sample.sampleWith)(sampler, this);\n};\n\n/**\n * When an event arrives on this stream, emit the result of calling f with the latest\n * values of all streams being sampled\n * @param {function(...values):*} f function to apply to each set of sampled values\n * @returns {Stream} stream of sampled and transformed values\n */\n_Stream2.default.prototype.sample = function (f /* ...streams */) {\n  return (0, _sample.sampleArray)(f, this, base.tail(arguments));\n};\n\n// -----------------------------------------------------------------------\n// Zipping\n\nexports.zip = _zip.zip;\nexports.zipArray = _zip.zipArray;\n\n/**\n * Pair-wise combine items with those in s. Given 2 streams:\n * [1,2,3] zipWith f [4,5,6] -> [f(1,4),f(2,5),f(3,6)]\n * Note: zip causes fast streams to buffer and wait for slow streams.\n * @param {function(a:Stream, b:Stream, ...):*} f function to combine items\n * @returns {Stream} new stream containing pairs\n */\n\n_Stream2.default.prototype.zip = function (f /*, ...streams */) {\n  return (0, _zip.zipArray)(f, base.replace(this, 0, arguments));\n};\n\n// -----------------------------------------------------------------------\n// Switching\n\n// @deprecated switch, use switchLatest instead\nexports.switchLatest = _switch.switchLatest;\nexports.switch = _switch.switchLatest;\n\n/**\n * Given a stream of streams, return a new stream that adopts the behavior\n * of the most recent inner stream.\n * @returns {Stream} switching stream\n */\n\n_Stream2.default.prototype.switchLatest = function () {\n  return (0, _switch.switchLatest)(this);\n};\n\n// @deprecated use switchLatest instead\n_Stream2.default.prototype.switch = _Stream2.default.prototype.switchLatest;\n\n// -----------------------------------------------------------------------\n// Filtering\n\n// @deprecated distinct, use skipRepeats instead\n// @deprecated distinctBy, use skipRepeatsWith instead\nexports.filter = _filter.filter;\nexports.skipRepeats = _filter.skipRepeats;\nexports.distinct = _filter.skipRepeats;\nexports.skipRepeatsWith = _filter.skipRepeatsWith;\nexports.distinctBy = _filter.skipRepeatsWith;\n\n/**\n * Retain only items matching a predicate\n * stream:                           -12345678-\n * filter(x => x % 2 === 0, stream): --2-4-6-8-\n * @param {function(x:*):boolean} p filtering predicate called for each item\n * @returns {Stream} stream containing only items for which predicate returns truthy\n */\n\n_Stream2.default.prototype.filter = function (p) {\n  return (0, _filter.filter)(p, this);\n};\n\n/**\n * Skip repeated events, using === to compare items\n * stream:           -abbcd-\n * distinct(stream): -ab-cd-\n * @returns {Stream} stream with no repeated events\n */\n_Stream2.default.prototype.skipRepeats = function () {\n  return (0, _filter.skipRepeats)(this);\n};\n\n/**\n * Skip repeated events, using supplied equals function to compare items\n * @param {function(a:*, b:*):boolean} equals function to compare items\n * @returns {Stream} stream with no repeated events\n */\n_Stream2.default.prototype.skipRepeatsWith = function (equals) {\n  return (0, _filter.skipRepeatsWith)(equals, this);\n};\n\n// -----------------------------------------------------------------------\n// Slicing\n\nexports.take = _slice.take;\nexports.skip = _slice.skip;\nexports.slice = _slice.slice;\nexports.takeWhile = _slice.takeWhile;\nexports.skipWhile = _slice.skipWhile;\nexports.skipAfter = _slice.skipAfter;\n\n/**\n * stream:          -abcd-\n * take(2, stream): -ab|\n * @param {Number} n take up to this many events\n * @returns {Stream} stream containing at most the first n items from this stream\n */\n\n_Stream2.default.prototype.take = function (n) {\n  return (0, _slice.take)(n, this);\n};\n\n/**\n * stream:          -abcd->\n * skip(2, stream): ---cd->\n * @param {Number} n skip this many events\n * @returns {Stream} stream not containing the first n events\n */\n_Stream2.default.prototype.skip = function (n) {\n  return (0, _slice.skip)(n, this);\n};\n\n/**\n * Slice a stream by event index. Equivalent to, but more efficient than\n * stream.take(end).skip(start);\n * NOTE: Negative start and end are not supported\n * @param {Number} start skip all events before the start index\n * @param {Number} end allow all events from the start index to the end index\n * @returns {Stream} stream containing items where start <= index < end\n */\n_Stream2.default.prototype.slice = function (start, end) {\n  return (0, _slice.slice)(start, end, this);\n};\n\n/**\n * stream:                        -123451234->\n * takeWhile(x => x < 5, stream): -1234|\n * @param {function(x:*):boolean} p predicate\n * @returns {Stream} stream containing items up to, but not including, the\n * first item for which p returns falsy.\n */\n_Stream2.default.prototype.takeWhile = function (p) {\n  return (0, _slice.takeWhile)(p, this);\n};\n\n/**\n * stream:                        -123451234->\n * skipWhile(x => x < 5, stream): -----51234->\n * @param {function(x:*):boolean} p predicate\n * @returns {Stream} stream containing items following *and including* the\n * first item for which p returns falsy.\n */\n_Stream2.default.prototype.skipWhile = function (p) {\n  return (0, _slice.skipWhile)(p, this);\n};\n\n/**\n * stream:                         -123456789->\n * skipAfter(x => x === 5, stream):-12345|\n * @param {function(x:*):boolean} p predicate\n * @returns {Stream} stream containing items up to, *and including*, the\n * first item for which p returns truthy.\n */\n_Stream2.default.prototype.skipAfter = function (p) {\n  return (0, _slice.skipAfter)(p, this);\n};\n\n// -----------------------------------------------------------------------\n// Time slicing\n\n// @deprecated takeUntil, use until instead\n// @deprecated skipUntil, use since instead\nexports.takeUntil = _timeslice.takeUntil;\nexports.until = _timeslice.takeUntil;\nexports.skipUntil = _timeslice.skipUntil;\nexports.since = _timeslice.skipUntil;\nexports.during = _timeslice.during;\n\n/**\n * stream:                    -a-b-c-d-e-f-g->\n * signal:                    -------x\n * takeUntil(signal, stream): -a-b-c-|\n * @param {Stream} signal retain only events in stream before the first\n * event in signal\n * @returns {Stream} new stream containing only events that occur before\n * the first event in signal.\n */\n\n_Stream2.default.prototype.until = function (signal) {\n  return (0, _timeslice.takeUntil)(signal, this);\n};\n\n// @deprecated use until instead\n_Stream2.default.prototype.takeUntil = _Stream2.default.prototype.until;\n\n/**\n* stream:                    -a-b-c-d-e-f-g->\n* signal:                    -------x\n* takeUntil(signal, stream): -------d-e-f-g->\n* @param {Stream} signal retain only events in stream at or after the first\n* event in signal\n* @returns {Stream} new stream containing only events that occur after\n* the first event in signal.\n*/\n_Stream2.default.prototype.since = function (signal) {\n  return (0, _timeslice.skipUntil)(signal, this);\n};\n\n// @deprecated use since instead\n_Stream2.default.prototype.skipUntil = _Stream2.default.prototype.since;\n\n/**\n* stream:                    -a-b-c-d-e-f-g->\n* timeWindow:                -----s\n* s:                               -----t\n* stream.during(timeWindow): -----c-d-e-|\n* @param {Stream<Stream>} timeWindow a stream whose first event (s) represents\n*  the window start time.  That event (s) is itself a stream whose first event (t)\n*  represents the window end time\n* @returns {Stream} new stream containing only events within the provided timespan\n*/\n_Stream2.default.prototype.during = function (timeWindow) {\n  return (0, _timeslice.during)(timeWindow, this);\n};\n\n// -----------------------------------------------------------------------\n// Delaying\n\nexports.delay = _delay.delay;\n\n/**\n * @param {Number} delayTime milliseconds to delay each item\n * @returns {Stream} new stream containing the same items, but delayed by ms\n */\n\n_Stream2.default.prototype.delay = function (delayTime) {\n  return (0, _delay.delay)(delayTime, this);\n};\n\n// -----------------------------------------------------------------------\n// Getting event timestamp\n\nexports.timestamp = _timestamp.timestamp;\n\n/**\n * Expose event timestamps into the stream. Turns a Stream<X> into\n * Stream<{time:t, value:X}>\n * @returns {Stream<{time:number, value:*}>}\n */\n\n_Stream2.default.prototype.timestamp = function () {\n  return (0, _timestamp.timestamp)(this);\n};\n\n// -----------------------------------------------------------------------\n// Rate limiting\n\nexports.throttle = _limit.throttle;\nexports.debounce = _limit.debounce;\n\n/**\n * Limit the rate of events\n * stream:              abcd----abcd----\n * throttle(2, stream): a-c-----a-c-----\n * @param {Number} period time to suppress events\n * @returns {Stream} new stream that skips events for throttle period\n */\n\n_Stream2.default.prototype.throttle = function (period) {\n  return (0, _limit.throttle)(period, this);\n};\n\n/**\n * Wait for a burst of events to subside and emit only the last event in the burst\n * stream:              abcd----abcd----\n * debounce(2, stream): -----d-------d--\n * @param {Number} period events occuring more frequently than this\n *  on the provided scheduler will be suppressed\n * @returns {Stream} new debounced stream\n */\n_Stream2.default.prototype.debounce = function (period) {\n  return (0, _limit.debounce)(period, this);\n};\n\n// -----------------------------------------------------------------------\n// Awaiting Promises\n\n// @deprecated await, use awaitPromises instead\nexports.fromPromise = _promises.fromPromise;\nexports.awaitPromises = _promises.awaitPromises;\nexports.await = _promises.awaitPromises;\n\n/**\n * Await promises, turning a Stream<Promise<X>> into Stream<X>.  Preserves\n * event order, but timeshifts events based on promise resolution time.\n * @returns {Stream<X>} stream containing non-promise values\n */\n\n_Stream2.default.prototype.awaitPromises = function () {\n  return (0, _promises.awaitPromises)(this);\n};\n\n// @deprecated use awaitPromises instead\n_Stream2.default.prototype.await = _Stream2.default.prototype.awaitPromises;\n\n// -----------------------------------------------------------------------\n// Error handling\n\n// @deprecated flatMapError, use recoverWith instead\nexports.recoverWith = _errors.recoverWith;\nexports.flatMapError = _errors.flatMapError;\nexports.throwError = _errors.throwError;\n\n/**\n * If this stream encounters an error, recover and continue with items from stream\n * returned by f.\n * stream:                  -a-b-c-X-\n * f(X):                           d-e-f-g-\n * flatMapError(f, stream): -a-b-c-d-e-f-g-\n * @param {function(error:*):Stream} f function which returns a new stream\n * @returns {Stream} new stream which will recover from an error by calling f\n */\n\n_Stream2.default.prototype.recoverWith = function (f) {\n  return (0, _errors.flatMapError)(f, this);\n};\n\n// @deprecated use recoverWith instead\n_Stream2.default.prototype.flatMapError = _Stream2.default.prototype.recoverWith;\n\n// -----------------------------------------------------------------------\n// Multicasting\n\nexports.multicast = _multicast2.default;\n\n/**\n * Transform the stream into multicast stream.  That means that many subscribers\n * to the stream will not cause multiple invocations of the internal machinery.\n * @returns {Stream} new stream which will multicast events to all observers.\n */\n\n_Stream2.default.prototype.multicast = function () {\n  return (0, _multicast2.default)(this);\n};\n\n// export the instance of the defaultScheduler for third-party libraries\nexports.defaultScheduler = _defaultScheduler2.default;\n\n// export an implementation of Task used internally for third-party libraries\n\nexports.PropagateTask = _PropagateTask2.default;\n},{\"./Stream\":174,\"./combinator/accumulate\":175,\"./combinator/applicative\":176,\"./combinator/build\":177,\"./combinator/combine\":178,\"./combinator/concatMap\":179,\"./combinator/continueWith\":180,\"./combinator/delay\":181,\"./combinator/errors\":182,\"./combinator/filter\":183,\"./combinator/flatMap\":184,\"./combinator/limit\":185,\"./combinator/loop\":186,\"./combinator/merge\":187,\"./combinator/mergeConcurrently\":188,\"./combinator/observe\":189,\"./combinator/promises\":190,\"./combinator/sample\":191,\"./combinator/slice\":192,\"./combinator/switch\":193,\"./combinator/thru\":194,\"./combinator/timeslice\":195,\"./combinator/timestamp\":196,\"./combinator/transduce\":197,\"./combinator/transform\":198,\"./combinator/zip\":199,\"./observable/subscribe\":212,\"./scheduler/PropagateTask\":215,\"./scheduler/defaultScheduler\":219,\"./source/core\":226,\"./source/from\":227,\"./source/fromEvent\":229,\"./source/generate\":231,\"./source/iterate\":232,\"./source/periodic\":233,\"./source/unfold\":235,\"@most/multicast\":142,\"@most/prelude\":143,\"symbol-observable\":262}],208:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = invoke;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction invoke(f, args) {\n  /* eslint complexity: [2,7] */\n  switch (args.length) {\n    case 0:\n      return f();\n    case 1:\n      return f(args[0]);\n    case 2:\n      return f(args[0], args[1]);\n    case 3:\n      return f(args[0], args[1], args[2]);\n    case 4:\n      return f(args[0], args[1], args[2], args[3]);\n    case 5:\n      return f(args[0], args[1], args[2], args[3], args[4]);\n    default:\n      return f.apply(void 0, args);\n  }\n}\n},{}],209:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isIterable = isIterable;\nexports.getIterator = getIterator;\nexports.makeIterable = makeIterable;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\n/* global Set, Symbol */\nvar iteratorSymbol;\n// Firefox ships a partial implementation using the name @@iterator.\n// https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14\nif (typeof Set === 'function' && typeof new Set()['@@iterator'] === 'function') {\n  iteratorSymbol = '@@iterator';\n} else {\n  iteratorSymbol = typeof Symbol === 'function' ? Symbol.iterator : '_es6shim_iterator_';\n}\n\nfunction isIterable(o) {\n  return typeof o[iteratorSymbol] === 'function';\n}\n\nfunction getIterator(o) {\n  return o[iteratorSymbol]();\n}\n\nfunction makeIterable(f, o) {\n  o[iteratorSymbol] = f;\n  return o;\n}\n},{}],210:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fromObservable = fromObservable;\nexports.ObservableSource = ObservableSource;\nexports.SubscriberSink = SubscriberSink;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _tryEvent = require('../source/tryEvent');\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fromObservable(observable) {\n  return new _Stream2.default(new ObservableSource(observable));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction ObservableSource(observable) {\n  this.observable = observable;\n}\n\nObservableSource.prototype.run = function (sink, scheduler) {\n  var sub = this.observable.subscribe(new SubscriberSink(sink, scheduler));\n  if (typeof sub === 'function') {\n    return dispose.create(sub);\n  } else if (sub && typeof sub.unsubscribe === 'function') {\n    return dispose.create(unsubscribe, sub);\n  }\n\n  throw new TypeError('Observable returned invalid subscription ' + String(sub));\n};\n\nfunction SubscriberSink(sink, scheduler) {\n  this.sink = sink;\n  this.scheduler = scheduler;\n}\n\nSubscriberSink.prototype.next = function (x) {\n  (0, _tryEvent.tryEvent)(this.scheduler.now(), x, this.sink);\n};\n\nSubscriberSink.prototype.complete = function (x) {\n  (0, _tryEvent.tryEnd)(this.scheduler.now(), x, this.sink);\n};\n\nSubscriberSink.prototype.error = function (e) {\n  this.sink.error(this.scheduler.now(), e);\n};\n\nfunction unsubscribe(subscription) {\n  return subscription.unsubscribe();\n}\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../source/tryEvent\":234}],211:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = getObservable;\n\nvar _symbolObservable = require('symbol-observable');\n\nvar _symbolObservable2 = _interopRequireDefault(_symbolObservable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getObservable(o) {\n  // eslint-disable-line complexity\n  var obs = null;\n  if (o) {\n    // Access foreign method only once\n    var method = o[_symbolObservable2.default];\n    if (typeof method === 'function') {\n      obs = method.call(o);\n      if (!(obs && typeof obs.subscribe === 'function')) {\n        throw new TypeError('invalid observable ' + obs);\n      }\n    }\n  }\n\n  return obs;\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n},{\"symbol-observable\":262}],212:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.subscribe = subscribe;\nexports.SubscribeObserver = SubscribeObserver;\nexports.Subscription = Subscription;\n\nvar _defaultScheduler = require('../scheduler/defaultScheduler');\n\nvar _defaultScheduler2 = _interopRequireDefault(_defaultScheduler);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _fatalError = require('../fatalError');\n\nvar _fatalError2 = _interopRequireDefault(_fatalError);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction subscribe(subscriber, stream) {\n  if (Object(subscriber) !== subscriber) {\n    throw new TypeError('subscriber must be an object');\n  }\n\n  var disposable = dispose.settable();\n  var observer = new SubscribeObserver(_fatalError2.default, subscriber, disposable);\n\n  disposable.setDisposable(stream.source.run(observer, _defaultScheduler2.default));\n\n  return new Subscription(disposable);\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction SubscribeObserver(fatalError, subscriber, disposable) {\n  this.fatalError = fatalError;\n  this.subscriber = subscriber;\n  this.disposable = disposable;\n}\n\nSubscribeObserver.prototype.event = function (t, x) {\n  if (!this.disposable.disposed && typeof this.subscriber.next === 'function') {\n    this.subscriber.next(x);\n  }\n};\n\nSubscribeObserver.prototype.end = function (t, x) {\n  if (!this.disposable.disposed) {\n    var s = this.subscriber;\n    var fatalError = this.fatalError;\n    Promise.resolve(this.disposable.dispose()).then(function () {\n      if (typeof s.complete === 'function') {\n        s.complete(x);\n      }\n    }).catch(function (e) {\n      throwError(e, s, fatalError);\n    });\n  }\n};\n\nSubscribeObserver.prototype.error = function (t, e) {\n  var s = this.subscriber;\n  var fatalError = this.fatalError;\n  Promise.resolve(this.disposable.dispose()).then(function () {\n    throwError(e, s, fatalError);\n  });\n};\n\nfunction Subscription(disposable) {\n  this.disposable = disposable;\n}\n\nSubscription.prototype.unsubscribe = function () {\n  this.disposable.dispose();\n};\n\nfunction throwError(e1, subscriber, throwError) {\n  if (typeof subscriber.error === 'function') {\n    try {\n      subscriber.error(e1);\n    } catch (e2) {\n      throwError(e2);\n    }\n  } else {\n    throwError(e1);\n  }\n}\n},{\"../disposable/dispose\":202,\"../fatalError\":203,\"../scheduler/defaultScheduler\":219}],213:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.withDefaultScheduler = withDefaultScheduler;\nexports.withScheduler = withScheduler;\n\nvar _dispose = require('./disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _defaultScheduler = require('./scheduler/defaultScheduler');\n\nvar _defaultScheduler2 = _interopRequireDefault(_defaultScheduler);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction withDefaultScheduler(source) {\n  return withScheduler(source, _defaultScheduler2.default);\n}\n\nfunction withScheduler(source, scheduler) {\n  return new Promise(function (resolve, reject) {\n    runSource(source, scheduler, resolve, reject);\n  });\n}\n\nfunction runSource(source, scheduler, resolve, reject) {\n  var disposable = dispose.settable();\n  var observer = new Drain(resolve, reject, disposable);\n\n  disposable.setDisposable(source.run(observer, scheduler));\n}\n\nfunction Drain(end, error, disposable) {\n  this._end = end;\n  this._error = error;\n  this._disposable = disposable;\n  this.active = true;\n}\n\nDrain.prototype.event = function (t, x) {};\n\nDrain.prototype.end = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n  this.active = false;\n  disposeThen(this._end, this._error, this._disposable, x);\n};\n\nDrain.prototype.error = function (t, e) {\n  this.active = false;\n  disposeThen(this._error, this._error, this._disposable, e);\n};\n\nfunction disposeThen(end, error, disposable, x) {\n  Promise.resolve(disposable.dispose()).then(function () {\n    end(x);\n  }, error);\n}\n},{\"./disposable/dispose\":202,\"./scheduler/defaultScheduler\":219}],214:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ClockTimer;\n\nvar _task = require('../task');\n\n/* global setTimeout, clearTimeout */\n\nfunction ClockTimer() {} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nClockTimer.prototype.now = Date.now;\n\nClockTimer.prototype.setTimer = function (f, dt) {\n  return dt <= 0 ? runAsap(f) : setTimeout(f, dt);\n};\n\nClockTimer.prototype.clearTimer = function (t) {\n  return t instanceof Asap ? t.cancel() : clearTimeout(t);\n};\n\nfunction Asap(f) {\n  this.f = f;\n  this.active = true;\n}\n\nAsap.prototype.run = function () {\n  return this.active && this.f();\n};\n\nAsap.prototype.error = function (e) {\n  throw e;\n};\n\nAsap.prototype.cancel = function () {\n  this.active = false;\n};\n\nfunction runAsap(f) {\n  var task = new Asap(f);\n  (0, _task.defer)(task);\n  return task;\n}\n},{\"../task\":236}],215:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = PropagateTask;\n\nvar _fatalError = require('../fatalError');\n\nvar _fatalError2 = _interopRequireDefault(_fatalError);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction PropagateTask(run, value, sink) {\n  this._run = run;\n  this.value = value;\n  this.sink = sink;\n  this.active = true;\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nPropagateTask.event = function (value, sink) {\n  return new PropagateTask(emit, value, sink);\n};\n\nPropagateTask.end = function (value, sink) {\n  return new PropagateTask(end, value, sink);\n};\n\nPropagateTask.error = function (value, sink) {\n  return new PropagateTask(error, value, sink);\n};\n\nPropagateTask.prototype.dispose = function () {\n  this.active = false;\n};\n\nPropagateTask.prototype.run = function (t) {\n  if (!this.active) {\n    return;\n  }\n  this._run(t, this.value, this.sink);\n};\n\nPropagateTask.prototype.error = function (t, e) {\n  if (!this.active) {\n    return (0, _fatalError2.default)(e);\n  }\n  this.sink.error(t, e);\n};\n\nfunction error(t, e, sink) {\n  sink.error(t, e);\n}\n\nfunction emit(t, x, sink) {\n  sink.event(t, x);\n}\n\nfunction end(t, x, sink) {\n  sink.end(t, x);\n}\n},{\"../fatalError\":203}],216:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ScheduledTask;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction ScheduledTask(delay, period, task, scheduler) {\n  this.time = delay;\n  this.period = period;\n  this.task = task;\n  this.scheduler = scheduler;\n  this.active = true;\n}\n\nScheduledTask.prototype.run = function () {\n  return this.task.run(this.time);\n};\n\nScheduledTask.prototype.error = function (e) {\n  return this.task.error(this.time, e);\n};\n\nScheduledTask.prototype.dispose = function () {\n  this.scheduler.cancel(this);\n  return this.task.dispose();\n};\n},{}],217:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Scheduler;\n\nvar _ScheduledTask = require('./ScheduledTask');\n\nvar _ScheduledTask2 = _interopRequireDefault(_ScheduledTask);\n\nvar _task = require('../task');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction Scheduler(timer, timeline) {\n  this.timer = timer;\n  this.timeline = timeline;\n\n  this._timer = null;\n  this._nextArrival = Infinity;\n\n  var self = this;\n  this._runReadyTasksBound = function () {\n    self._runReadyTasks(self.now());\n  };\n}\n\nScheduler.prototype.now = function () {\n  return this.timer.now();\n};\n\nScheduler.prototype.asap = function (task) {\n  return this.schedule(0, -1, task);\n};\n\nScheduler.prototype.delay = function (delay, task) {\n  return this.schedule(delay, -1, task);\n};\n\nScheduler.prototype.periodic = function (period, task) {\n  return this.schedule(0, period, task);\n};\n\nScheduler.prototype.schedule = function (delay, period, task) {\n  var now = this.now();\n  var st = new _ScheduledTask2.default(now + Math.max(0, delay), period, task, this);\n\n  this.timeline.add(st);\n  this._scheduleNextRun(now);\n  return st;\n};\n\nScheduler.prototype.cancel = function (task) {\n  task.active = false;\n  if (this.timeline.remove(task)) {\n    this._reschedule();\n  }\n};\n\nScheduler.prototype.cancelAll = function (f) {\n  this.timeline.removeAll(f);\n  this._reschedule();\n};\n\nScheduler.prototype._reschedule = function () {\n  if (this.timeline.isEmpty()) {\n    this._unschedule();\n  } else {\n    this._scheduleNextRun(this.now());\n  }\n};\n\nScheduler.prototype._unschedule = function () {\n  this.timer.clearTimer(this._timer);\n  this._timer = null;\n};\n\nScheduler.prototype._scheduleNextRun = function (now) {\n  // eslint-disable-line complexity\n  if (this.timeline.isEmpty()) {\n    return;\n  }\n\n  var nextArrival = this.timeline.nextArrival();\n\n  if (this._timer === null) {\n    this._scheduleNextArrival(nextArrival, now);\n  } else if (nextArrival < this._nextArrival) {\n    this._unschedule();\n    this._scheduleNextArrival(nextArrival, now);\n  }\n};\n\nScheduler.prototype._scheduleNextArrival = function (nextArrival, now) {\n  this._nextArrival = nextArrival;\n  var delay = Math.max(0, nextArrival - now);\n  this._timer = this.timer.setTimer(this._runReadyTasksBound, delay);\n};\n\nScheduler.prototype._runReadyTasks = function (now) {\n  this._timer = null;\n  this.timeline.runTasks(now, _task.runTask);\n  this._scheduleNextRun(this.now());\n};\n},{\"../task\":236,\"./ScheduledTask\":216}],218:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Timeline;\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction Timeline() {\n  this.tasks = [];\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nTimeline.prototype.nextArrival = function () {\n  return this.isEmpty() ? Infinity : this.tasks[0].time;\n};\n\nTimeline.prototype.isEmpty = function () {\n  return this.tasks.length === 0;\n};\n\nTimeline.prototype.add = function (st) {\n  insertByTime(st, this.tasks);\n};\n\nTimeline.prototype.remove = function (st) {\n  var i = binarySearch(st.time, this.tasks);\n\n  if (i >= 0 && i < this.tasks.length) {\n    var at = base.findIndex(st, this.tasks[i].events);\n    if (at >= 0) {\n      this.tasks[i].events.splice(at, 1);\n      return true;\n    }\n  }\n\n  return false;\n};\n\nTimeline.prototype.removeAll = function (f) {\n  var this$1 = this;\n\n  for (var i = 0, l = this.tasks.length; i < l; ++i) {\n    removeAllFrom(f, this$1.tasks[i]);\n  }\n};\n\nTimeline.prototype.runTasks = function (t, runTask) {\n  var this$1 = this;\n\n  var tasks = this.tasks;\n  var l = tasks.length;\n  var i = 0;\n\n  while (i < l && tasks[i].time <= t) {\n    ++i;\n  }\n\n  this.tasks = tasks.slice(i);\n\n  // Run all ready tasks\n  for (var j = 0; j < i; ++j) {\n    this$1.tasks = runTasks(runTask, tasks[j], this$1.tasks);\n  }\n};\n\nfunction runTasks(runTask, timeslot, tasks) {\n  // eslint-disable-line complexity\n  var events = timeslot.events;\n  for (var i = 0; i < events.length; ++i) {\n    var task = events[i];\n\n    if (task.active) {\n      runTask(task);\n\n      // Reschedule periodic repeating tasks\n      // Check active again, since a task may have canceled itself\n      if (task.period >= 0 && task.active) {\n        task.time = task.time + task.period;\n        insertByTime(task, tasks);\n      }\n    }\n  }\n\n  return tasks;\n}\n\nfunction insertByTime(task, timeslots) {\n  // eslint-disable-line complexity\n  var l = timeslots.length;\n\n  if (l === 0) {\n    timeslots.push(newTimeslot(task.time, [task]));\n    return;\n  }\n\n  var i = binarySearch(task.time, timeslots);\n\n  if (i >= l) {\n    timeslots.push(newTimeslot(task.time, [task]));\n  } else if (task.time === timeslots[i].time) {\n    timeslots[i].events.push(task);\n  } else {\n    timeslots.splice(i, 0, newTimeslot(task.time, [task]));\n  }\n}\n\nfunction removeAllFrom(f, timeslot) {\n  timeslot.events = base.removeAll(f, timeslot.events);\n}\n\nfunction binarySearch(t, sortedArray) {\n  // eslint-disable-line complexity\n  var lo = 0;\n  var hi = sortedArray.length;\n  var mid, y;\n\n  while (lo < hi) {\n    mid = Math.floor((lo + hi) / 2);\n    y = sortedArray[mid];\n\n    if (t === y.time) {\n      return mid;\n    } else if (t < y.time) {\n      hi = mid;\n    } else {\n      lo = mid + 1;\n    }\n  }\n  return hi;\n}\n\nfunction newTimeslot(t, events) {\n  return { time: t, events: events };\n}\n},{\"@most/prelude\":143}],219:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _Scheduler = require('./Scheduler');\n\nvar _Scheduler2 = _interopRequireDefault(_Scheduler);\n\nvar _ClockTimer = require('./ClockTimer');\n\nvar _ClockTimer2 = _interopRequireDefault(_ClockTimer);\n\nvar _Timeline = require('./Timeline');\n\nvar _Timeline2 = _interopRequireDefault(_Timeline);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar defaultScheduler = new _Scheduler2.default(new _ClockTimer2.default(), new _Timeline2.default()); /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nexports.default = defaultScheduler;\n},{\"./ClockTimer\":214,\"./Scheduler\":217,\"./Timeline\":218}],220:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = DeferredSink;\n\nvar _task = require('../task');\n\nfunction DeferredSink(sink) {\n  this.sink = sink;\n  this.events = [];\n  this.active = true;\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nDeferredSink.prototype.event = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n\n  if (this.events.length === 0) {\n    (0, _task.defer)(new PropagateAllTask(this.sink, t, this.events));\n  }\n\n  this.events.push({ time: t, value: x });\n};\n\nDeferredSink.prototype.end = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n\n  this._end(new EndTask(t, x, this.sink));\n};\n\nDeferredSink.prototype.error = function (t, e) {\n  this._end(new ErrorTask(t, e, this.sink));\n};\n\nDeferredSink.prototype._end = function (task) {\n  this.active = false;\n  (0, _task.defer)(task);\n};\n\nfunction PropagateAllTask(sink, time, events) {\n  this.sink = sink;\n  this.events = events;\n  this.time = time;\n}\n\nPropagateAllTask.prototype.run = function () {\n  var this$1 = this;\n\n  var events = this.events;\n  var sink = this.sink;\n  var event;\n\n  for (var i = 0, l = events.length; i < l; ++i) {\n    event = events[i];\n    this$1.time = event.time;\n    sink.event(event.time, event.value);\n  }\n\n  events.length = 0;\n};\n\nPropagateAllTask.prototype.error = function (e) {\n  this.sink.error(this.time, e);\n};\n\nfunction EndTask(t, x, sink) {\n  this.time = t;\n  this.value = x;\n  this.sink = sink;\n}\n\nEndTask.prototype.run = function () {\n  this.sink.end(this.time, this.value);\n};\n\nEndTask.prototype.error = function (e) {\n  this.sink.error(this.time, e);\n};\n\nfunction ErrorTask(t, e, sink) {\n  this.time = t;\n  this.value = e;\n  this.sink = sink;\n}\n\nErrorTask.prototype.run = function () {\n  this.sink.error(this.time, this.value);\n};\n\nErrorTask.prototype.error = function (e) {\n  throw e;\n};\n},{\"../task\":236}],221:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = IndexSink;\n\nvar _Pipe = require('./Pipe');\n\nvar _Pipe2 = _interopRequireDefault(_Pipe);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction IndexSink(i, sink) {\n  this.sink = sink;\n  this.index = i;\n  this.active = true;\n  this.value = void 0;\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nIndexSink.prototype.event = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n  this.value = x;\n  this.sink.event(t, this);\n};\n\nIndexSink.prototype.end = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n  this.active = false;\n  this.sink.end(t, { index: this.index, value: x });\n};\n\nIndexSink.prototype.error = _Pipe2.default.prototype.error;\n},{\"./Pipe\":222}],222:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Pipe;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\n/**\n * A sink mixin that simply forwards event, end, and error to\n * another sink.\n * @param sink\n * @constructor\n */\nfunction Pipe(sink) {\n  this.sink = sink;\n}\n\nPipe.prototype.event = function (t, x) {\n  return this.sink.event(t, x);\n};\n\nPipe.prototype.end = function (t, x) {\n  return this.sink.end(t, x);\n};\n\nPipe.prototype.error = function (t, e) {\n  return this.sink.error(t, e);\n};\n},{}],223:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = SafeSink;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction SafeSink(sink) {\n  this.sink = sink;\n  this.active = true;\n}\n\nSafeSink.prototype.event = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n  this.sink.event(t, x);\n};\n\nSafeSink.prototype.end = function (t, x) {\n  if (!this.active) {\n    return;\n  }\n  this.disable();\n  this.sink.end(t, x);\n};\n\nSafeSink.prototype.error = function (t, e) {\n  this.disable();\n  this.sink.error(t, e);\n};\n\nSafeSink.prototype.disable = function () {\n  this.active = false;\n  return this.sink;\n};\n},{}],224:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = EventEmitterSource;\n\nvar _DeferredSink = require('../sink/DeferredSink');\n\nvar _DeferredSink2 = _interopRequireDefault(_DeferredSink);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _tryEvent = require('./tryEvent');\n\nvar tryEvent = _interopRequireWildcard(_tryEvent);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction EventEmitterSource(event, source) {\n  this.event = event;\n  this.source = source;\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nEventEmitterSource.prototype.run = function (sink, scheduler) {\n  // NOTE: Because EventEmitter allows events in the same call stack as\n  // a listener is added, use a DeferredSink to buffer events\n  // until the stack clears, then propagate.  This maintains most.js's\n  // invariant that no event will be delivered in the same call stack\n  // as an observer begins observing.\n  var dsink = new _DeferredSink2.default(sink);\n\n  function addEventVariadic(a) {\n    var arguments$1 = arguments;\n\n    var l = arguments.length;\n    if (l > 1) {\n      var arr = new Array(l);\n      for (var i = 0; i < l; ++i) {\n        arr[i] = arguments$1[i];\n      }\n      tryEvent.tryEvent(scheduler.now(), arr, dsink);\n    } else {\n      tryEvent.tryEvent(scheduler.now(), a, dsink);\n    }\n  }\n\n  this.source.addListener(this.event, addEventVariadic);\n\n  return dispose.create(disposeEventEmitter, { target: this, addEvent: addEventVariadic });\n};\n\nfunction disposeEventEmitter(info) {\n  var target = info.target;\n  target.source.removeListener(target.event, info.addEvent);\n}\n},{\"../disposable/dispose\":202,\"../sink/DeferredSink\":220,\"./tryEvent\":234}],225:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = EventTargetSource;\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _tryEvent = require('./tryEvent');\n\nvar tryEvent = _interopRequireWildcard(_tryEvent);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction EventTargetSource(event, source, capture) {\n  this.event = event;\n  this.source = source;\n  this.capture = capture;\n}\n\nEventTargetSource.prototype.run = function (sink, scheduler) {\n  function addEvent(e) {\n    tryEvent.tryEvent(scheduler.now(), e, sink);\n  }\n\n  this.source.addEventListener(this.event, addEvent, this.capture);\n\n  return dispose.create(disposeEventTarget, { target: this, addEvent: addEvent });\n};\n\nfunction disposeEventTarget(info) {\n  var target = info.target;\n  target.source.removeEventListener(target.event, info.addEvent, target.capture);\n}\n},{\"../disposable/dispose\":202,\"./tryEvent\":234}],226:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.of = of;\nexports.empty = empty;\nexports.never = never;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _dispose = require('../disposable/dispose');\n\nvar dispose = _interopRequireWildcard(_dispose);\n\nvar _PropagateTask = require('../scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Stream containing only x\n * @param {*} x\n * @returns {Stream}\n */\nfunction of(x) {\n  return new _Stream2.default(new Just(x));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction Just(x) {\n  this.value = x;\n}\n\nJust.prototype.run = function (sink, scheduler) {\n  return scheduler.asap(new _PropagateTask2.default(runJust, this.value, sink));\n};\n\nfunction runJust(t, x, sink) {\n  sink.event(t, x);\n  sink.end(t, void 0);\n}\n\n/**\n * Stream containing no events and ends immediately\n * @returns {Stream}\n */\nfunction empty() {\n  return EMPTY;\n}\n\nfunction EmptySource() {}\n\nEmptySource.prototype.run = function (sink, scheduler) {\n  var task = _PropagateTask2.default.end(void 0, sink);\n  scheduler.asap(task);\n\n  return dispose.create(disposeEmpty, task);\n};\n\nfunction disposeEmpty(task) {\n  return task.dispose();\n}\n\nvar EMPTY = new _Stream2.default(new EmptySource());\n\n/**\n * Stream containing no events and never ends\n * @returns {Stream}\n */\nfunction never() {\n  return NEVER;\n}\n\nfunction NeverSource() {}\n\nNeverSource.prototype.run = function () {\n  return dispose.empty();\n};\n\nvar NEVER = new _Stream2.default(new NeverSource());\n},{\"../Stream\":174,\"../disposable/dispose\":202,\"../scheduler/PropagateTask\":215}],227:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.from = from;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _fromArray = require('./fromArray');\n\nvar _iterable = require('../iterable');\n\nvar _fromIterable = require('./fromIterable');\n\nvar _getObservable = require('../observable/getObservable');\n\nvar _getObservable2 = _interopRequireDefault(_getObservable);\n\nvar _fromObservable = require('../observable/fromObservable');\n\nvar _prelude = require('@most/prelude');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction from(a) {\n  // eslint-disable-line complexity\n  if (a instanceof _Stream2.default) {\n    return a;\n  }\n\n  var observable = (0, _getObservable2.default)(a);\n  if (observable != null) {\n    return (0, _fromObservable.fromObservable)(observable);\n  }\n\n  if (Array.isArray(a) || (0, _prelude.isArrayLike)(a)) {\n    return (0, _fromArray.fromArray)(a);\n  }\n\n  if ((0, _iterable.isIterable)(a)) {\n    return (0, _fromIterable.fromIterable)(a);\n  }\n\n  throw new TypeError('from(x) must be observable, iterable, or array-like: ' + a);\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n},{\"../Stream\":174,\"../iterable\":209,\"../observable/fromObservable\":210,\"../observable/getObservable\":211,\"./fromArray\":228,\"./fromIterable\":230,\"@most/prelude\":143}],228:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fromArray = fromArray;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _PropagateTask = require('../scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction fromArray(a) {\n  return new _Stream2.default(new ArraySource(a));\n}\n\nfunction ArraySource(a) {\n  this.array = a;\n}\n\nArraySource.prototype.run = function (sink, scheduler) {\n  return scheduler.asap(new _PropagateTask2.default(runProducer, this.array, sink));\n};\n\nfunction runProducer(t, array, sink) {\n  for (var i = 0, l = array.length; i < l && this.active; ++i) {\n    sink.event(t, array[i]);\n  }\n\n  this.active && sink.end(t);\n}\n},{\"../Stream\":174,\"../scheduler/PropagateTask\":215}],229:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fromEvent = fromEvent;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _EventTargetSource = require('./EventTargetSource');\n\nvar _EventTargetSource2 = _interopRequireDefault(_EventTargetSource);\n\nvar _EventEmitterSource = require('./EventEmitterSource');\n\nvar _EventEmitterSource2 = _interopRequireDefault(_EventEmitterSource);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Create a stream from an EventTarget, such as a DOM Node, or EventEmitter.\n * @param {String} event event type name, e.g. 'click'\n * @param {EventTarget|EventEmitter} source EventTarget or EventEmitter\n * @param {*?} capture for DOM events, whether to use\n *  capturing--passed as 3rd parameter to addEventListener.\n * @returns {Stream} stream containing all events of the specified type\n * from the source.\n */\nfunction fromEvent(event, source, capture) {\n  // eslint-disable-line complexity\n  var s;\n\n  if (typeof source.addEventListener === 'function' && typeof source.removeEventListener === 'function') {\n    if (arguments.length < 3) {\n      capture = false;\n    }\n\n    s = new _EventTargetSource2.default(event, source, capture);\n  } else if (typeof source.addListener === 'function' && typeof source.removeListener === 'function') {\n    s = new _EventEmitterSource2.default(event, source);\n  } else {\n    throw new Error('source must support addEventListener/removeEventListener or addListener/removeListener');\n  }\n\n  return new _Stream2.default(s);\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n},{\"../Stream\":174,\"./EventEmitterSource\":224,\"./EventTargetSource\":225}],230:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fromIterable = fromIterable;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _iterable = require('../iterable');\n\nvar _PropagateTask = require('../scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fromIterable(iterable) {\n  return new _Stream2.default(new IterableSource(iterable));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction IterableSource(iterable) {\n  this.iterable = iterable;\n}\n\nIterableSource.prototype.run = function (sink, scheduler) {\n  return scheduler.asap(new _PropagateTask2.default(runProducer, (0, _iterable.getIterator)(this.iterable), sink));\n};\n\nfunction runProducer(t, iterator, sink) {\n  var r = iterator.next();\n\n  while (!r.done && this.active) {\n    sink.event(t, r.value);\n    r = iterator.next();\n  }\n\n  sink.end(t, r.value);\n}\n},{\"../Stream\":174,\"../iterable\":209,\"../scheduler/PropagateTask\":215}],231:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.generate = generate;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _prelude = require('@most/prelude');\n\nvar base = _interopRequireWildcard(_prelude);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Compute a stream using an *async* generator, which yields promises\n * to control event times.\n * @param f\n * @returns {Stream}\n */\n/** @license MIT License (c) copyright 2010-2014 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction generate(f /*, ...args */) {\n  return new _Stream2.default(new GenerateSource(f, base.tail(arguments)));\n}\n\nfunction GenerateSource(f, args) {\n  this.f = f;\n  this.args = args;\n}\n\nGenerateSource.prototype.run = function (sink, scheduler) {\n  return new Generate(this.f.apply(void 0, this.args), sink, scheduler);\n};\n\nfunction Generate(iterator, sink, scheduler) {\n  this.iterator = iterator;\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.active = true;\n\n  var self = this;\n  function err(e) {\n    self.sink.error(self.scheduler.now(), e);\n  }\n\n  Promise.resolve(this).then(next).catch(err);\n}\n\nfunction next(generate, x) {\n  return generate.active ? handle(generate, generate.iterator.next(x)) : x;\n}\n\nfunction handle(generate, result) {\n  if (result.done) {\n    return generate.sink.end(generate.scheduler.now(), result.value);\n  }\n\n  return Promise.resolve(result.value).then(function (x) {\n    return emit(generate, x);\n  }, function (e) {\n    return error(generate, e);\n  });\n}\n\nfunction emit(generate, x) {\n  generate.sink.event(generate.scheduler.now(), x);\n  return next(generate, x);\n}\n\nfunction error(generate, e) {\n  return handle(generate, generate.iterator.throw(e));\n}\n\nGenerate.prototype.dispose = function () {\n  this.active = false;\n};\n},{\"../Stream\":174,\"@most/prelude\":143}],232:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.iterate = iterate;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Compute a stream by iteratively calling f to produce values\n * Event times may be controlled by returning a Promise from f\n * @param {function(x:*):*|Promise<*>} f\n * @param {*} x initial value\n * @returns {Stream}\n */\nfunction iterate(f, x) {\n  return new _Stream2.default(new IterateSource(f, x));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction IterateSource(f, x) {\n  this.f = f;\n  this.value = x;\n}\n\nIterateSource.prototype.run = function (sink, scheduler) {\n  return new Iterate(this.f, this.value, sink, scheduler);\n};\n\nfunction Iterate(f, initial, sink, scheduler) {\n  this.f = f;\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.active = true;\n\n  var x = initial;\n\n  var self = this;\n  function err(e) {\n    self.sink.error(self.scheduler.now(), e);\n  }\n\n  function start(iterate) {\n    return stepIterate(iterate, x);\n  }\n\n  Promise.resolve(this).then(start).catch(err);\n}\n\nIterate.prototype.dispose = function () {\n  this.active = false;\n};\n\nfunction stepIterate(iterate, x) {\n  iterate.sink.event(iterate.scheduler.now(), x);\n\n  if (!iterate.active) {\n    return x;\n  }\n\n  var f = iterate.f;\n  return Promise.resolve(f(x)).then(function (y) {\n    return continueIterate(iterate, y);\n  });\n}\n\nfunction continueIterate(iterate, x) {\n  return !iterate.active ? iterate.value : stepIterate(iterate, x);\n}\n},{\"../Stream\":174}],233:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.periodic = periodic;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nvar _PropagateTask = require('../scheduler/PropagateTask');\n\nvar _PropagateTask2 = _interopRequireDefault(_PropagateTask);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Create a stream that emits the current time periodically\n * @param {Number} period periodicity of events in millis\n * @param {*} deprecatedValue @deprecated value to emit each period\n * @returns {Stream} new stream that emits the current time every period\n */\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction periodic(period, deprecatedValue) {\n  return new _Stream2.default(new Periodic(period, deprecatedValue));\n}\n\nfunction Periodic(period, value) {\n  this.period = period;\n  this.value = value;\n}\n\nPeriodic.prototype.run = function (sink, scheduler) {\n  return scheduler.periodic(this.period, _PropagateTask2.default.event(this.value, sink));\n};\n},{\"../Stream\":174,\"../scheduler/PropagateTask\":215}],234:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.tryEvent = tryEvent;\nexports.tryEnd = tryEnd;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction tryEvent(t, x, sink) {\n  try {\n    sink.event(t, x);\n  } catch (e) {\n    sink.error(t, e);\n  }\n}\n\nfunction tryEnd(t, x, sink) {\n  try {\n    sink.end(t, x);\n  } catch (e) {\n    sink.error(t, e);\n  }\n}\n},{}],235:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.unfold = unfold;\n\nvar _Stream = require('../Stream');\n\nvar _Stream2 = _interopRequireDefault(_Stream);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Compute a stream by unfolding tuples of future values from a seed value\n * Event times may be controlled by returning a Promise from f\n * @param {function(seed:*):{value:*, seed:*, done:boolean}|Promise<{value:*, seed:*, done:boolean}>} f unfolding function accepts\n *  a seed and returns a new tuple with a value, new seed, and boolean done flag.\n *  If tuple.done is true, the stream will end.\n * @param {*} seed seed value\n * @returns {Stream} stream containing all value of all tuples produced by the\n *  unfolding function.\n */\nfunction unfold(f, seed) {\n  return new _Stream2.default(new UnfoldSource(f, seed));\n} /** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction UnfoldSource(f, seed) {\n  this.f = f;\n  this.value = seed;\n}\n\nUnfoldSource.prototype.run = function (sink, scheduler) {\n  return new Unfold(this.f, this.value, sink, scheduler);\n};\n\nfunction Unfold(f, x, sink, scheduler) {\n  this.f = f;\n  this.sink = sink;\n  this.scheduler = scheduler;\n  this.active = true;\n\n  var self = this;\n  function err(e) {\n    self.sink.error(self.scheduler.now(), e);\n  }\n\n  function start(unfold) {\n    return stepUnfold(unfold, x);\n  }\n\n  Promise.resolve(this).then(start).catch(err);\n}\n\nUnfold.prototype.dispose = function () {\n  this.active = false;\n};\n\nfunction stepUnfold(unfold, x) {\n  var f = unfold.f;\n  return Promise.resolve(f(x)).then(function (tuple) {\n    return continueUnfold(unfold, tuple);\n  });\n}\n\nfunction continueUnfold(unfold, tuple) {\n  if (tuple.done) {\n    unfold.sink.end(unfold.scheduler.now(), tuple.value);\n    return tuple.value;\n  }\n\n  unfold.sink.event(unfold.scheduler.now(), tuple.value);\n\n  if (!unfold.active) {\n    return tuple.value;\n  }\n  return stepUnfold(unfold, tuple.seed);\n}\n},{\"../Stream\":174}],236:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.defer = defer;\nexports.runTask = runTask;\n/** @license MIT License (c) copyright 2010-2016 original author or authors */\n/** @author Brian Cavalier */\n/** @author John Hann */\n\nfunction defer(task) {\n  return Promise.resolve(task).then(runTask);\n}\n\nfunction runTask(task) {\n  try {\n    return task.run();\n  } catch (e) {\n    return task.error(e);\n  }\n}\n},{}],237:[function(require,module,exports){\n'use strict';\n\nfunction isObject (o) {\n    return o && Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction indent (txt) {\n    var arr, res = [];\n\n    if (typeof txt !== 'string') {\n        return txt;\n    }\n\n    arr = txt.split('\\n');\n\n    if (arr.length === 1) {\n        return '  ' + txt;\n    }\n\n    arr.forEach(function (e) {\n        if (e.trim() === '') {\n            res.push(e);\n            return;\n        }\n        res.push('  ' + e);\n    });\n\n    return res.join('\\n');\n}\n\nfunction clean (txt) {\n    var arr = txt.split('\\n');\n    var res = [];\n    arr.forEach(function (e) {\n        if (e.trim() === '') {\n            return;\n        }\n        res.push(e);\n    });\n    return res.join('\\n');\n}\n\nfunction stringify (a) {\n    var res, body, isEmpty, isFlat;\n\n    body = '';\n    isFlat = true;\n    isEmpty = a.some(function (e, i, arr) {\n        if (i === 0) {\n            res = '<' + e;\n            if (arr.length === 1) {\n                return true;\n            }\n            return;\n        }\n\n        if (i === 1) {\n            if (isObject(e)) {\n                Object.keys(e).forEach(function (key) {\n                    res += ' ' + key + '=\"' + e[key] + '\"';\n                });\n                if (arr.length === 2) {\n                    return true;\n                }\n                res += '>';\n                return;\n            } else {\n                res += '>';\n            }\n        }\n\n        switch (typeof e) {\n        case 'string':\n        case 'number':\n        case 'boolean':\n            body += e + '\\n';\n            return;\n        }\n\n        isFlat = false;\n        body += stringify(e);\n    });\n\n    if (isEmpty) {\n        return res + '/>\\n'; // short form\n    } else {\n        if (isFlat) {\n            return res + clean(body) + '</' + a[0] + '>\\n';\n        } else {\n            return res + '\\n' + indent(body) + '</' + a[0] + '>\\n';\n        }\n    }\n}\n\nmodule.exports = stringify;\n\n},{}],238:[function(require,module,exports){\n(function (process){\n// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,\n// backported and transplited with Babel, with backwards-compat fixes\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  if (path.length === 0) return '.';\n  var code = path.charCodeAt(0);\n  var hasRoot = code === 47 /*/*/;\n  var end = -1;\n  var matchedSlash = true;\n  for (var i = path.length - 1; i >= 1; --i) {\n    code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        if (!matchedSlash) {\n          end = i;\n          break;\n        }\n      } else {\n      // We saw the first non-path separator\n      matchedSlash = false;\n    }\n  }\n\n  if (end === -1) return hasRoot ? '/' : '.';\n  if (hasRoot && end === 1) {\n    // return '//';\n    // Backwards-compat fix:\n    return '/';\n  }\n  return path.slice(0, end);\n};\n\nfunction basename(path) {\n  if (typeof path !== 'string') path = path + '';\n\n  var start = 0;\n  var end = -1;\n  var matchedSlash = true;\n  var i;\n\n  for (i = path.length - 1; i >= 0; --i) {\n    if (path.charCodeAt(i) === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          start = i + 1;\n          break;\n        }\n      } else if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // path component\n      matchedSlash = false;\n      end = i + 1;\n    }\n  }\n\n  if (end === -1) return '';\n  return path.slice(start, end);\n}\n\n// Uses a mixed approach for backwards-compatibility, as ext behavior changed\n// in new Node.js versions, so only basename() above is backported here\nexports.basename = function (path, ext) {\n  var f = basename(path);\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\nexports.extname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  var startDot = -1;\n  var startPart = 0;\n  var end = -1;\n  var matchedSlash = true;\n  // Track the state of characters (if any) we see before our first dot and\n  // after any path separator we find\n  var preDotState = 0;\n  for (var i = path.length - 1; i >= 0; --i) {\n    var code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          startPart = i + 1;\n          break;\n        }\n        continue;\n      }\n    if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // extension\n      matchedSlash = false;\n      end = i + 1;\n    }\n    if (code === 46 /*.*/) {\n        // If this is our first dot, mark it as the start of our extension\n        if (startDot === -1)\n          startDot = i;\n        else if (preDotState !== 1)\n          preDotState = 1;\n    } else if (startDot !== -1) {\n      // We saw a non-dot and non-path separator before our dot, so we should\n      // have a good chance at having a non-empty extension\n      preDotState = -1;\n    }\n  }\n\n  if (startDot === -1 || end === -1 ||\n      // We saw a non-dot character immediately before the dot\n      preDotState === 0 ||\n      // The (right-most) trimmed path component is exactly '..'\n      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n    return '';\n  }\n  return path.slice(startDot, end);\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n\n}).call(this,require('_process'))\n},{\"_process\":240}],239:[function(require,module,exports){\n(function (process){\n'use strict';\n\nif (!process.version ||\n    process.version.indexOf('v0.') === 0 ||\n    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n  module.exports = { nextTick: nextTick };\n} else {\n  module.exports = process\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('\"callback\" argument must be a function');\n  }\n  var len = arguments.length;\n  var args, i;\n  switch (len) {\n  case 0:\n  case 1:\n    return process.nextTick(fn);\n  case 2:\n    return process.nextTick(function afterTickOne() {\n      fn.call(null, arg1);\n    });\n  case 3:\n    return process.nextTick(function afterTickTwo() {\n      fn.call(null, arg1, arg2);\n    });\n  case 4:\n    return process.nextTick(function afterTickThree() {\n      fn.call(null, arg1, arg2, arg3);\n    });\n  default:\n    args = new Array(len - 1);\n    i = 0;\n    while (i < args.length) {\n      args[i++] = arguments[i];\n    }\n    return process.nextTick(function afterTick() {\n      fn.apply(null, args);\n    });\n  }\n}\n\n\n}).call(this,require('_process'))\n},{\"_process\":240}],240:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],241:[function(require,module,exports){\n(function (global){\n/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t    counter = 0,\n\t\t    length = string.length,\n\t\t    value,\n\t\t    extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t//  0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t    inputLength = input.length,\n\t\t    out,\n\t\t    i = 0,\n\t\t    n = initialN,\n\t\t    bias = initialBias,\n\t\t    basic,\n\t\t    j,\n\t\t    index,\n\t\t    oldi,\n\t\t    w,\n\t\t    k,\n\t\t    digit,\n\t\t    t,\n\t\t    /** Cached calculation results */\n\t\t    baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t    delta,\n\t\t    handledCPCount,\n\t\t    basicLength,\n\t\t    bias,\n\t\t    j,\n\t\t    m,\n\t\t    q,\n\t\t    k,\n\t\t    t,\n\t\t    currentValue,\n\t\t    output = [],\n\t\t    /** `inputLength` will hold the number of code points in `input`. */\n\t\t    inputLength,\n\t\t    /** Cached calculation results */\n\t\t    handledCPCountPlusOne,\n\t\t    baseMinusT,\n\t\t    qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],242:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n  sep = sep || '&';\n  eq = eq || '=';\n  var obj = {};\n\n  if (typeof qs !== 'string' || qs.length === 0) {\n    return obj;\n  }\n\n  var regexp = /\\+/g;\n  qs = qs.split(sep);\n\n  var maxKeys = 1000;\n  if (options && typeof options.maxKeys === 'number') {\n    maxKeys = options.maxKeys;\n  }\n\n  var len = qs.length;\n  // maxKeys <= 0 means that we should not limit keys count\n  if (maxKeys > 0 && len > maxKeys) {\n    len = maxKeys;\n  }\n\n  for (var i = 0; i < len; ++i) {\n    var x = qs[i].replace(regexp, '%20'),\n        idx = x.indexOf(eq),\n        kstr, vstr, k, v;\n\n    if (idx >= 0) {\n      kstr = x.substr(0, idx);\n      vstr = x.substr(idx + 1);\n    } else {\n      kstr = x;\n      vstr = '';\n    }\n\n    k = decodeURIComponent(kstr);\n    v = decodeURIComponent(vstr);\n\n    if (!hasOwnProperty(obj, k)) {\n      obj[k] = v;\n    } else if (isArray(obj[k])) {\n      obj[k].push(v);\n    } else {\n      obj[k] = [obj[k], v];\n    }\n  }\n\n  return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n},{}],243:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n  switch (typeof v) {\n    case 'string':\n      return v;\n\n    case 'boolean':\n      return v ? 'true' : 'false';\n\n    case 'number':\n      return isFinite(v) ? v : '';\n\n    default:\n      return '';\n  }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n  sep = sep || '&';\n  eq = eq || '=';\n  if (obj === null) {\n    obj = undefined;\n  }\n\n  if (typeof obj === 'object') {\n    return map(objectKeys(obj), function(k) {\n      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n      if (isArray(obj[k])) {\n        return map(obj[k], function(v) {\n          return ks + encodeURIComponent(stringifyPrimitive(v));\n        }).join(sep);\n      } else {\n        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n      }\n    }).join(sep);\n\n  }\n\n  if (!name) return '';\n  return encodeURIComponent(stringifyPrimitive(name)) + eq +\n         encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n  if (xs.map) return xs.map(f);\n  var res = [];\n  for (var i = 0; i < xs.length; i++) {\n    res.push(f(xs[i], i));\n  }\n  return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n  var res = [];\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n  }\n  return res;\n};\n\n},{}],244:[function(require,module,exports){\n'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n\n},{\"./decode\":242,\"./encode\":243}],245:[function(require,module,exports){\nmodule.exports = require('./lib/_stream_duplex.js');\n\n},{\"./lib/_stream_duplex.js\":246}],246:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    keys.push(key);\n  }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Readable = require('./_stream_readable');\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n\n{\n  // avoid scope creep, the keys array can then be collected\n  var keys = objectKeys(Writable.prototype);\n  for (var v = 0; v < keys.length; v++) {\n    var method = keys[v];\n    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n  }\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false) this.readable = false;\n\n  if (options && options.writable === false) this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._writableState.highWaterMark;\n  }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended) return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n  get: function () {\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return false;\n    }\n    return this._readableState.destroyed && this._writableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._readableState.destroyed = value;\n    this._writableState.destroyed = value;\n  }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n  this.push(null);\n  this.end();\n\n  pna.nextTick(cb, err);\n};\n},{\"./_stream_readable\":248,\"./_stream_writable\":250,\"core-util-is\":155,\"inherits\":161,\"process-nextick-args\":239}],247:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};\n},{\"./_stream_transform\":249,\"core-util-is\":155,\"inherits\":161}],248:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar isArray = require('isarray');\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = require('util');\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = require('./internal/streams/BufferList');\nvar destroyImpl = require('./internal/streams/destroy');\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n  // This is a hack to make sure that our error handler is attached before any\n  // userland ones.  NEVER DO THIS. This is here only because this code needs\n  // to continue to work with older versions of Node.js that do not include\n  // the prependListener() method. The goal is to eventually remove this hack.\n  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream.\n  // These options can be provided separately as readableXXX and writableXXX.\n  var isDuplex = stream instanceof Duplex;\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var readableHwm = options.readableHighWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = Math.floor(this.highWaterMark);\n\n  // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the event 'readable'/'data' is emitted\n  // immediately, or on a later tick.  We set this to true at first, because\n  // any actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first read call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n\n  // has it been destroyed\n  this.destroyed = false;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  if (!(this instanceof Readable)) return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  if (options) {\n    if (typeof options.read === 'function') this._read = options.read;\n\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n  }\n\n  Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n  get: function () {\n    if (this._readableState === undefined) {\n      return false;\n    }\n    return this._readableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._readableState) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._readableState.destroyed = value;\n  }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n  this.push(null);\n  cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n  var skipChunkCheck;\n\n  if (!state.objectMode) {\n    if (typeof chunk === 'string') {\n      encoding = encoding || state.defaultEncoding;\n      if (encoding !== state.encoding) {\n        chunk = Buffer.from(chunk, encoding);\n        encoding = '';\n      }\n      skipChunkCheck = true;\n    }\n  } else {\n    skipChunkCheck = true;\n  }\n\n  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n  return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n  var state = stream._readableState;\n  if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else {\n    var er;\n    if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n    if (er) {\n      stream.emit('error', er);\n    } else if (state.objectMode || chunk && chunk.length > 0) {\n      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n        chunk = _uint8ArrayToBuffer(chunk);\n      }\n\n      if (addToFront) {\n        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n      } else if (state.ended) {\n        stream.emit('error', new Error('stream.push() after EOF'));\n      } else {\n        state.reading = false;\n        if (state.decoder && !encoding) {\n          chunk = state.decoder.write(chunk);\n          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n        } else {\n          addChunk(stream, state, chunk, false);\n        }\n      }\n    } else if (!addToFront) {\n      state.reading = false;\n    }\n  }\n\n  return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n  if (state.flowing && state.length === 0 && !state.sync) {\n    stream.emit('data', chunk);\n    stream.read(0);\n  } else {\n    // update the buffer info.\n    state.length += state.objectMode ? 1 : chunk.length;\n    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n    if (state.needReadable) emitReadable(stream);\n  }\n  maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n  var er;\n  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n  return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  }\n  // If we're asking for more than the current hwm, then raise the hwm.\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n;\n  // Don't have enough\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n  return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (n !== 0) state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0) state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n    // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = true;\n    n = 0;\n  } else {\n    state.length -= n;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true;\n\n    // If we tried to read() past the EOF, then emit end on the next tick.\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n\n  return ret;\n};\n\nfunction onEofChunk(stream, state) {\n  if (state.ended) return;\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    pna.nextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;else len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n  this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n  var endFn = doEnd ? onend : unpipe;\n  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable, unpipeInfo) {\n    debug('onunpipe');\n    if (readable === src) {\n      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n        unpipeInfo.hasUnpiped = true;\n        cleanup();\n      }\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  var cleanedUp = false;\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', unpipe);\n    src.removeListener('data', ondata);\n\n    cleanedUp = true;\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  // If the user pushes more data while we're writing to dest then we'll end up\n  // in ondata again. However, we only want to increase awaitDrain once because\n  // dest will only emit one 'drain' event for the multiple writes.\n  // => Introduce a guard on increasing awaitDrain.\n  var increasedAwaitDrain = false;\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    increasedAwaitDrain = false;\n    var ret = dest.write(chunk);\n    if (false === ret && !increasedAwaitDrain) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', src._readableState.awaitDrain);\n        src._readableState.awaitDrain++;\n        increasedAwaitDrain = true;\n      }\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n  }\n\n  // Make sure our error handler is attached before userland ones.\n  prependListener(dest, 'error', onerror);\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function () {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n  var unpipeInfo = { hasUnpiped: false };\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0) return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n\n    if (!dest) dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this, unpipeInfo);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this, unpipeInfo);\n    }return this;\n  }\n\n  // try to find the right one.\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this, unpipeInfo);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  if (ev === 'data') {\n    // Start flowing on next tick if stream isn't explicitly paused\n    if (this._readableState.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    var state = this._readableState;\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.emittedReadable = false;\n      if (!state.reading) {\n        pna.nextTick(nReadingNextTick, this);\n      } else if (state.length) {\n        emitReadable(this);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    pna.nextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  if (!state.reading) {\n    debug('resume read 0');\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  state.awaitDrain = 0;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n  var _this = this;\n\n  var state = this._readableState;\n  var paused = false;\n\n  stream.on('end', function () {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) _this.push(chunk);\n    }\n\n    _this.push(null);\n  });\n\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk);\n\n    // don't skip over falsy values in objectMode\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = _this.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function (method) {\n        return function () {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  }\n\n  // proxy certain important events.\n  for (var n = 0; n < kProxyEvents.length; n++) {\n    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n  }\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  this._read = function (n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._readableState.highWaterMark;\n  }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = fromListPartial(n, state.buffer, state.decoder);\n  }\n\n  return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n  var ret;\n  if (n < list.head.data.length) {\n    // slice is the same for buffers and strings\n    ret = list.head.data.slice(0, n);\n    list.head.data = list.head.data.slice(n);\n  } else if (n === list.head.data.length) {\n    // first chunk is a perfect match\n    ret = list.shift();\n  } else {\n    // result spans more than one buffer\n    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n  }\n  return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n  var p = list.head;\n  var c = 1;\n  var ret = p.data;\n  n -= ret.length;\n  while (p = p.next) {\n    var str = p.data;\n    var nb = n > str.length ? str.length : n;\n    if (nb === str.length) ret += str;else ret += str.slice(0, n);\n    n -= nb;\n    if (n === 0) {\n      if (nb === str.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = str.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n  var ret = Buffer.allocUnsafe(n);\n  var p = list.head;\n  var c = 1;\n  p.data.copy(ret);\n  n -= p.data.length;\n  while (p = p.next) {\n    var buf = p.data;\n    var nb = n > buf.length ? buf.length : n;\n    buf.copy(ret, ret.length - n, 0, nb);\n    n -= nb;\n    if (n === 0) {\n      if (nb === buf.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = buf.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    pna.nextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  // Check that we didn't get one last unshift.\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n  }\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./_stream_duplex\":246,\"./internal/streams/BufferList\":251,\"./internal/streams/destroy\":252,\"./internal/streams/stream\":253,\"_process\":240,\"core-util-is\":155,\"events\":159,\"inherits\":161,\"isarray\":163,\"process-nextick-args\":239,\"safe-buffer\":258,\"string_decoder/\":261,\"util\":151}],249:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n'use strict';\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n  var ts = this._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb) {\n    return this.emit('error', new Error('write callback called multiple times'));\n  }\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (data != null) // single equals check for both `null` and `undefined`\n    this.push(data);\n\n  cb(er);\n\n  var rs = this._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    this._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = {\n    afterTransform: afterTransform.bind(this),\n    needTransform: false,\n    transforming: false,\n    writecb: null,\n    writechunk: null,\n    writeencoding: null\n  };\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  }\n\n  // When the writable side finishes, then flush out anything remaining.\n  this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n  var _this = this;\n\n  if (typeof this._flush === 'function') {\n    this._flush(function (er, data) {\n      done(_this, er, data);\n    });\n  } else {\n    done(this, null, null);\n  }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n  var _this2 = this;\n\n  Duplex.prototype._destroy.call(this, err, function (err2) {\n    cb(err2);\n    _this2.emit('close');\n  });\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n\n  if (data != null) // single equals check for both `null` and `undefined`\n    stream.push(data);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n  return stream.push(null);\n}\n},{\"./_stream_duplex\":246,\"core-util-is\":155,\"inherits\":161}],250:[function(require,module,exports){\n(function (process,global,setImmediate){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\nmodule.exports = Writable;\n\n/* <replacement> */\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n  this.finish = function () {\n    onCorkedFinish(_this, state);\n  };\n}\n/* </replacement> */\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n  deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  options = options || {};\n\n  // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream.\n  // These options can be provided separately as readableXXX and writableXXX.\n  var isDuplex = stream instanceof Duplex;\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var writableHwm = options.writableHighWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = Math.floor(this.highWaterMark);\n\n  // if _final has been called\n  this.finalCalled = false;\n\n  // drain event flag.\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // has it been destroyed\n  this.destroyed = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null;\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n\n  // count buffered requests\n  this.bufferedRequestCount = 0;\n\n  // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function () {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n    });\n  } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function (object) {\n      if (realHasInstance.call(this, object)) return true;\n      if (this !== Writable) return false;\n\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function (object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || require('./_stream_duplex');\n\n  // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n    return new Writable(options);\n  }\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n\n    if (typeof options.writev === 'function') this._writev = options.writev;\n\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n    if (typeof options.final === 'function') this._final = options.final;\n  }\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n  this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  var er = false;\n\n  if (chunk === null) {\n    er = new TypeError('May not write null values to stream');\n  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  if (er) {\n    stream.emit('error', er);\n    pna.nextTick(cb, er);\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n  var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n  if (isBuf && !Buffer.isBuffer(chunk)) {\n    chunk = _uint8ArrayToBuffer(chunk);\n  }\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n  if (typeof cb !== 'function') cb = nop;\n\n  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = Buffer.from(chunk, encoding);\n  }\n  return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._writableState.highWaterMark;\n  }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n  if (!isBuf) {\n    var newChunk = decodeChunk(state, chunk, encoding);\n    if (chunk !== newChunk) {\n      isBuf = true;\n      encoding = 'buffer';\n      chunk = newChunk;\n    }\n  }\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = {\n      chunk: chunk,\n      encoding: encoding,\n      isBuf: isBuf,\n      callback: cb,\n      next: null\n    };\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n\n  if (sync) {\n    // defer the callback if we are being called synchronously\n    // to avoid piling up things on the stack\n    pna.nextTick(cb, er);\n    // this can emit finish, and it will always happen\n    // after error\n    pna.nextTick(finishMaybe, stream, state);\n    stream._writableState.errorEmitted = true;\n    stream.emit('error', er);\n  } else {\n    // the caller expect this to happen before if\n    // it is async\n    cb(er);\n    stream._writableState.errorEmitted = true;\n    stream.emit('error', er);\n    // this can emit finish, but finish must\n    // always follow error\n    finishMaybe(stream, state);\n  }\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state);\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      /*<replacement>*/\n      asyncWrite(afterWrite, stream, state, finished, cb);\n      /*</replacement>*/\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n\n    var count = 0;\n    var allBuffers = true;\n    while (entry) {\n      buffer[count] = entry;\n      if (!entry.isBuf) allBuffers = false;\n      entry = entry.next;\n      count += 1;\n    }\n    buffer.allBuffers = allBuffers;\n\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n    // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n    state.bufferedRequestCount = 0;\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      state.bufferedRequestCount--;\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n  stream._final(function (err) {\n    state.pendingcb--;\n    if (err) {\n      stream.emit('error', err);\n    }\n    state.prefinished = true;\n    stream.emit('prefinish');\n    finishMaybe(stream, state);\n  });\n}\nfunction prefinish(stream, state) {\n  if (!state.prefinished && !state.finalCalled) {\n    if (typeof stream._final === 'function') {\n      state.pendingcb++;\n      state.finalCalled = true;\n      pna.nextTick(callFinal, stream, state);\n    } else {\n      state.prefinished = true;\n      stream.emit('prefinish');\n    }\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n  if (need) {\n    prefinish(stream, state);\n    if (state.pendingcb === 0) {\n      state.finished = true;\n      stream.emit('finish');\n    }\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n  }\n  state.ended = true;\n  stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n  var entry = corkReq.entry;\n  corkReq.entry = null;\n  while (entry) {\n    var cb = entry.callback;\n    state.pendingcb--;\n    cb(err);\n    entry = entry.next;\n  }\n  if (state.corkedRequestsFree) {\n    state.corkedRequestsFree.next = corkReq;\n  } else {\n    state.corkedRequestsFree = corkReq;\n  }\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n  get: function () {\n    if (this._writableState === undefined) {\n      return false;\n    }\n    return this._writableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._writableState) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._writableState.destroyed = value;\n  }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n  this.end();\n  cb(err);\n};\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {},require(\"timers\").setImmediate)\n},{\"./_stream_duplex\":246,\"./internal/streams/destroy\":252,\"./internal/streams/stream\":253,\"_process\":240,\"core-util-is\":155,\"inherits\":161,\"process-nextick-args\":239,\"safe-buffer\":258,\"timers\":264,\"util-deprecate\":267}],251:[function(require,module,exports){\n'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = require('safe-buffer').Buffer;\nvar util = require('util');\n\nfunction copyBuffer(src, target, offset) {\n  src.copy(target, offset);\n}\n\nmodule.exports = function () {\n  function BufferList() {\n    _classCallCheck(this, BufferList);\n\n    this.head = null;\n    this.tail = null;\n    this.length = 0;\n  }\n\n  BufferList.prototype.push = function push(v) {\n    var entry = { data: v, next: null };\n    if (this.length > 0) this.tail.next = entry;else this.head = entry;\n    this.tail = entry;\n    ++this.length;\n  };\n\n  BufferList.prototype.unshift = function unshift(v) {\n    var entry = { data: v, next: this.head };\n    if (this.length === 0) this.tail = entry;\n    this.head = entry;\n    ++this.length;\n  };\n\n  BufferList.prototype.shift = function shift() {\n    if (this.length === 0) return;\n    var ret = this.head.data;\n    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n    --this.length;\n    return ret;\n  };\n\n  BufferList.prototype.clear = function clear() {\n    this.head = this.tail = null;\n    this.length = 0;\n  };\n\n  BufferList.prototype.join = function join(s) {\n    if (this.length === 0) return '';\n    var p = this.head;\n    var ret = '' + p.data;\n    while (p = p.next) {\n      ret += s + p.data;\n    }return ret;\n  };\n\n  BufferList.prototype.concat = function concat(n) {\n    if (this.length === 0) return Buffer.alloc(0);\n    if (this.length === 1) return this.head.data;\n    var ret = Buffer.allocUnsafe(n >>> 0);\n    var p = this.head;\n    var i = 0;\n    while (p) {\n      copyBuffer(p.data, ret, i);\n      i += p.data.length;\n      p = p.next;\n    }\n    return ret;\n  };\n\n  return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n  module.exports.prototype[util.inspect.custom] = function () {\n    var obj = util.inspect({ length: this.length });\n    return this.constructor.name + ' ' + obj;\n  };\n}\n},{\"safe-buffer\":258,\"util\":151}],252:[function(require,module,exports){\n'use strict';\n\n/*<replacement>*/\n\nvar pna = require('process-nextick-args');\n/*</replacement>*/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n  var _this = this;\n\n  var readableDestroyed = this._readableState && this._readableState.destroyed;\n  var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n  if (readableDestroyed || writableDestroyed) {\n    if (cb) {\n      cb(err);\n    } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {\n      pna.nextTick(emitErrorNT, this, err);\n    }\n    return this;\n  }\n\n  // we set destroyed to true before firing error callbacks in order\n  // to make it re-entrance safe in case destroy() is called within callbacks\n\n  if (this._readableState) {\n    this._readableState.destroyed = true;\n  }\n\n  // if this is a duplex stream mark the writable part as destroyed as well\n  if (this._writableState) {\n    this._writableState.destroyed = true;\n  }\n\n  this._destroy(err || null, function (err) {\n    if (!cb && err) {\n      pna.nextTick(emitErrorNT, _this, err);\n      if (_this._writableState) {\n        _this._writableState.errorEmitted = true;\n      }\n    } else if (cb) {\n      cb(err);\n    }\n  });\n\n  return this;\n}\n\nfunction undestroy() {\n  if (this._readableState) {\n    this._readableState.destroyed = false;\n    this._readableState.reading = false;\n    this._readableState.ended = false;\n    this._readableState.endEmitted = false;\n  }\n\n  if (this._writableState) {\n    this._writableState.destroyed = false;\n    this._writableState.ended = false;\n    this._writableState.ending = false;\n    this._writableState.finished = false;\n    this._writableState.errorEmitted = false;\n  }\n}\n\nfunction emitErrorNT(self, err) {\n  self.emit('error', err);\n}\n\nmodule.exports = {\n  destroy: destroy,\n  undestroy: undestroy\n};\n},{\"process-nextick-args\":239}],253:[function(require,module,exports){\nmodule.exports = require('events').EventEmitter;\n\n},{\"events\":159}],254:[function(require,module,exports){\nmodule.exports = require('./readable').PassThrough\n\n},{\"./readable\":255}],255:[function(require,module,exports){\nexports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = exports;\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');\n\n},{\"./lib/_stream_duplex.js\":246,\"./lib/_stream_passthrough.js\":247,\"./lib/_stream_readable.js\":248,\"./lib/_stream_transform.js\":249,\"./lib/_stream_writable.js\":250}],256:[function(require,module,exports){\nmodule.exports = require('./readable').Transform\n\n},{\"./readable\":255}],257:[function(require,module,exports){\nmodule.exports = require('./lib/_stream_writable.js');\n\n},{\"./lib/_stream_writable.js\":250}],258:[function(require,module,exports){\n/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n\n},{\"buffer\":154}],259:[function(require,module,exports){\n(function (Buffer){\n;(function (sax) { // wrapper for non-node envs\n  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n  sax.SAXParser = SAXParser\n  sax.SAXStream = SAXStream\n  sax.createStream = createStream\n\n  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n  // since that's the earliest that a buffer overrun could occur.  This way, checks are\n  // as rare as required, but as often as necessary to ensure never crossing this bound.\n  // Furthermore, buffers are only tested at most once per write(), so passing a very\n  // large string into write() might have undesirable effects, but this is manageable by\n  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme\n  // edge case, result in creating at most one complete copy of the string passed in.\n  // Set to Infinity to have unlimited buffers.\n  sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n  var buffers = [\n    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n    'procInstName', 'procInstBody', 'entity', 'attribName',\n    'attribValue', 'cdata', 'script'\n  ]\n\n  sax.EVENTS = [\n    'text',\n    'processinginstruction',\n    'sgmldeclaration',\n    'doctype',\n    'comment',\n    'opentagstart',\n    'attribute',\n    'opentag',\n    'closetag',\n    'opencdata',\n    'cdata',\n    'closecdata',\n    'error',\n    'end',\n    'ready',\n    'script',\n    'opennamespace',\n    'closenamespace'\n  ]\n\n  function SAXParser (strict, opt) {\n    if (!(this instanceof SAXParser)) {\n      return new SAXParser(strict, opt)\n    }\n\n    var parser = this\n    clearBuffers(parser)\n    parser.q = parser.c = ''\n    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n    parser.opt = opt || {}\n    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n    parser.tags = []\n    parser.closed = parser.closedRoot = parser.sawRoot = false\n    parser.tag = parser.error = null\n    parser.strict = !!strict\n    parser.noscript = !!(strict || parser.opt.noscript)\n    parser.state = S.BEGIN\n    parser.strictEntities = parser.opt.strictEntities\n    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n    parser.attribList = []\n\n    // namespaces form a prototype chain.\n    // it always points at the current tag,\n    // which protos to its parent tag.\n    if (parser.opt.xmlns) {\n      parser.ns = Object.create(rootNS)\n    }\n\n    // mostly just for error reporting\n    parser.trackPosition = parser.opt.position !== false\n    if (parser.trackPosition) {\n      parser.position = parser.line = parser.column = 0\n    }\n    emit(parser, 'onready')\n  }\n\n  if (!Object.create) {\n    Object.create = function (o) {\n      function F () {}\n      F.prototype = o\n      var newf = new F()\n      return newf\n    }\n  }\n\n  if (!Object.keys) {\n    Object.keys = function (o) {\n      var a = []\n      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n      return a\n    }\n  }\n\n  function checkBufferLength (parser) {\n    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n    var maxActual = 0\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      var len = parser[buffers[i]].length\n      if (len > maxAllowed) {\n        // Text/cdata nodes can get big, and since they're buffered,\n        // we can get here under normal conditions.\n        // Avoid issues by emitting the text node now,\n        // so at least it won't get any bigger.\n        switch (buffers[i]) {\n          case 'textNode':\n            closeText(parser)\n            break\n\n          case 'cdata':\n            emitNode(parser, 'oncdata', parser.cdata)\n            parser.cdata = ''\n            break\n\n          case 'script':\n            emitNode(parser, 'onscript', parser.script)\n            parser.script = ''\n            break\n\n          default:\n            error(parser, 'Max buffer length exceeded: ' + buffers[i])\n        }\n      }\n      maxActual = Math.max(maxActual, len)\n    }\n    // schedule the next check for the earliest possible buffer overrun.\n    var m = sax.MAX_BUFFER_LENGTH - maxActual\n    parser.bufferCheckPosition = m + parser.position\n  }\n\n  function clearBuffers (parser) {\n    for (var i = 0, l = buffers.length; i < l; i++) {\n      parser[buffers[i]] = ''\n    }\n  }\n\n  function flushBuffers (parser) {\n    closeText(parser)\n    if (parser.cdata !== '') {\n      emitNode(parser, 'oncdata', parser.cdata)\n      parser.cdata = ''\n    }\n    if (parser.script !== '') {\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n  }\n\n  SAXParser.prototype = {\n    end: function () { end(this) },\n    write: write,\n    resume: function () { this.error = null; return this },\n    close: function () { return this.write(null) },\n    flush: function () { flushBuffers(this) }\n  }\n\n  var Stream\n  try {\n    Stream = require('stream').Stream\n  } catch (ex) {\n    Stream = function () {}\n  }\n\n  var streamWraps = sax.EVENTS.filter(function (ev) {\n    return ev !== 'error' && ev !== 'end'\n  })\n\n  function createStream (strict, opt) {\n    return new SAXStream(strict, opt)\n  }\n\n  function SAXStream (strict, opt) {\n    if (!(this instanceof SAXStream)) {\n      return new SAXStream(strict, opt)\n    }\n\n    Stream.apply(this)\n\n    this._parser = new SAXParser(strict, opt)\n    this.writable = true\n    this.readable = true\n\n    var me = this\n\n    this._parser.onend = function () {\n      me.emit('end')\n    }\n\n    this._parser.onerror = function (er) {\n      me.emit('error', er)\n\n      // if didn't throw, then means error was handled.\n      // go ahead and clear error, so we can write again.\n      me._parser.error = null\n    }\n\n    this._decoder = null\n\n    streamWraps.forEach(function (ev) {\n      Object.defineProperty(me, 'on' + ev, {\n        get: function () {\n          return me._parser['on' + ev]\n        },\n        set: function (h) {\n          if (!h) {\n            me.removeAllListeners(ev)\n            me._parser['on' + ev] = h\n            return h\n          }\n          me.on(ev, h)\n        },\n        enumerable: true,\n        configurable: false\n      })\n    })\n  }\n\n  SAXStream.prototype = Object.create(Stream.prototype, {\n    constructor: {\n      value: SAXStream\n    }\n  })\n\n  SAXStream.prototype.write = function (data) {\n    if (typeof Buffer === 'function' &&\n      typeof Buffer.isBuffer === 'function' &&\n      Buffer.isBuffer(data)) {\n      if (!this._decoder) {\n        var SD = require('string_decoder').StringDecoder\n        this._decoder = new SD('utf8')\n      }\n      data = this._decoder.write(data)\n    }\n\n    this._parser.write(data.toString())\n    this.emit('data', data)\n    return true\n  }\n\n  SAXStream.prototype.end = function (chunk) {\n    if (chunk && chunk.length) {\n      this.write(chunk)\n    }\n    this._parser.end()\n    return true\n  }\n\n  SAXStream.prototype.on = function (ev, handler) {\n    var me = this\n    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n      me._parser['on' + ev] = function () {\n        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n        args.splice(0, 0, ev)\n        me.emit.apply(me, args)\n      }\n    }\n\n    return Stream.prototype.on.call(me, ev, handler)\n  }\n\n  // this really needs to be replaced with character classes.\n  // XML allows all manner of ridiculous numbers and digits.\n  var CDATA = '[CDATA['\n  var DOCTYPE = 'DOCTYPE'\n  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n  // This implementation works on strings, a single character at a time\n  // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n  // without a significant breaking change to either this  parser, or the\n  // JavaScript language.  Implementation of an emoji-capable xml parser\n  // is left as an exercise for the reader.\n  var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n  var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n  var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n  var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n  function isWhitespace (c) {\n    return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n  }\n\n  function isQuote (c) {\n    return c === '\"' || c === '\\''\n  }\n\n  function isAttribEnd (c) {\n    return c === '>' || isWhitespace(c)\n  }\n\n  function isMatch (regex, c) {\n    return regex.test(c)\n  }\n\n  function notMatch (regex, c) {\n    return !isMatch(regex, c)\n  }\n\n  var S = 0\n  sax.STATE = {\n    BEGIN: S++, // leading byte order mark or whitespace\n    BEGIN_WHITESPACE: S++, // leading whitespace\n    TEXT: S++, // general stuff\n    TEXT_ENTITY: S++, // &amp and such.\n    OPEN_WAKA: S++, // <\n    SGML_DECL: S++, // <!BLARG\n    SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n    DOCTYPE: S++, // <!DOCTYPE\n    DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n    DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n    COMMENT_STARTING: S++, // <!-\n    COMMENT: S++, // <!--\n    COMMENT_ENDING: S++, // <!-- blah -\n    COMMENT_ENDED: S++, // <!-- blah --\n    CDATA: S++, // <![CDATA[ something\n    CDATA_ENDING: S++, // ]\n    CDATA_ENDING_2: S++, // ]]\n    PROC_INST: S++, // <?hi\n    PROC_INST_BODY: S++, // <?hi there\n    PROC_INST_ENDING: S++, // <?hi \"there\" ?\n    OPEN_TAG: S++, // <strong\n    OPEN_TAG_SLASH: S++, // <strong /\n    ATTRIB: S++, // <a\n    ATTRIB_NAME: S++, // <a foo\n    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n    ATTRIB_VALUE: S++, // <a foo=\n    ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n    ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\"&quot;\"\n    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot\n    CLOSE_TAG: S++, // </a\n    CLOSE_TAG_SAW_WHITE: S++, // </a   >\n    SCRIPT: S++, // <script> ...\n    SCRIPT_ENDING: S++ // <script> ... <\n  }\n\n  sax.XML_ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\"\n  }\n\n  sax.ENTITIES = {\n    'amp': '&',\n    'gt': '>',\n    'lt': '<',\n    'quot': '\"',\n    'apos': \"'\",\n    'AElig': 198,\n    'Aacute': 193,\n    'Acirc': 194,\n    'Agrave': 192,\n    'Aring': 197,\n    'Atilde': 195,\n    'Auml': 196,\n    'Ccedil': 199,\n    'ETH': 208,\n    'Eacute': 201,\n    'Ecirc': 202,\n    'Egrave': 200,\n    'Euml': 203,\n    'Iacute': 205,\n    'Icirc': 206,\n    'Igrave': 204,\n    'Iuml': 207,\n    'Ntilde': 209,\n    'Oacute': 211,\n    'Ocirc': 212,\n    'Ograve': 210,\n    'Oslash': 216,\n    'Otilde': 213,\n    'Ouml': 214,\n    'THORN': 222,\n    'Uacute': 218,\n    'Ucirc': 219,\n    'Ugrave': 217,\n    'Uuml': 220,\n    'Yacute': 221,\n    'aacute': 225,\n    'acirc': 226,\n    'aelig': 230,\n    'agrave': 224,\n    'aring': 229,\n    'atilde': 227,\n    'auml': 228,\n    'ccedil': 231,\n    'eacute': 233,\n    'ecirc': 234,\n    'egrave': 232,\n    'eth': 240,\n    'euml': 235,\n    'iacute': 237,\n    'icirc': 238,\n    'igrave': 236,\n    'iuml': 239,\n    'ntilde': 241,\n    'oacute': 243,\n    'ocirc': 244,\n    'ograve': 242,\n    'oslash': 248,\n    'otilde': 245,\n    'ouml': 246,\n    'szlig': 223,\n    'thorn': 254,\n    'uacute': 250,\n    'ucirc': 251,\n    'ugrave': 249,\n    'uuml': 252,\n    'yacute': 253,\n    'yuml': 255,\n    'copy': 169,\n    'reg': 174,\n    'nbsp': 160,\n    'iexcl': 161,\n    'cent': 162,\n    'pound': 163,\n    'curren': 164,\n    'yen': 165,\n    'brvbar': 166,\n    'sect': 167,\n    'uml': 168,\n    'ordf': 170,\n    'laquo': 171,\n    'not': 172,\n    'shy': 173,\n    'macr': 175,\n    'deg': 176,\n    'plusmn': 177,\n    'sup1': 185,\n    'sup2': 178,\n    'sup3': 179,\n    'acute': 180,\n    'micro': 181,\n    'para': 182,\n    'middot': 183,\n    'cedil': 184,\n    'ordm': 186,\n    'raquo': 187,\n    'frac14': 188,\n    'frac12': 189,\n    'frac34': 190,\n    'iquest': 191,\n    'times': 215,\n    'divide': 247,\n    'OElig': 338,\n    'oelig': 339,\n    'Scaron': 352,\n    'scaron': 353,\n    'Yuml': 376,\n    'fnof': 402,\n    'circ': 710,\n    'tilde': 732,\n    'Alpha': 913,\n    'Beta': 914,\n    'Gamma': 915,\n    'Delta': 916,\n    'Epsilon': 917,\n    'Zeta': 918,\n    'Eta': 919,\n    'Theta': 920,\n    'Iota': 921,\n    'Kappa': 922,\n    'Lambda': 923,\n    'Mu': 924,\n    'Nu': 925,\n    'Xi': 926,\n    'Omicron': 927,\n    'Pi': 928,\n    'Rho': 929,\n    'Sigma': 931,\n    'Tau': 932,\n    'Upsilon': 933,\n    'Phi': 934,\n    'Chi': 935,\n    'Psi': 936,\n    'Omega': 937,\n    'alpha': 945,\n    'beta': 946,\n    'gamma': 947,\n    'delta': 948,\n    'epsilon': 949,\n    'zeta': 950,\n    'eta': 951,\n    'theta': 952,\n    'iota': 953,\n    'kappa': 954,\n    'lambda': 955,\n    'mu': 956,\n    'nu': 957,\n    'xi': 958,\n    'omicron': 959,\n    'pi': 960,\n    'rho': 961,\n    'sigmaf': 962,\n    'sigma': 963,\n    'tau': 964,\n    'upsilon': 965,\n    'phi': 966,\n    'chi': 967,\n    'psi': 968,\n    'omega': 969,\n    'thetasym': 977,\n    'upsih': 978,\n    'piv': 982,\n    'ensp': 8194,\n    'emsp': 8195,\n    'thinsp': 8201,\n    'zwnj': 8204,\n    'zwj': 8205,\n    'lrm': 8206,\n    'rlm': 8207,\n    'ndash': 8211,\n    'mdash': 8212,\n    'lsquo': 8216,\n    'rsquo': 8217,\n    'sbquo': 8218,\n    'ldquo': 8220,\n    'rdquo': 8221,\n    'bdquo': 8222,\n    'dagger': 8224,\n    'Dagger': 8225,\n    'bull': 8226,\n    'hellip': 8230,\n    'permil': 8240,\n    'prime': 8242,\n    'Prime': 8243,\n    'lsaquo': 8249,\n    'rsaquo': 8250,\n    'oline': 8254,\n    'frasl': 8260,\n    'euro': 8364,\n    'image': 8465,\n    'weierp': 8472,\n    'real': 8476,\n    'trade': 8482,\n    'alefsym': 8501,\n    'larr': 8592,\n    'uarr': 8593,\n    'rarr': 8594,\n    'darr': 8595,\n    'harr': 8596,\n    'crarr': 8629,\n    'lArr': 8656,\n    'uArr': 8657,\n    'rArr': 8658,\n    'dArr': 8659,\n    'hArr': 8660,\n    'forall': 8704,\n    'part': 8706,\n    'exist': 8707,\n    'empty': 8709,\n    'nabla': 8711,\n    'isin': 8712,\n    'notin': 8713,\n    'ni': 8715,\n    'prod': 8719,\n    'sum': 8721,\n    'minus': 8722,\n    'lowast': 8727,\n    'radic': 8730,\n    'prop': 8733,\n    'infin': 8734,\n    'ang': 8736,\n    'and': 8743,\n    'or': 8744,\n    'cap': 8745,\n    'cup': 8746,\n    'int': 8747,\n    'there4': 8756,\n    'sim': 8764,\n    'cong': 8773,\n    'asymp': 8776,\n    'ne': 8800,\n    'equiv': 8801,\n    'le': 8804,\n    'ge': 8805,\n    'sub': 8834,\n    'sup': 8835,\n    'nsub': 8836,\n    'sube': 8838,\n    'supe': 8839,\n    'oplus': 8853,\n    'otimes': 8855,\n    'perp': 8869,\n    'sdot': 8901,\n    'lceil': 8968,\n    'rceil': 8969,\n    'lfloor': 8970,\n    'rfloor': 8971,\n    'lang': 9001,\n    'rang': 9002,\n    'loz': 9674,\n    'spades': 9824,\n    'clubs': 9827,\n    'hearts': 9829,\n    'diams': 9830\n  }\n\n  Object.keys(sax.ENTITIES).forEach(function (key) {\n    var e = sax.ENTITIES[key]\n    var s = typeof e === 'number' ? String.fromCharCode(e) : e\n    sax.ENTITIES[key] = s\n  })\n\n  for (var s in sax.STATE) {\n    sax.STATE[sax.STATE[s]] = s\n  }\n\n  // shorthand\n  S = sax.STATE\n\n  function emit (parser, event, data) {\n    parser[event] && parser[event](data)\n  }\n\n  function emitNode (parser, nodeType, data) {\n    if (parser.textNode) closeText(parser)\n    emit(parser, nodeType, data)\n  }\n\n  function closeText (parser) {\n    parser.textNode = textopts(parser.opt, parser.textNode)\n    if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n    parser.textNode = ''\n  }\n\n  function textopts (opt, text) {\n    if (opt.trim) text = text.trim()\n    if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n    return text\n  }\n\n  function error (parser, er) {\n    closeText(parser)\n    if (parser.trackPosition) {\n      er += '\\nLine: ' + parser.line +\n        '\\nColumn: ' + parser.column +\n        '\\nChar: ' + parser.c\n    }\n    er = new Error(er)\n    parser.error = er\n    emit(parser, 'onerror', er)\n    return parser\n  }\n\n  function end (parser) {\n    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n    if ((parser.state !== S.BEGIN) &&\n      (parser.state !== S.BEGIN_WHITESPACE) &&\n      (parser.state !== S.TEXT)) {\n      error(parser, 'Unexpected end')\n    }\n    closeText(parser)\n    parser.c = ''\n    parser.closed = true\n    emit(parser, 'onend')\n    SAXParser.call(parser, parser.strict, parser.opt)\n    return parser\n  }\n\n  function strictFail (parser, message) {\n    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n      throw new Error('bad call to strictFail')\n    }\n    if (parser.strict) {\n      error(parser, message)\n    }\n  }\n\n  function newTag (parser) {\n    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n    var parent = parser.tags[parser.tags.length - 1] || parser\n    var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n    // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n    if (parser.opt.xmlns) {\n      tag.ns = parent.ns\n    }\n    parser.attribList.length = 0\n    emitNode(parser, 'onopentagstart', tag)\n  }\n\n  function qname (name, attribute) {\n    var i = name.indexOf(':')\n    var qualName = i < 0 ? [ '', name ] : name.split(':')\n    var prefix = qualName[0]\n    var local = qualName[1]\n\n    // <x \"xmlns\"=\"http://foo\">\n    if (attribute && name === 'xmlns') {\n      prefix = 'xmlns'\n      local = ''\n    }\n\n    return { prefix: prefix, local: local }\n  }\n\n  function attrib (parser) {\n    if (!parser.strict) {\n      parser.attribName = parser.attribName[parser.looseCase]()\n    }\n\n    if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n      parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n      parser.attribName = parser.attribValue = ''\n      return\n    }\n\n    if (parser.opt.xmlns) {\n      var qn = qname(parser.attribName, true)\n      var prefix = qn.prefix\n      var local = qn.local\n\n      if (prefix === 'xmlns') {\n        // namespace binding attribute. push the binding into scope\n        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n          strictFail(parser,\n            'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n          strictFail(parser,\n            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n            'Actual: ' + parser.attribValue)\n        } else {\n          var tag = parser.tag\n          var parent = parser.tags[parser.tags.length - 1] || parser\n          if (tag.ns === parent.ns) {\n            tag.ns = Object.create(parent.ns)\n          }\n          tag.ns[local] = parser.attribValue\n        }\n      }\n\n      // defer onattribute events until all attributes have been seen\n      // so any new bindings can take effect. preserve attribute order\n      // so deferred events can be emitted in document order\n      parser.attribList.push([parser.attribName, parser.attribValue])\n    } else {\n      // in non-xmlns mode, we can emit the event right away\n      parser.tag.attributes[parser.attribName] = parser.attribValue\n      emitNode(parser, 'onattribute', {\n        name: parser.attribName,\n        value: parser.attribValue\n      })\n    }\n\n    parser.attribName = parser.attribValue = ''\n  }\n\n  function openTag (parser, selfClosing) {\n    if (parser.opt.xmlns) {\n      // emit namespace binding events\n      var tag = parser.tag\n\n      // add namespace info to tag\n      var qn = qname(parser.tagName)\n      tag.prefix = qn.prefix\n      tag.local = qn.local\n      tag.uri = tag.ns[qn.prefix] || ''\n\n      if (tag.prefix && !tag.uri) {\n        strictFail(parser, 'Unbound namespace prefix: ' +\n          JSON.stringify(parser.tagName))\n        tag.uri = qn.prefix\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (tag.ns && parent.ns !== tag.ns) {\n        Object.keys(tag.ns).forEach(function (p) {\n          emitNode(parser, 'onopennamespace', {\n            prefix: p,\n            uri: tag.ns[p]\n          })\n        })\n      }\n\n      // handle deferred onattribute events\n      // Note: do not apply default ns to attributes:\n      //   http://www.w3.org/TR/REC-xml-names/#defaulting\n      for (var i = 0, l = parser.attribList.length; i < l; i++) {\n        var nv = parser.attribList[i]\n        var name = nv[0]\n        var value = nv[1]\n        var qualName = qname(name, true)\n        var prefix = qualName.prefix\n        var local = qualName.local\n        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n        var a = {\n          name: name,\n          value: value,\n          prefix: prefix,\n          local: local,\n          uri: uri\n        }\n\n        // if there's any attributes with an undefined namespace,\n        // then fail on them now.\n        if (prefix && prefix !== 'xmlns' && !uri) {\n          strictFail(parser, 'Unbound namespace prefix: ' +\n            JSON.stringify(prefix))\n          a.uri = prefix\n        }\n        parser.tag.attributes[name] = a\n        emitNode(parser, 'onattribute', a)\n      }\n      parser.attribList.length = 0\n    }\n\n    parser.tag.isSelfClosing = !!selfClosing\n\n    // process the tag\n    parser.sawRoot = true\n    parser.tags.push(parser.tag)\n    emitNode(parser, 'onopentag', parser.tag)\n    if (!selfClosing) {\n      // special case for <script> in non-strict mode.\n      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n        parser.state = S.SCRIPT\n      } else {\n        parser.state = S.TEXT\n      }\n      parser.tag = null\n      parser.tagName = ''\n    }\n    parser.attribName = parser.attribValue = ''\n    parser.attribList.length = 0\n  }\n\n  function closeTag (parser) {\n    if (!parser.tagName) {\n      strictFail(parser, 'Weird empty close tag.')\n      parser.textNode += '</>'\n      parser.state = S.TEXT\n      return\n    }\n\n    if (parser.script) {\n      if (parser.tagName !== 'script') {\n        parser.script += '</' + parser.tagName + '>'\n        parser.tagName = ''\n        parser.state = S.SCRIPT\n        return\n      }\n      emitNode(parser, 'onscript', parser.script)\n      parser.script = ''\n    }\n\n    // first make sure that the closing tag actually exists.\n    // <a><b></c></b></a> will close everything, otherwise.\n    var t = parser.tags.length\n    var tagName = parser.tagName\n    if (!parser.strict) {\n      tagName = tagName[parser.looseCase]()\n    }\n    var closeTo = tagName\n    while (t--) {\n      var close = parser.tags[t]\n      if (close.name !== closeTo) {\n        // fail the first time in strict mode\n        strictFail(parser, 'Unexpected close tag')\n      } else {\n        break\n      }\n    }\n\n    // didn't find it.  we already failed for strict, so just abort.\n    if (t < 0) {\n      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n      parser.textNode += '</' + parser.tagName + '>'\n      parser.state = S.TEXT\n      return\n    }\n    parser.tagName = tagName\n    var s = parser.tags.length\n    while (s-- > t) {\n      var tag = parser.tag = parser.tags.pop()\n      parser.tagName = parser.tag.name\n      emitNode(parser, 'onclosetag', parser.tagName)\n\n      var x = {}\n      for (var i in tag.ns) {\n        x[i] = tag.ns[i]\n      }\n\n      var parent = parser.tags[parser.tags.length - 1] || parser\n      if (parser.opt.xmlns && tag.ns !== parent.ns) {\n        // remove namespace bindings introduced by tag\n        Object.keys(tag.ns).forEach(function (p) {\n          var n = tag.ns[p]\n          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n        })\n      }\n    }\n    if (t === 0) parser.closedRoot = true\n    parser.tagName = parser.attribValue = parser.attribName = ''\n    parser.attribList.length = 0\n    parser.state = S.TEXT\n  }\n\n  function parseEntity (parser) {\n    var entity = parser.entity\n    var entityLC = entity.toLowerCase()\n    var num\n    var numStr = ''\n\n    if (parser.ENTITIES[entity]) {\n      return parser.ENTITIES[entity]\n    }\n    if (parser.ENTITIES[entityLC]) {\n      return parser.ENTITIES[entityLC]\n    }\n    entity = entityLC\n    if (entity.charAt(0) === '#') {\n      if (entity.charAt(1) === 'x') {\n        entity = entity.slice(2)\n        num = parseInt(entity, 16)\n        numStr = num.toString(16)\n      } else {\n        entity = entity.slice(1)\n        num = parseInt(entity, 10)\n        numStr = num.toString(10)\n      }\n    }\n    entity = entity.replace(/^0+/, '')\n    if (isNaN(num) || numStr.toLowerCase() !== entity) {\n      strictFail(parser, 'Invalid character entity')\n      return '&' + parser.entity + ';'\n    }\n\n    return String.fromCodePoint(num)\n  }\n\n  function beginWhiteSpace (parser, c) {\n    if (c === '<') {\n      parser.state = S.OPEN_WAKA\n      parser.startTagPosition = parser.position\n    } else if (!isWhitespace(c)) {\n      // have to process this as a text node.\n      // weird, but happens.\n      strictFail(parser, 'Non-whitespace before first tag.')\n      parser.textNode = c\n      parser.state = S.TEXT\n    }\n  }\n\n  function charAt (chunk, i) {\n    var result = ''\n    if (i < chunk.length) {\n      result = chunk.charAt(i)\n    }\n    return result\n  }\n\n  function write (chunk) {\n    var parser = this\n    if (this.error) {\n      throw this.error\n    }\n    if (parser.closed) {\n      return error(parser,\n        'Cannot write after close. Assign an onready handler.')\n    }\n    if (chunk === null) {\n      return end(parser)\n    }\n    if (typeof chunk === 'object') {\n      chunk = chunk.toString()\n    }\n    var i = 0\n    var c = ''\n    while (true) {\n      c = charAt(chunk, i++)\n      parser.c = c\n\n      if (!c) {\n        break\n      }\n\n      if (parser.trackPosition) {\n        parser.position++\n        if (c === '\\n') {\n          parser.line++\n          parser.column = 0\n        } else {\n          parser.column++\n        }\n      }\n\n      switch (parser.state) {\n        case S.BEGIN:\n          parser.state = S.BEGIN_WHITESPACE\n          if (c === '\\uFEFF') {\n            continue\n          }\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.BEGIN_WHITESPACE:\n          beginWhiteSpace(parser, c)\n          continue\n\n        case S.TEXT:\n          if (parser.sawRoot && !parser.closedRoot) {\n            var starti = i - 1\n            while (c && c !== '<' && c !== '&') {\n              c = charAt(chunk, i++)\n              if (c && parser.trackPosition) {\n                parser.position++\n                if (c === '\\n') {\n                  parser.line++\n                  parser.column = 0\n                } else {\n                  parser.column++\n                }\n              }\n            }\n            parser.textNode += chunk.substring(starti, i - 1)\n          }\n          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n            parser.state = S.OPEN_WAKA\n            parser.startTagPosition = parser.position\n          } else {\n            if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {\n              strictFail(parser, 'Text data outside of root node.')\n            }\n            if (c === '&') {\n              parser.state = S.TEXT_ENTITY\n            } else {\n              parser.textNode += c\n            }\n          }\n          continue\n\n        case S.SCRIPT:\n          // only non-strict\n          if (c === '<') {\n            parser.state = S.SCRIPT_ENDING\n          } else {\n            parser.script += c\n          }\n          continue\n\n        case S.SCRIPT_ENDING:\n          if (c === '/') {\n            parser.state = S.CLOSE_TAG\n          } else {\n            parser.script += '<' + c\n            parser.state = S.SCRIPT\n          }\n          continue\n\n        case S.OPEN_WAKA:\n          // either a /, ?, !, or text is coming next.\n          if (c === '!') {\n            parser.state = S.SGML_DECL\n            parser.sgmlDecl = ''\n          } else if (isWhitespace(c)) {\n            // wait for it...\n          } else if (isMatch(nameStart, c)) {\n            parser.state = S.OPEN_TAG\n            parser.tagName = c\n          } else if (c === '/') {\n            parser.state = S.CLOSE_TAG\n            parser.tagName = ''\n          } else if (c === '?') {\n            parser.state = S.PROC_INST\n            parser.procInstName = parser.procInstBody = ''\n          } else {\n            strictFail(parser, 'Unencoded <')\n            // if there was some whitespace, then add that in.\n            if (parser.startTagPosition + 1 < parser.position) {\n              var pad = parser.position - parser.startTagPosition\n              c = new Array(pad).join(' ') + c\n            }\n            parser.textNode += '<' + c\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.SGML_DECL:\n          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n            emitNode(parser, 'onopencdata')\n            parser.state = S.CDATA\n            parser.sgmlDecl = ''\n            parser.cdata = ''\n          } else if (parser.sgmlDecl + c === '--') {\n            parser.state = S.COMMENT\n            parser.comment = ''\n            parser.sgmlDecl = ''\n          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n            parser.state = S.DOCTYPE\n            if (parser.doctype || parser.sawRoot) {\n              strictFail(parser,\n                'Inappropriately located doctype declaration')\n            }\n            parser.doctype = ''\n            parser.sgmlDecl = ''\n          } else if (c === '>') {\n            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n            parser.sgmlDecl = ''\n            parser.state = S.TEXT\n          } else if (isQuote(c)) {\n            parser.state = S.SGML_DECL_QUOTED\n            parser.sgmlDecl += c\n          } else {\n            parser.sgmlDecl += c\n          }\n          continue\n\n        case S.SGML_DECL_QUOTED:\n          if (c === parser.q) {\n            parser.state = S.SGML_DECL\n            parser.q = ''\n          }\n          parser.sgmlDecl += c\n          continue\n\n        case S.DOCTYPE:\n          if (c === '>') {\n            parser.state = S.TEXT\n            emitNode(parser, 'ondoctype', parser.doctype)\n            parser.doctype = true // just remember that we saw it.\n          } else {\n            parser.doctype += c\n            if (c === '[') {\n              parser.state = S.DOCTYPE_DTD\n            } else if (isQuote(c)) {\n              parser.state = S.DOCTYPE_QUOTED\n              parser.q = c\n            }\n          }\n          continue\n\n        case S.DOCTYPE_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.q = ''\n            parser.state = S.DOCTYPE\n          }\n          continue\n\n        case S.DOCTYPE_DTD:\n          parser.doctype += c\n          if (c === ']') {\n            parser.state = S.DOCTYPE\n          } else if (isQuote(c)) {\n            parser.state = S.DOCTYPE_DTD_QUOTED\n            parser.q = c\n          }\n          continue\n\n        case S.DOCTYPE_DTD_QUOTED:\n          parser.doctype += c\n          if (c === parser.q) {\n            parser.state = S.DOCTYPE_DTD\n            parser.q = ''\n          }\n          continue\n\n        case S.COMMENT:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDING\n          } else {\n            parser.comment += c\n          }\n          continue\n\n        case S.COMMENT_ENDING:\n          if (c === '-') {\n            parser.state = S.COMMENT_ENDED\n            parser.comment = textopts(parser.opt, parser.comment)\n            if (parser.comment) {\n              emitNode(parser, 'oncomment', parser.comment)\n            }\n            parser.comment = ''\n          } else {\n            parser.comment += '-' + c\n            parser.state = S.COMMENT\n          }\n          continue\n\n        case S.COMMENT_ENDED:\n          if (c !== '>') {\n            strictFail(parser, 'Malformed comment')\n            // allow <!-- blah -- bloo --> in non-strict mode,\n            // which is a comment of \" blah -- bloo \"\n            parser.comment += '--' + c\n            parser.state = S.COMMENT\n          } else {\n            parser.state = S.TEXT\n          }\n          continue\n\n        case S.CDATA:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING\n          } else {\n            parser.cdata += c\n          }\n          continue\n\n        case S.CDATA_ENDING:\n          if (c === ']') {\n            parser.state = S.CDATA_ENDING_2\n          } else {\n            parser.cdata += ']' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.CDATA_ENDING_2:\n          if (c === '>') {\n            if (parser.cdata) {\n              emitNode(parser, 'oncdata', parser.cdata)\n            }\n            emitNode(parser, 'onclosecdata')\n            parser.cdata = ''\n            parser.state = S.TEXT\n          } else if (c === ']') {\n            parser.cdata += ']'\n          } else {\n            parser.cdata += ']]' + c\n            parser.state = S.CDATA\n          }\n          continue\n\n        case S.PROC_INST:\n          if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else if (isWhitespace(c)) {\n            parser.state = S.PROC_INST_BODY\n          } else {\n            parser.procInstName += c\n          }\n          continue\n\n        case S.PROC_INST_BODY:\n          if (!parser.procInstBody && isWhitespace(c)) {\n            continue\n          } else if (c === '?') {\n            parser.state = S.PROC_INST_ENDING\n          } else {\n            parser.procInstBody += c\n          }\n          continue\n\n        case S.PROC_INST_ENDING:\n          if (c === '>') {\n            emitNode(parser, 'onprocessinginstruction', {\n              name: parser.procInstName,\n              body: parser.procInstBody\n            })\n            parser.procInstName = parser.procInstBody = ''\n            parser.state = S.TEXT\n          } else {\n            parser.procInstBody += '?' + c\n            parser.state = S.PROC_INST_BODY\n          }\n          continue\n\n        case S.OPEN_TAG:\n          if (isMatch(nameBody, c)) {\n            parser.tagName += c\n          } else {\n            newTag(parser)\n            if (c === '>') {\n              openTag(parser)\n            } else if (c === '/') {\n              parser.state = S.OPEN_TAG_SLASH\n            } else {\n              if (!isWhitespace(c)) {\n                strictFail(parser, 'Invalid character in tag name')\n              }\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.OPEN_TAG_SLASH:\n          if (c === '>') {\n            openTag(parser, true)\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Forward-slash in opening tag not followed by >')\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.ATTRIB:\n          // haven't read the attribute name yet.\n          if (isWhitespace(c)) {\n            continue\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (isMatch(nameStart, c)) {\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (c === '>') {\n            strictFail(parser, 'Attribute without value')\n            parser.attribValue = parser.attribName\n            attrib(parser)\n            openTag(parser)\n          } else if (isWhitespace(c)) {\n            parser.state = S.ATTRIB_NAME_SAW_WHITE\n          } else if (isMatch(nameBody, c)) {\n            parser.attribName += c\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_NAME_SAW_WHITE:\n          if (c === '=') {\n            parser.state = S.ATTRIB_VALUE\n          } else if (isWhitespace(c)) {\n            continue\n          } else {\n            strictFail(parser, 'Attribute without value')\n            parser.tag.attributes[parser.attribName] = ''\n            parser.attribValue = ''\n            emitNode(parser, 'onattribute', {\n              name: parser.attribName,\n              value: ''\n            })\n            parser.attribName = ''\n            if (c === '>') {\n              openTag(parser)\n            } else if (isMatch(nameStart, c)) {\n              parser.attribName = c\n              parser.state = S.ATTRIB_NAME\n            } else {\n              strictFail(parser, 'Invalid attribute name')\n              parser.state = S.ATTRIB\n            }\n          }\n          continue\n\n        case S.ATTRIB_VALUE:\n          if (isWhitespace(c)) {\n            continue\n          } else if (isQuote(c)) {\n            parser.q = c\n            parser.state = S.ATTRIB_VALUE_QUOTED\n          } else {\n            strictFail(parser, 'Unquoted attribute value')\n            parser.state = S.ATTRIB_VALUE_UNQUOTED\n            parser.attribValue = c\n          }\n          continue\n\n        case S.ATTRIB_VALUE_QUOTED:\n          if (c !== parser.q) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_Q\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          parser.q = ''\n          parser.state = S.ATTRIB_VALUE_CLOSED\n          continue\n\n        case S.ATTRIB_VALUE_CLOSED:\n          if (isWhitespace(c)) {\n            parser.state = S.ATTRIB\n          } else if (c === '>') {\n            openTag(parser)\n          } else if (c === '/') {\n            parser.state = S.OPEN_TAG_SLASH\n          } else if (isMatch(nameStart, c)) {\n            strictFail(parser, 'No whitespace between attributes')\n            parser.attribName = c\n            parser.attribValue = ''\n            parser.state = S.ATTRIB_NAME\n          } else {\n            strictFail(parser, 'Invalid attribute name')\n          }\n          continue\n\n        case S.ATTRIB_VALUE_UNQUOTED:\n          if (!isAttribEnd(c)) {\n            if (c === '&') {\n              parser.state = S.ATTRIB_VALUE_ENTITY_U\n            } else {\n              parser.attribValue += c\n            }\n            continue\n          }\n          attrib(parser)\n          if (c === '>') {\n            openTag(parser)\n          } else {\n            parser.state = S.ATTRIB\n          }\n          continue\n\n        case S.CLOSE_TAG:\n          if (!parser.tagName) {\n            if (isWhitespace(c)) {\n              continue\n            } else if (notMatch(nameStart, c)) {\n              if (parser.script) {\n                parser.script += '</' + c\n                parser.state = S.SCRIPT\n              } else {\n                strictFail(parser, 'Invalid tagname in closing tag.')\n              }\n            } else {\n              parser.tagName = c\n            }\n          } else if (c === '>') {\n            closeTag(parser)\n          } else if (isMatch(nameBody, c)) {\n            parser.tagName += c\n          } else if (parser.script) {\n            parser.script += '</' + parser.tagName\n            parser.tagName = ''\n            parser.state = S.SCRIPT\n          } else {\n            if (!isWhitespace(c)) {\n              strictFail(parser, 'Invalid tagname in closing tag')\n            }\n            parser.state = S.CLOSE_TAG_SAW_WHITE\n          }\n          continue\n\n        case S.CLOSE_TAG_SAW_WHITE:\n          if (isWhitespace(c)) {\n            continue\n          }\n          if (c === '>') {\n            closeTag(parser)\n          } else {\n            strictFail(parser, 'Invalid characters in closing tag')\n          }\n          continue\n\n        case S.TEXT_ENTITY:\n        case S.ATTRIB_VALUE_ENTITY_Q:\n        case S.ATTRIB_VALUE_ENTITY_U:\n          var returnState\n          var buffer\n          switch (parser.state) {\n            case S.TEXT_ENTITY:\n              returnState = S.TEXT\n              buffer = 'textNode'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_Q:\n              returnState = S.ATTRIB_VALUE_QUOTED\n              buffer = 'attribValue'\n              break\n\n            case S.ATTRIB_VALUE_ENTITY_U:\n              returnState = S.ATTRIB_VALUE_UNQUOTED\n              buffer = 'attribValue'\n              break\n          }\n\n          if (c === ';') {\n            parser[buffer] += parseEntity(parser)\n            parser.entity = ''\n            parser.state = returnState\n          } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {\n            parser.entity += c\n          } else {\n            strictFail(parser, 'Invalid character in entity name')\n            parser[buffer] += '&' + parser.entity + c\n            parser.entity = ''\n            parser.state = returnState\n          }\n\n          continue\n\n        default:\n          throw new Error(parser, 'Unknown state: ' + parser.state)\n      }\n    } // while\n\n    if (parser.position >= parser.bufferCheckPosition) {\n      checkBufferLength(parser)\n    }\n    return parser\n  }\n\n  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n  /* istanbul ignore next */\n  if (!String.fromCodePoint) {\n    (function () {\n      var stringFromCharCode = String.fromCharCode\n      var floor = Math.floor\n      var fromCodePoint = function () {\n        var MAX_SIZE = 0x4000\n        var codeUnits = []\n        var highSurrogate\n        var lowSurrogate\n        var index = -1\n        var length = arguments.length\n        if (!length) {\n          return ''\n        }\n        var result = ''\n        while (++index < length) {\n          var codePoint = Number(arguments[index])\n          if (\n            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n            codePoint < 0 || // not a valid Unicode code point\n            codePoint > 0x10FFFF || // not a valid Unicode code point\n            floor(codePoint) !== codePoint // not an integer\n          ) {\n            throw RangeError('Invalid code point: ' + codePoint)\n          }\n          if (codePoint <= 0xFFFF) { // BMP code point\n            codeUnits.push(codePoint)\n          } else { // Astral code point; split in surrogate halves\n            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n            codePoint -= 0x10000\n            highSurrogate = (codePoint >> 10) + 0xD800\n            lowSurrogate = (codePoint % 0x400) + 0xDC00\n            codeUnits.push(highSurrogate, lowSurrogate)\n          }\n          if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n            result += stringFromCharCode.apply(null, codeUnits)\n            codeUnits.length = 0\n          }\n        }\n        return result\n      }\n      /* istanbul ignore next */\n      if (Object.defineProperty) {\n        Object.defineProperty(String, 'fromCodePoint', {\n          value: fromCodePoint,\n          configurable: true,\n          writable: true\n        })\n      } else {\n        String.fromCodePoint = fromCodePoint\n      }\n    }())\n  }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":154,\"stream\":260,\"string_decoder\":153}],260:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/readable.js');\nStream.Writable = require('readable-stream/writable.js');\nStream.Duplex = require('readable-stream/duplex.js');\nStream.Transform = require('readable-stream/transform.js');\nStream.PassThrough = require('readable-stream/passthrough.js');\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n\n},{\"events\":159,\"inherits\":161,\"readable-stream/duplex.js\":245,\"readable-stream/passthrough.js\":254,\"readable-stream/readable.js\":255,\"readable-stream/transform.js\":256,\"readable-stream/writable.js\":257}],261:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\n/*</replacement>*/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n  encoding = '' + encoding;\n  switch (encoding && encoding.toLowerCase()) {\n    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n      return true;\n    default:\n      return false;\n  }\n};\n\nfunction _normalizeEncoding(enc) {\n  if (!enc) return 'utf8';\n  var retried;\n  while (true) {\n    switch (enc) {\n      case 'utf8':\n      case 'utf-8':\n        return 'utf8';\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return 'utf16le';\n      case 'latin1':\n      case 'binary':\n        return 'latin1';\n      case 'base64':\n      case 'ascii':\n      case 'hex':\n        return enc;\n      default:\n        if (retried) return; // undefined\n        enc = ('' + enc).toLowerCase();\n        retried = true;\n    }\n  }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n  var nenc = _normalizeEncoding(enc);\n  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n  return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.StringDecoder = StringDecoder;\nfunction StringDecoder(encoding) {\n  this.encoding = normalizeEncoding(encoding);\n  var nb;\n  switch (this.encoding) {\n    case 'utf16le':\n      this.text = utf16Text;\n      this.end = utf16End;\n      nb = 4;\n      break;\n    case 'utf8':\n      this.fillLast = utf8FillLast;\n      nb = 4;\n      break;\n    case 'base64':\n      this.text = base64Text;\n      this.end = base64End;\n      nb = 3;\n      break;\n    default:\n      this.write = simpleWrite;\n      this.end = simpleEnd;\n      return;\n  }\n  this.lastNeed = 0;\n  this.lastTotal = 0;\n  this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n  if (buf.length === 0) return '';\n  var r;\n  var i;\n  if (this.lastNeed) {\n    r = this.fillLast(buf);\n    if (r === undefined) return '';\n    i = this.lastNeed;\n    this.lastNeed = 0;\n  } else {\n    i = 0;\n  }\n  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n  return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n  this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n  return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n  var j = buf.length - 1;\n  if (j < i) return 0;\n  var nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 1;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 2;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) {\n      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n    }\n    return nb;\n  }\n  return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n  if ((buf[0] & 0xC0) !== 0x80) {\n    self.lastNeed = 0;\n    return '\\ufffd';\n  }\n  if (self.lastNeed > 1 && buf.length > 1) {\n    if ((buf[1] & 0xC0) !== 0x80) {\n      self.lastNeed = 1;\n      return '\\ufffd';\n    }\n    if (self.lastNeed > 2 && buf.length > 2) {\n      if ((buf[2] & 0xC0) !== 0x80) {\n        self.lastNeed = 2;\n        return '\\ufffd';\n      }\n    }\n  }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n  var p = this.lastTotal - this.lastNeed;\n  var r = utf8CheckExtraBytes(this, buf, p);\n  if (r !== undefined) return r;\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, p, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, p, 0, buf.length);\n  this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n  var total = utf8CheckIncomplete(this, buf, i);\n  if (!this.lastNeed) return buf.toString('utf8', i);\n  this.lastTotal = total;\n  var end = buf.length - (total - this.lastNeed);\n  buf.copy(this.lastChar, 0, end);\n  return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + '\\ufffd';\n  return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n  if ((buf.length - i) % 2 === 0) {\n    var r = buf.toString('utf16le', i);\n    if (r) {\n      var c = r.charCodeAt(r.length - 1);\n      if (c >= 0xD800 && c <= 0xDBFF) {\n        this.lastNeed = 2;\n        this.lastTotal = 4;\n        this.lastChar[0] = buf[buf.length - 2];\n        this.lastChar[1] = buf[buf.length - 1];\n        return r.slice(0, -1);\n      }\n    }\n    return r;\n  }\n  this.lastNeed = 1;\n  this.lastTotal = 2;\n  this.lastChar[0] = buf[buf.length - 1];\n  return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) {\n    var end = this.lastTotal - this.lastNeed;\n    return r + this.lastChar.toString('utf16le', 0, end);\n  }\n  return r;\n}\n\nfunction base64Text(buf, i) {\n  var n = (buf.length - i) % 3;\n  if (n === 0) return buf.toString('base64', i);\n  this.lastNeed = 3 - n;\n  this.lastTotal = 3;\n  if (n === 1) {\n    this.lastChar[0] = buf[buf.length - 1];\n  } else {\n    this.lastChar[0] = buf[buf.length - 2];\n    this.lastChar[1] = buf[buf.length - 1];\n  }\n  return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n  return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n  return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n  return buf && buf.length ? this.write(buf) : '';\n}\n},{\"safe-buffer\":258}],262:[function(require,module,exports){\n(function (global){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _ponyfill = require('./ponyfill.js');\n\nvar _ponyfill2 = _interopRequireDefault(_ponyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar root; /* global window */\n\n\nif (typeof self !== 'undefined') {\n  root = self;\n} else if (typeof window !== 'undefined') {\n  root = window;\n} else if (typeof global !== 'undefined') {\n  root = global;\n} else if (typeof module !== 'undefined') {\n  root = module;\n} else {\n  root = Function('return this')();\n}\n\nvar result = (0, _ponyfill2['default'])(root);\nexports['default'] = result;\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./ponyfill.js\":263}],263:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\nexports['default'] = symbolObservablePonyfill;\nfunction symbolObservablePonyfill(root) {\n\tvar result;\n\tvar _Symbol = root.Symbol;\n\n\tif (typeof _Symbol === 'function') {\n\t\tif (_Symbol.observable) {\n\t\t\tresult = _Symbol.observable;\n\t\t} else {\n\t\t\tresult = _Symbol('observable');\n\t\t\t_Symbol.observable = result;\n\t\t}\n\t} else {\n\t\tresult = '@@observable';\n\t}\n\n\treturn result;\n};\n},{}],264:[function(require,module,exports){\n(function (setImmediate,clearImmediate){\nvar nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n  var id = nextImmediateId++;\n  var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n  immediateIds[id] = true;\n\n  nextTick(function onNextTick() {\n    if (immediateIds[id]) {\n      // fn.call() is faster so we optimize for the common use-case\n      // @see http://jsperf.com/call-apply-segu\n      if (args) {\n        fn.apply(null, args);\n      } else {\n        fn.call(null);\n      }\n      // Prevent ids from leaking\n      exports.clearImmediate(id);\n    }\n  });\n\n  return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n  delete immediateIds[id];\n};\n}).call(this,require(\"timers\").setImmediate,require(\"timers\").clearImmediate)\n},{\"process/browser.js\":240,\"timers\":264}],265:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar punycode = require('punycode');\nvar util = require('./util');\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n  this.protocol = null;\n  this.slashes = null;\n  this.auth = null;\n  this.host = null;\n  this.port = null;\n  this.hostname = null;\n  this.hash = null;\n  this.search = null;\n  this.query = null;\n  this.pathname = null;\n  this.path = null;\n  this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n    portPattern = /:[0-9]*$/,\n\n    // Special case for a simple path URL\n    simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n    // RFC 2396: characters reserved for delimiting URLs.\n    // We actually just auto-escape these.\n    delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n    // RFC 2396: characters not allowed for various reasons.\n    unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n    // Allowed by RFCs, but cause of XSS attacks.  Always escape these.\n    autoEscape = ['\\''].concat(unwise),\n    // Characters that are never ever allowed in a hostname.\n    // Note that any invalid chars are also handled, but these\n    // are the ones that are *expected* to be seen, so we fast-path\n    // them.\n    nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n    hostEndingChars = ['/', '?', '#'],\n    hostnameMaxLen = 255,\n    hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n    hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n    // protocols that can allow \"unsafe\" and \"unwise\" chars.\n    unsafeProtocol = {\n      'javascript': true,\n      'javascript:': true\n    },\n    // protocols that never have a hostname.\n    hostlessProtocol = {\n      'javascript': true,\n      'javascript:': true\n    },\n    // protocols that always contain a // bit.\n    slashedProtocol = {\n      'http': true,\n      'https': true,\n      'ftp': true,\n      'gopher': true,\n      'file': true,\n      'http:': true,\n      'https:': true,\n      'ftp:': true,\n      'gopher:': true,\n      'file:': true\n    },\n    querystring = require('querystring');\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n  if (url && util.isObject(url) && url instanceof Url) return url;\n\n  var u = new Url;\n  u.parse(url, parseQueryString, slashesDenoteHost);\n  return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n  if (!util.isString(url)) {\n    throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n  }\n\n  // Copy chrome, IE, opera backslash-handling behavior.\n  // Back slashes before the query string get converted to forward slashes\n  // See: https://code.google.com/p/chromium/issues/detail?id=25916\n  var queryIndex = url.indexOf('?'),\n      splitter =\n          (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n      uSplit = url.split(splitter),\n      slashRegex = /\\\\/g;\n  uSplit[0] = uSplit[0].replace(slashRegex, '/');\n  url = uSplit.join(splitter);\n\n  var rest = url;\n\n  // trim before proceeding.\n  // This is to support parse stuff like \"  http://foo.com  \\n\"\n  rest = rest.trim();\n\n  if (!slashesDenoteHost && url.split('#').length === 1) {\n    // Try fast path regexp\n    var simplePath = simplePathPattern.exec(rest);\n    if (simplePath) {\n      this.path = rest;\n      this.href = rest;\n      this.pathname = simplePath[1];\n      if (simplePath[2]) {\n        this.search = simplePath[2];\n        if (parseQueryString) {\n          this.query = querystring.parse(this.search.substr(1));\n        } else {\n          this.query = this.search.substr(1);\n        }\n      } else if (parseQueryString) {\n        this.search = '';\n        this.query = {};\n      }\n      return this;\n    }\n  }\n\n  var proto = protocolPattern.exec(rest);\n  if (proto) {\n    proto = proto[0];\n    var lowerProto = proto.toLowerCase();\n    this.protocol = lowerProto;\n    rest = rest.substr(proto.length);\n  }\n\n  // figure out if it's got a host\n  // user@server is *always* interpreted as a hostname, and url\n  // resolution will treat //foo/bar as host=foo,path=bar because that's\n  // how the browser resolves relative URLs.\n  if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n    var slashes = rest.substr(0, 2) === '//';\n    if (slashes && !(proto && hostlessProtocol[proto])) {\n      rest = rest.substr(2);\n      this.slashes = true;\n    }\n  }\n\n  if (!hostlessProtocol[proto] &&\n      (slashes || (proto && !slashedProtocol[proto]))) {\n\n    // there's a hostname.\n    // the first instance of /, ?, ;, or # ends the host.\n    //\n    // If there is an @ in the hostname, then non-host chars *are* allowed\n    // to the left of the last @ sign, unless some host-ending character\n    // comes *before* the @-sign.\n    // URLs are obnoxious.\n    //\n    // ex:\n    // http://a@b@c/ => user:a@b host:c\n    // http://a@b?@c => user:a host:c path:/?@c\n\n    // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n    // Review our test case against browsers more comprehensively.\n\n    // find the first instance of any hostEndingChars\n    var hostEnd = -1;\n    for (var i = 0; i < hostEndingChars.length; i++) {\n      var hec = rest.indexOf(hostEndingChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n        hostEnd = hec;\n    }\n\n    // at this point, either we have an explicit point where the\n    // auth portion cannot go past, or the last @ char is the decider.\n    var auth, atSign;\n    if (hostEnd === -1) {\n      // atSign can be anywhere.\n      atSign = rest.lastIndexOf('@');\n    } else {\n      // atSign must be in auth portion.\n      // http://a@b/c@d => host:b auth:a path:/c@d\n      atSign = rest.lastIndexOf('@', hostEnd);\n    }\n\n    // Now we have a portion which is definitely the auth.\n    // Pull that off.\n    if (atSign !== -1) {\n      auth = rest.slice(0, atSign);\n      rest = rest.slice(atSign + 1);\n      this.auth = decodeURIComponent(auth);\n    }\n\n    // the host is the remaining to the left of the first non-host char\n    hostEnd = -1;\n    for (var i = 0; i < nonHostChars.length; i++) {\n      var hec = rest.indexOf(nonHostChars[i]);\n      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n        hostEnd = hec;\n    }\n    // if we still have not hit it, then the entire thing is a host.\n    if (hostEnd === -1)\n      hostEnd = rest.length;\n\n    this.host = rest.slice(0, hostEnd);\n    rest = rest.slice(hostEnd);\n\n    // pull out port.\n    this.parseHost();\n\n    // we've indicated that there is a hostname,\n    // so even if it's empty, it has to be present.\n    this.hostname = this.hostname || '';\n\n    // if hostname begins with [ and ends with ]\n    // assume that it's an IPv6 address.\n    var ipv6Hostname = this.hostname[0] === '[' &&\n        this.hostname[this.hostname.length - 1] === ']';\n\n    // validate a little.\n    if (!ipv6Hostname) {\n      var hostparts = this.hostname.split(/\\./);\n      for (var i = 0, l = hostparts.length; i < l; i++) {\n        var part = hostparts[i];\n        if (!part) continue;\n        if (!part.match(hostnamePartPattern)) {\n          var newpart = '';\n          for (var j = 0, k = part.length; j < k; j++) {\n            if (part.charCodeAt(j) > 127) {\n              // we replace non-ASCII char with a temporary placeholder\n              // we need this to make sure size of hostname is not\n              // broken by replacing non-ASCII by nothing\n              newpart += 'x';\n            } else {\n              newpart += part[j];\n            }\n          }\n          // we test again with ASCII char only\n          if (!newpart.match(hostnamePartPattern)) {\n            var validParts = hostparts.slice(0, i);\n            var notHost = hostparts.slice(i + 1);\n            var bit = part.match(hostnamePartStart);\n            if (bit) {\n              validParts.push(bit[1]);\n              notHost.unshift(bit[2]);\n            }\n            if (notHost.length) {\n              rest = '/' + notHost.join('.') + rest;\n            }\n            this.hostname = validParts.join('.');\n            break;\n          }\n        }\n      }\n    }\n\n    if (this.hostname.length > hostnameMaxLen) {\n      this.hostname = '';\n    } else {\n      // hostnames are always lower case.\n      this.hostname = this.hostname.toLowerCase();\n    }\n\n    if (!ipv6Hostname) {\n      // IDNA Support: Returns a punycoded representation of \"domain\".\n      // It only converts parts of the domain name that\n      // have non-ASCII characters, i.e. it doesn't matter if\n      // you call it with a domain that already is ASCII-only.\n      this.hostname = punycode.toASCII(this.hostname);\n    }\n\n    var p = this.port ? ':' + this.port : '';\n    var h = this.hostname || '';\n    this.host = h + p;\n    this.href += this.host;\n\n    // strip [ and ] from the hostname\n    // the host field still retains them, though\n    if (ipv6Hostname) {\n      this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n      if (rest[0] !== '/') {\n        rest = '/' + rest;\n      }\n    }\n  }\n\n  // now rest is set to the post-host stuff.\n  // chop off any delim chars.\n  if (!unsafeProtocol[lowerProto]) {\n\n    // First, make 100% sure that any \"autoEscape\" chars get\n    // escaped, even if encodeURIComponent doesn't think they\n    // need to be.\n    for (var i = 0, l = autoEscape.length; i < l; i++) {\n      var ae = autoEscape[i];\n      if (rest.indexOf(ae) === -1)\n        continue;\n      var esc = encodeURIComponent(ae);\n      if (esc === ae) {\n        esc = escape(ae);\n      }\n      rest = rest.split(ae).join(esc);\n    }\n  }\n\n\n  // chop off from the tail first.\n  var hash = rest.indexOf('#');\n  if (hash !== -1) {\n    // got a fragment string.\n    this.hash = rest.substr(hash);\n    rest = rest.slice(0, hash);\n  }\n  var qm = rest.indexOf('?');\n  if (qm !== -1) {\n    this.search = rest.substr(qm);\n    this.query = rest.substr(qm + 1);\n    if (parseQueryString) {\n      this.query = querystring.parse(this.query);\n    }\n    rest = rest.slice(0, qm);\n  } else if (parseQueryString) {\n    // no query string, but parseQueryString still requested\n    this.search = '';\n    this.query = {};\n  }\n  if (rest) this.pathname = rest;\n  if (slashedProtocol[lowerProto] &&\n      this.hostname && !this.pathname) {\n    this.pathname = '/';\n  }\n\n  //to support http.request\n  if (this.pathname || this.search) {\n    var p = this.pathname || '';\n    var s = this.search || '';\n    this.path = p + s;\n  }\n\n  // finally, reconstruct the href based on what has been validated.\n  this.href = this.format();\n  return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n  // ensure it's an object, and not a string url.\n  // If it's an obj, this is a no-op.\n  // this way, you can call url_format() on strings\n  // to clean up potentially wonky urls.\n  if (util.isString(obj)) obj = urlParse(obj);\n  if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n  return obj.format();\n}\n\nUrl.prototype.format = function() {\n  var auth = this.auth || '';\n  if (auth) {\n    auth = encodeURIComponent(auth);\n    auth = auth.replace(/%3A/i, ':');\n    auth += '@';\n  }\n\n  var protocol = this.protocol || '',\n      pathname = this.pathname || '',\n      hash = this.hash || '',\n      host = false,\n      query = '';\n\n  if (this.host) {\n    host = auth + this.host;\n  } else if (this.hostname) {\n    host = auth + (this.hostname.indexOf(':') === -1 ?\n        this.hostname :\n        '[' + this.hostname + ']');\n    if (this.port) {\n      host += ':' + this.port;\n    }\n  }\n\n  if (this.query &&\n      util.isObject(this.query) &&\n      Object.keys(this.query).length) {\n    query = querystring.stringify(this.query);\n  }\n\n  var search = this.search || (query && ('?' + query)) || '';\n\n  if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n  // only the slashedProtocols get the //.  Not mailto:, xmpp:, etc.\n  // unless they had them to begin with.\n  if (this.slashes ||\n      (!protocol || slashedProtocol[protocol]) && host !== false) {\n    host = '//' + (host || '');\n    if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n  } else if (!host) {\n    host = '';\n  }\n\n  if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n  if (search && search.charAt(0) !== '?') search = '?' + search;\n\n  pathname = pathname.replace(/[?#]/g, function(match) {\n    return encodeURIComponent(match);\n  });\n  search = search.replace('#', '%23');\n\n  return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n  return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n  return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n  if (!source) return relative;\n  return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n  if (util.isString(relative)) {\n    var rel = new Url();\n    rel.parse(relative, false, true);\n    relative = rel;\n  }\n\n  var result = new Url();\n  var tkeys = Object.keys(this);\n  for (var tk = 0; tk < tkeys.length; tk++) {\n    var tkey = tkeys[tk];\n    result[tkey] = this[tkey];\n  }\n\n  // hash is always overridden, no matter what.\n  // even href=\"\" will remove it.\n  result.hash = relative.hash;\n\n  // if the relative url is empty, then there's nothing left to do here.\n  if (relative.href === '') {\n    result.href = result.format();\n    return result;\n  }\n\n  // hrefs like //foo/bar always cut to the protocol.\n  if (relative.slashes && !relative.protocol) {\n    // take everything except the protocol from relative\n    var rkeys = Object.keys(relative);\n    for (var rk = 0; rk < rkeys.length; rk++) {\n      var rkey = rkeys[rk];\n      if (rkey !== 'protocol')\n        result[rkey] = relative[rkey];\n    }\n\n    //urlParse appends trailing / to urls like http://www.example.com\n    if (slashedProtocol[result.protocol] &&\n        result.hostname && !result.pathname) {\n      result.path = result.pathname = '/';\n    }\n\n    result.href = result.format();\n    return result;\n  }\n\n  if (relative.protocol && relative.protocol !== result.protocol) {\n    // if it's a known url protocol, then changing\n    // the protocol does weird things\n    // first, if it's not file:, then we MUST have a host,\n    // and if there was a path\n    // to begin with, then we MUST have a path.\n    // if it is file:, then the host is dropped,\n    // because that's known to be hostless.\n    // anything else is assumed to be absolute.\n    if (!slashedProtocol[relative.protocol]) {\n      var keys = Object.keys(relative);\n      for (var v = 0; v < keys.length; v++) {\n        var k = keys[v];\n        result[k] = relative[k];\n      }\n      result.href = result.format();\n      return result;\n    }\n\n    result.protocol = relative.protocol;\n    if (!relative.host && !hostlessProtocol[relative.protocol]) {\n      var relPath = (relative.pathname || '').split('/');\n      while (relPath.length && !(relative.host = relPath.shift()));\n      if (!relative.host) relative.host = '';\n      if (!relative.hostname) relative.hostname = '';\n      if (relPath[0] !== '') relPath.unshift('');\n      if (relPath.length < 2) relPath.unshift('');\n      result.pathname = relPath.join('/');\n    } else {\n      result.pathname = relative.pathname;\n    }\n    result.search = relative.search;\n    result.query = relative.query;\n    result.host = relative.host || '';\n    result.auth = relative.auth;\n    result.hostname = relative.hostname || relative.host;\n    result.port = relative.port;\n    // to support http.request\n    if (result.pathname || result.search) {\n      var p = result.pathname || '';\n      var s = result.search || '';\n      result.path = p + s;\n    }\n    result.slashes = result.slashes || relative.slashes;\n    result.href = result.format();\n    return result;\n  }\n\n  var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n      isRelAbs = (\n          relative.host ||\n          relative.pathname && relative.pathname.charAt(0) === '/'\n      ),\n      mustEndAbs = (isRelAbs || isSourceAbs ||\n                    (result.host && relative.pathname)),\n      removeAllDots = mustEndAbs,\n      srcPath = result.pathname && result.pathname.split('/') || [],\n      relPath = relative.pathname && relative.pathname.split('/') || [],\n      psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n  // if the url is a non-slashed url, then relative\n  // links like ../.. should be able\n  // to crawl up to the hostname, as well.  This is strange.\n  // result.protocol has already been set by now.\n  // Later on, put the first path part into the host field.\n  if (psychotic) {\n    result.hostname = '';\n    result.port = null;\n    if (result.host) {\n      if (srcPath[0] === '') srcPath[0] = result.host;\n      else srcPath.unshift(result.host);\n    }\n    result.host = '';\n    if (relative.protocol) {\n      relative.hostname = null;\n      relative.port = null;\n      if (relative.host) {\n        if (relPath[0] === '') relPath[0] = relative.host;\n        else relPath.unshift(relative.host);\n      }\n      relative.host = null;\n    }\n    mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n  }\n\n  if (isRelAbs) {\n    // it's absolute.\n    result.host = (relative.host || relative.host === '') ?\n                  relative.host : result.host;\n    result.hostname = (relative.hostname || relative.hostname === '') ?\n                      relative.hostname : result.hostname;\n    result.search = relative.search;\n    result.query = relative.query;\n    srcPath = relPath;\n    // fall through to the dot-handling below.\n  } else if (relPath.length) {\n    // it's relative\n    // throw away the existing file, and take the new path instead.\n    if (!srcPath) srcPath = [];\n    srcPath.pop();\n    srcPath = srcPath.concat(relPath);\n    result.search = relative.search;\n    result.query = relative.query;\n  } else if (!util.isNullOrUndefined(relative.search)) {\n    // just pull out the search.\n    // like href='?foo'.\n    // Put this after the other two cases because it simplifies the booleans\n    if (psychotic) {\n      result.hostname = result.host = srcPath.shift();\n      //occationaly the auth can get stuck only in host\n      //this especially happens in cases like\n      //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n      var authInHost = result.host && result.host.indexOf('@') > 0 ?\n                       result.host.split('@') : false;\n      if (authInHost) {\n        result.auth = authInHost.shift();\n        result.host = result.hostname = authInHost.shift();\n      }\n    }\n    result.search = relative.search;\n    result.query = relative.query;\n    //to support http.request\n    if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n      result.path = (result.pathname ? result.pathname : '') +\n                    (result.search ? result.search : '');\n    }\n    result.href = result.format();\n    return result;\n  }\n\n  if (!srcPath.length) {\n    // no path at all.  easy.\n    // we've already handled the other stuff above.\n    result.pathname = null;\n    //to support http.request\n    if (result.search) {\n      result.path = '/' + result.search;\n    } else {\n      result.path = null;\n    }\n    result.href = result.format();\n    return result;\n  }\n\n  // if a url ENDs in . or .., then it must get a trailing slash.\n  // however, if it ends in anything else non-slashy,\n  // then it must NOT get a trailing slash.\n  var last = srcPath.slice(-1)[0];\n  var hasTrailingSlash = (\n      (result.host || relative.host || srcPath.length > 1) &&\n      (last === '.' || last === '..') || last === '');\n\n  // strip single dots, resolve double dots to parent dir\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = srcPath.length; i >= 0; i--) {\n    last = srcPath[i];\n    if (last === '.') {\n      srcPath.splice(i, 1);\n    } else if (last === '..') {\n      srcPath.splice(i, 1);\n      up++;\n    } else if (up) {\n      srcPath.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (!mustEndAbs && !removeAllDots) {\n    for (; up--; up) {\n      srcPath.unshift('..');\n    }\n  }\n\n  if (mustEndAbs && srcPath[0] !== '' &&\n      (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n    srcPath.unshift('');\n  }\n\n  if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n    srcPath.push('');\n  }\n\n  var isAbsolute = srcPath[0] === '' ||\n      (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n  // put the host back\n  if (psychotic) {\n    result.hostname = result.host = isAbsolute ? '' :\n                                    srcPath.length ? srcPath.shift() : '';\n    //occationaly the auth can get stuck only in host\n    //this especially happens in cases like\n    //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n    var authInHost = result.host && result.host.indexOf('@') > 0 ?\n                     result.host.split('@') : false;\n    if (authInHost) {\n      result.auth = authInHost.shift();\n      result.host = result.hostname = authInHost.shift();\n    }\n  }\n\n  mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n  if (mustEndAbs && !isAbsolute) {\n    srcPath.unshift('');\n  }\n\n  if (!srcPath.length) {\n    result.pathname = null;\n    result.path = null;\n  } else {\n    result.pathname = srcPath.join('/');\n  }\n\n  //to support request.http\n  if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n    result.path = (result.pathname ? result.pathname : '') +\n                  (result.search ? result.search : '');\n  }\n  result.auth = relative.auth || result.auth;\n  result.slashes = result.slashes || relative.slashes;\n  result.href = result.format();\n  return result;\n};\n\nUrl.prototype.parseHost = function() {\n  var host = this.host;\n  var port = portPattern.exec(host);\n  if (port) {\n    port = port[0];\n    if (port !== ':') {\n      this.port = port.substr(1);\n    }\n    host = host.substr(0, host.length - port.length);\n  }\n  if (host) this.hostname = host;\n};\n\n},{\"./util\":266,\"punycode\":241,\"querystring\":244}],266:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n  isString: function(arg) {\n    return typeof(arg) === 'string';\n  },\n  isObject: function(arg) {\n    return typeof(arg) === 'object' && arg !== null;\n  },\n  isNull: function(arg) {\n    return arg === null;\n  },\n  isNullOrUndefined: function(arg) {\n    return arg == null;\n  }\n};\n\n},{}],267:[function(require,module,exports){\n(function (global){\n\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n  if (config('noDeprecation')) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (config('throwDeprecation')) {\n        throw new Error(msg);\n      } else if (config('traceDeprecation')) {\n        console.trace(msg);\n      } else {\n        console.warn(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n  // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n  try {\n    if (!global.localStorage) return false;\n  } catch (_) {\n    return false;\n  }\n  var val = global.localStorage[name];\n  if (null == val) return false;\n  return String(val).toLowerCase() === 'true';\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],268:[function(require,module,exports){\n(function (global){\nmodule.exports = get_blob()\n\nfunction get_blob() {\n  if(global.Blob) {\n    try {\n      new Blob(['asdf'], {type: 'text/plain'})\n      return Blob\n    } catch(err) {}\n  }\n\n  var Builder = global.WebKitBlobBuilder ||\n                global.MozBlobBuilder ||\n                global.MSBlobBuilder\n\n  return function(parts, bag) {\n    var builder = new Builder\n      , endings = bag.endings\n      , type = bag.type\n\n    if(endings) for(var i = 0, len = parts.length; i < len; ++i) {\n      builder.append(parts[i], endings)\n    } else for(var i = 0, len = parts.length; i < len; ++i) {\n      builder.append(parts[i])\n    }\n\n    return type ? builder.getBlob(type) : builder.getBlob()\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],269:[function(require,module,exports){\nvar bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n    var wkey;\n    var cacheKeys = Object.keys(cache);\n\n    for (var i = 0, l = cacheKeys.length; i < l; i++) {\n        var key = cacheKeys[i];\n        var exp = cache[key].exports;\n        // Using babel as a transpiler to use esmodule, the export will always\n        // be an object with the default export as a property of it. To ensure\n        // the existing api and babel esmodule exports are both supported we\n        // check for both\n        if (exp === fn || exp && exp.default === fn) {\n            wkey = key;\n            break;\n        }\n    }\n\n    if (!wkey) {\n        wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n        var wcache = {};\n        for (var i = 0, l = cacheKeys.length; i < l; i++) {\n            var key = cacheKeys[i];\n            wcache[key] = key;\n        }\n        sources[wkey] = [\n            'function(require,module,exports){' + fn + '(self); }',\n            wcache\n        ];\n    }\n    var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n    var scache = {}; scache[wkey] = wkey;\n    sources[skey] = [\n        'function(require,module,exports){' +\n            // try to call default if defined to also support babel esmodule exports\n            'var f = require(' + stringify(wkey) + ');' +\n            '(f.default ? f.default : f)(self);' +\n        '}',\n        scache\n    ];\n\n    var workerSources = {};\n    resolveSources(skey);\n\n    function resolveSources(key) {\n        workerSources[key] = true;\n\n        for (var depPath in sources[key][1]) {\n            var depKey = sources[key][1][depPath];\n            if (!workerSources[depKey]) {\n                resolveSources(depKey);\n            }\n        }\n    }\n\n    var src = '(' + bundleFn + ')({'\n        + Object.keys(workerSources).map(function (key) {\n            return stringify(key) + ':['\n                + sources[key][0]\n                + ',' + stringify(sources[key][1]) + ']'\n            ;\n        }).join(',')\n        + '},{},[' + stringify(skey) + '])'\n    ;\n\n    var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n    var blob = new Blob([src], { type: 'text/javascript' });\n    if (options && options.bare) { return blob; }\n    var workerUrl = URL.createObjectURL(blob);\n    var worker = new Worker(workerUrl);\n    worker.objectURL = workerUrl;\n    return worker;\n};\n\n},{}],270:[function(require,module,exports){\nfunction DOMParser(options){\n\tthis.options = options ||{locator:{}};\n\t\n}\nDOMParser.prototype.parseFromString = function(source,mimeType){\n\tvar options = this.options;\n\tvar sax =  new XMLReader();\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\n\tvar errorHandler = options.errorHandler;\n\tvar locator = options.locator;\n\tvar defaultNSMap = options.xmlns||{};\n\tvar entityMap = {'lt':'<','gt':'>','amp':'&','quot':'\"','apos':\"'\"}\n\tif(locator){\n\t\tdomBuilder.setDocumentLocator(locator)\n\t}\n\t\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\n\tsax.domBuilder = options.domBuilder || domBuilder;\n\tif(/\\/x?html?$/.test(mimeType)){\n\t\tentityMap.nbsp = '\\xa0';\n\t\tentityMap.copy = '\\xa9';\n\t\tdefaultNSMap['']= 'http://www.w3.org/1999/xhtml';\n\t}\n\tdefaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';\n\tif(source){\n\t\tsax.parse(source,defaultNSMap,entityMap);\n\t}else{\n\t\tsax.errorHandler.error(\"invalid doc source\");\n\t}\n\treturn domBuilder.doc;\n}\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\n\tif(!errorImpl){\n\t\tif(domBuilder instanceof DOMHandler){\n\t\t\treturn domBuilder;\n\t\t}\n\t\terrorImpl = domBuilder ;\n\t}\n\tvar errorHandler = {}\n\tvar isCallback = errorImpl instanceof Function;\n\tlocator = locator||{}\n\tfunction build(key){\n\t\tvar fn = errorImpl[key];\n\t\tif(!fn && isCallback){\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\n\t\t}\n\t\terrorHandler[key] = fn && function(msg){\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\n\t\t}||function(){};\n\t}\n\tbuild('warning');\n\tbuild('error');\n\tbuild('fatalError');\n\treturn errorHandler;\n}\n\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\n/**\n * +ContentHandler+ErrorHandler\n * +LexicalHandler+EntityResolver2\n * -DeclHandler-DTDHandler \n * \n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\n */\nfunction DOMHandler() {\n    this.cdata = false;\n}\nfunction position(locator,node){\n\tnode.lineNumber = locator.lineNumber;\n\tnode.columnNumber = locator.columnNumber;\n}\n/**\n * @see org.xml.sax.ContentHandler#startDocument\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\n */ \nDOMHandler.prototype = {\n\tstartDocument : function() {\n    \tthis.doc = new DOMImplementation().createDocument(null, null, null);\n    \tif (this.locator) {\n        \tthis.doc.documentURI = this.locator.systemId;\n    \t}\n\t},\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\n\t\tvar doc = this.doc;\n\t    var el = doc.createElementNS(namespaceURI, qName||localName);\n\t    var len = attrs.length;\n\t    appendElement(this, el);\n\t    this.currentElement = el;\n\t    \n\t\tthis.locator && position(this.locator,el)\n\t    for (var i = 0 ; i < len; i++) {\n\t        var namespaceURI = attrs.getURI(i);\n\t        var value = attrs.getValue(i);\n\t        var qName = attrs.getQName(i);\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\n\t\t\tattr.value = attr.nodeValue = value;\n\t\t\tel.setAttributeNode(attr)\n\t    }\n\t},\n\tendElement:function(namespaceURI, localName, qName) {\n\t\tvar current = this.currentElement\n\t\tvar tagName = current.tagName;\n\t\tthis.currentElement = current.parentNode;\n\t},\n\tstartPrefixMapping:function(prefix, uri) {\n\t},\n\tendPrefixMapping:function(prefix) {\n\t},\n\tprocessingInstruction:function(target, data) {\n\t    var ins = this.doc.createProcessingInstruction(target, data);\n\t    this.locator && position(this.locator,ins)\n\t    appendElement(this, ins);\n\t},\n\tignorableWhitespace:function(ch, start, length) {\n\t},\n\tcharacters:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t\t//console.log(chars)\n\t\tif(chars){\n\t\t\tif (this.cdata) {\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\n\t\t\t} else {\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\n\t\t\t}\n\t\t\tif(this.currentElement){\n\t\t\t\tthis.currentElement.appendChild(charNode);\n\t\t\t}else if(/^\\s*$/.test(chars)){\n\t\t\t\tthis.doc.appendChild(charNode);\n\t\t\t\t//process xml\n\t\t\t}\n\t\t\tthis.locator && position(this.locator,charNode)\n\t\t}\n\t},\n\tskippedEntity:function(name) {\n\t},\n\tendDocument:function() {\n\t\tthis.doc.normalize();\n\t},\n\tsetDocumentLocator:function (locator) {\n\t    if(this.locator = locator){// && !('lineNumber' in locator)){\n\t    \tlocator.lineNumber = 0;\n\t    }\n\t},\n\t//LexicalHandler\n\tcomment:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t    var comm = this.doc.createComment(chars);\n\t    this.locator && position(this.locator,comm)\n\t    appendElement(this, comm);\n\t},\n\t\n\tstartCDATA:function() {\n\t    //used in characters() methods\n\t    this.cdata = true;\n\t},\n\tendCDATA:function() {\n\t    this.cdata = false;\n\t},\n\t\n\tstartDTD:function(name, publicId, systemId) {\n\t\tvar impl = this.doc.implementation;\n\t    if (impl && impl.createDocumentType) {\n\t        var dt = impl.createDocumentType(name, publicId, systemId);\n\t        this.locator && position(this.locator,dt)\n\t        appendElement(this, dt);\n\t    }\n\t},\n\t/**\n\t * @see org.xml.sax.ErrorHandler\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\n\t */\n\twarning:function(error) {\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\n\t},\n\terror:function(error) {\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\n\t},\n\tfatalError:function(error) {\n\t\tconsole.error('[xmldom fatalError]\\t'+error,_locator(this.locator));\n\t    throw error;\n\t}\n}\nfunction _locator(l){\n\tif(l){\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\n\t}\n}\nfunction _toString(chars,start,length){\n\tif(typeof chars == 'string'){\n\t\treturn chars.substr(start,length)\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\n\t\tif(chars.length >= start+length || start){\n\t\t\treturn new java.lang.String(chars,start,length)+'';\n\t\t}\n\t\treturn chars;\n\t}\n}\n\n/*\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\n * used method of org.xml.sax.ext.LexicalHandler:\n *  #comment(chars, start, length)\n *  #startCDATA()\n *  #endCDATA()\n *  #startDTD(name, publicId, systemId)\n *\n *\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\n *  #endDTD()\n *  #startEntity(name)\n *  #endEntity(name)\n *\n *\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\n * IGNORED method of org.xml.sax.ext.DeclHandler\n * \t#attributeDecl(eName, aName, type, mode, value)\n *  #elementDecl(name, model)\n *  #externalEntityDecl(name, publicId, systemId)\n *  #internalEntityDecl(name, value)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\n * IGNORED method of org.xml.sax.EntityResolver2\n *  #resolveEntity(String name,String publicId,String baseURI,String systemId)\n *  #resolveEntity(publicId, systemId)\n *  #getExternalSubset(name, baseURI)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\n * IGNORED method of org.xml.sax.DTDHandler\n *  #notationDecl(name, publicId, systemId) {};\n *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};\n */\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\n\tDOMHandler.prototype[key] = function(){return null}\n})\n\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\nfunction appendElement (hander,node) {\n    if (!hander.currentElement) {\n        hander.doc.appendChild(node);\n    } else {\n        hander.currentElement.appendChild(node);\n    }\n}//appendChild and setAttributeNS are preformance key\n\n//if(typeof require == 'function'){\n\tvar XMLReader = require('./sax').XMLReader;\n\tvar DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;\n\texports.XMLSerializer = require('./dom').XMLSerializer ;\n\texports.DOMParser = DOMParser;\n//}\n\n},{\"./dom\":271,\"./sax\":272}],271:[function(require,module,exports){\n/*\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n */\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tdest[p] = src[p];\n\t}\n}\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(Object.create){\n\t\tvar ppt = Object.create(Super.prototype)\n\t\tpt.__proto__ = ppt;\n\t}\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknow Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\nvar htmlns = 'http://www.w3.org/1999/xhtml' ;\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;\nvar ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;\nvar TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;\nvar CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;\nvar ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;\nvar ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;\nvar DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;\nvar DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;\nvar DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;\nvar NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR        \t= ExceptionCode.INVALID_STATE_ERR        \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR               \t= ExceptionCode.SYNTAX_ERR               \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR            \t= ExceptionCode.NAMESPACE_ERR           \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR       \t= ExceptionCode.INVALID_ACCESS_ERR      \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0, \n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index  unsigned long \n\t *   Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index. \n\t */\n\titem: function(index) {\n\t\treturn this[index] || null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i<this.length;i++){\n\t\t\tserializeToString(this[i],buf,isHTML,nodeFilter);\n\t\t}\n\t\treturn buf.join('');\n\t}\n};\nfunction LiveNodeList(node,refresh){\n\tthis._node = node;\n\tthis._refresh = refresh\n\t_updateLiveList(this);\n}\nfunction _updateLiveList(list){\n\tvar inc = list._node._inc || list._node.ownerDocument._inc;\n\tif(list._inc != inc){\n\t\tvar ls = list._refresh(list._node);\n\t\t//console.log(ls.length)\n\t\t__set__(list,'length',ls.length);\n\t\tcopy(ls,list);\n\t\tlist._inc = inc;\n\t}\n}\nLiveNodeList.prototype.item = function(i){\n\t_updateLiveList(this);\n\treturn this[i];\n}\n\n_extends(LiveNodeList,NodeList);\n/**\n * \n * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.\n * NamedNodeMap objects in the DOM are live.\n * used for attributes or DocumentType entities \n */\nfunction NamedNodeMap() {\n};\n\nfunction _findNodeIndex(list,node){\n\tvar i = list.length;\n\twhile(i--){\n\t\tif(list[i] === node){return i}\n\t}\n}\n\nfunction _addNamedNode(el,list,newAttr,oldAttr){\n\tif(oldAttr){\n\t\tlist[_findNodeIndex(list,oldAttr)] = newAttr;\n\t}else{\n\t\tlist[list.length++] = newAttr;\n\t}\n\tif(el){\n\t\tnewAttr.ownerElement = el;\n\t\tvar doc = el.ownerDocument;\n\t\tif(doc){\n\t\t\toldAttr && _onRemoveAttribute(doc,el,oldAttr);\n\t\t\t_onAddAttribute(doc,el,newAttr);\n\t\t}\n\t}\n}\nfunction _removeNamedNode(el,list,attr){\n\t//console.log('remove attr:'+attr)\n\tvar i = _findNodeIndex(list,attr);\n\tif(i>=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i<lastIndex){\n\t\t\tlist[i] = list[++i]\n\t\t}\n\t\tlist.length = lastIndex;\n\t\tif(el){\n\t\t\tvar doc = el.ownerDocument;\n\t\t\tif(doc){\n\t\t\t\t_onRemoveAttribute(doc,el,attr);\n\t\t\t\tattr.ownerElement = null;\n\t\t\t}\n\t\t}\n\t}else{\n\t\tthrow DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))\n\t}\n}\nNamedNodeMap.prototype = {\n\tlength:0,\n\titem:NodeList.prototype.item,\n\tgetNamedItem: function(key) {\n//\t\tif(key.indexOf(':')>0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t\t\n\t\t\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\t\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n/**\n * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490\n */\nfunction DOMImplementation(/* Object */ features) {\n\tthis._features = {};\n\tif (features) {\n\t\tfor (var feature in features) {\n\t\t\t this._features = features[feature];\n\t\t}\n\t}\n};\n\nDOMImplementation.prototype = {\n\thasFeature: function(/* string */ feature, /* string */ version) {\n\t\tvar versions = this._features[feature.toLowerCase()];\n\t\tif (versions && (!version || version in versions)) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype;\n\t\tif(doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif(qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI,qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId;\n\t\tnode.systemId = systemId;\n\t\t// Introduced in DOM Level 2:\n\t\t//readonly attribute DOMString        internalSubset;\n\t\t\n\t\t//TODO:..\n\t\t//  readonly attribute NamedNodeMap     entities;\n\t\t//  readonly attribute NamedNodeMap     notations;\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises \n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises \n\t\tthis.insertBefore(newChild,oldChild);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n  \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n    // Introduced in DOM Level 2:\n    hasAttributes:function(){\n    \treturn this.attributes.length>0;\n    },\n    lookupPrefix:function(namespaceURI){\n    \tvar el = this;\n    \twhile(el){\n    \t\tvar map = el._nsMap;\n    \t\t//console.dir(map)\n    \t\tif(map){\n    \t\t\tfor(var n in map){\n    \t\t\t\tif(map[n] == namespaceURI){\n    \t\t\t\t\treturn n;\n    \t\t\t\t}\n    \t\t\t}\n    \t\t}\n    \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n    \t}\n    \treturn null;\n    },\n    // Introduced in DOM Level 3:\n    lookupNamespaceURI:function(prefix){\n    \tvar el = this;\n    \twhile(el){\n    \t\tvar map = el._nsMap;\n    \t\t//console.dir(map)\n    \t\tif(map){\n    \t\t\tif(prefix in map){\n    \t\t\t\treturn map[prefix] ;\n    \t\t\t}\n    \t\t}\n    \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n    \t}\n    \treturn null;\n    },\n    // Introduced in DOM Level 3:\n    isDefaultNamespace:function(namespaceURI){\n    \tvar prefix = this.lookupPrefix(namespaceURI);\n    \treturn prefix == null;\n    }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '&lt;' ||\n         c == '>' && '&gt;' ||\n         c == '&' && '&amp;' ||\n         c == '\"' && '&quot;' ||\n         '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n        }while(node=node.nextSibling)\n    }\n}\n\n\n\nfunction Document(){\n}\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns == 'http://www.w3.org/2000/xmlns/'){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\nfunction _onUpdateChild(doc,el,newChild){\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif(newChild){\n\t\t\tcs[cs.length++] = newChild;\n\t\t}else{\n\t\t\t//console.log(1)\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile(child){\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild =child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t}\n\t}\n}\n\n/**\n * attributes;\n * children;\n * \n * writeable properties:\n * nodeValue,Attr:value,CharacterData:data\n * prefix\n */\nfunction _removeChild(parentNode,child){\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif(previous){\n\t\tprevious.nextSibling = next;\n\t}else{\n\t\tparentNode.firstChild = next\n\t}\n\tif(next){\n\t\tnext.previousSibling = previous;\n\t}else{\n\t\tparentNode.lastChild = previous;\n\t}\n\t_onUpdateChild(parentNode.ownerDocument,parentNode);\n\treturn child;\n}\n/**\n * preformance key(refChild == null)\n */\nfunction _insertBefore(parentNode,newChild,nextChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tcp.removeChild(newChild);//remove and update\n\t}\n\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = newChild.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn newChild;\n\t\t}\n\t\tvar newLast = newChild.lastChild;\n\t}else{\n\t\tnewFirst = newLast = newChild;\n\t}\n\tvar pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = nextChild;\n\t\n\t\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparentNode.firstChild = newFirst;\n\t}\n\tif(nextChild == null){\n\t\tparentNode.lastChild = newLast;\n\t}else{\n\t\tnextChild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parentNode;\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);\n\t//console.log(parentNode.lastChild.nextSibling == null)\n\tif (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnewChild.firstChild = newChild.lastChild = null;\n\t}\n\treturn newChild;\n}\nfunction _appendSingleChild(parentNode,newChild){\n\tvar cp = newChild.parentNode;\n\tif(cp){\n\t\tvar pre = parentNode.lastChild;\n\t\tcp.removeChild(newChild);//remove and update\n\t\tvar pre = parentNode.lastChild;\n\t}\n\tvar pre = parentNode.lastChild;\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = pre;\n\tnewChild.nextSibling = null;\n\tif(pre){\n\t\tpre.nextSibling = newChild;\n\t}else{\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);\n\treturn newChild;\n\t//console.log(\"__aa\",parentNode.lastChild.nextSibling == null)\n}\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName :  '#document',\n\tnodeType :  DOCUMENT_NODE,\n\tdoctype :  null,\n\tdocumentElement :  null,\n\t_inc : 1,\n\t\n\tinsertBefore :  function(newChild, refChild){//raises \n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\tif(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t\t\n\t\treturn _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;\n\t},\n\tremoveChild :  function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\t\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.target = target;\n\t\tnode.nodeValue= node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\t\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\t\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\t\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t\t\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\t\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9?this.documentElement:this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\t\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\nfunction needNamespaceDefine(node,isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix||'';\n\tvar uri = node.namespaceURI;\n\tif (!prefix && !uri){\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === \"http://www.w3.org/XML/1998/namespace\" \n\t\t|| uri == 'http://www.w3.org/2000/xmlns/'){\n\t\treturn false;\n\t}\n\t\n\tvar i = visibleNamespaces.length \n\t//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\t//console.log(node.nodeType,node.tagName,ns.prefix,prefix)\n\t\tif (ns.prefix == prefix){\n\t\t\treturn ns.namespace != uri;\n\t\t}\n\t}\n\t//console.log(isHTML,uri,prefix=='')\n\t//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){\n\t//\treturn false;\n\t//}\n\t//node.flag = '11111'\n\t//console.error(3,true,node.flag,node.prefix,node.namespaceURI)\n\treturn true;\n}\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tif (!visibleNamespaces) visibleNamespaces = [];\n\t\tvar startVisibleNamespaces = visibleNamespaces.length;\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\t\t\n\t\tisHTML =  (htmlns === node.namespaceURI) ||isHTML \n\t\tbuf.push('<',nodeName);\n\t\t\n\t\t\n\t\t\n\t\tfor(var i=0;i<len;i++){\n\t\t\t// add namespaces for attributes\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (attr.prefix == 'xmlns') {\n\t\t\t\tvisibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });\n\t\t\t}else if(attr.nodeName == 'xmlns'){\n\t\t\t\tvisibleNamespaces.push({ prefix: '', namespace: attr.value });\n\t\t\t}\n\t\t}\n\t\tfor(var i=0;i<len;i++){\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {\n\t\t\t\tvar prefix = attr.prefix||'';\n\t\t\t\tvar uri = attr.namespaceURI;\n\t\t\t\tvar ns = prefix ? ' xmlns:' + prefix : \" xmlns\";\n\t\t\t\tbuf.push(ns, '=\"' , uri , '\"');\n\t\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t\t}\n\t\t\tserializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t}\n\t\t// add namespace for current node\t\t\n\t\tif (needNamespaceDefine(node,isHTML, visibleNamespaces)) {\n\t\t\tvar prefix = node.prefix||'';\n\t\t\tvar uri = node.namespaceURI;\n\t\t\tvar ns = prefix ? ' xmlns:' + prefix : \" xmlns\";\n\t\t\tbuf.push(ns, '=\"' , uri , '\"');\n\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t}\n\t\t\n\t\tif(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){\n\t\t\tbuf.push('>');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('</',nodeName,'>');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn buf.push(' ',node.name,'=\"',node.value.replace(/[<&\"]/g,_xmlEncoder),'\"');\n\tcase TEXT_NODE:\n\t\treturn buf.push(node.data.replace(/[<&]/g,_xmlEncoder));\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '<![CDATA[',node.data,']]>');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"<!--\",node.data,\"-->\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('<!DOCTYPE ',node.name);\n\t\tif(pubid){\n\t\t\tbuf.push(' PUBLIC \"',pubid);\n\t\t\tif (sysid && sysid!='.') {\n\t\t\t\tbuf.push( '\" \"',sysid);\n\t\t\t}\n\t\t\tbuf.push('\">');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM \"',sysid,'\">');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"<?\",node.target,\" \",node.data,\"?>\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i<len;i++){\n\t\t\t//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));\n\t\t//}\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tbreak;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t\tbreak;\n\t//case ENTITY_REFERENCE_NODE:\n\t//case PROCESSING_INSTRUCTION_NODE:\n\t////case TEXT_NODE:\n\t//case CDATA_SECTION_NODE:\n\t//case COMMENT_NODE:\n\t//\tdeep = false;\n\t//\tbreak;\n\t//case DOCUMENT_NODE:\n\t//case DOCUMENT_TYPE_NODE:\n\t//cannot be imported.\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE：\n\t//can not hit in level3\n\t//default:throw e;\n\t}\n\tif(!node2){\n\t\tnode2 = node.cloneNode(false);//false\n\t}\n\tnode2.ownerDocument = doc;\n\tnode2.parentNode = null;\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(importNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n//\n//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,\n//\t\t\t\t\tattributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};\nfunction cloneNode(doc,node,deep){\n\tvar node2 = new node.constructor();\n\tfor(var n in node){\n\t\tvar v = node[n];\n\t\tif(typeof v != 'object' ){\n\t\t\tif(v != node2[n]){\n\t\t\t\tnode2[n] = v;\n\t\t\t}\n\t\t}\n\t}\n\tif(node.childNodes){\n\t\tnode2.childNodes = new NodeList();\n\t}\n\tnode2.ownerDocument = doc;\n\tswitch (node2.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tvar attrs\t= node.attributes;\n\t\tvar attrs2\t= node2.attributes = new NamedNodeMap();\n\t\tvar len = attrs.length\n\t\tattrs2._ownerElement = node2;\n\t\tfor(var i=0;i<len;i++){\n\t\t\tnode2.setAttributeNode(cloneNode(doc,attrs.item(i),true));\n\t\t}\n\t\tbreak;;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t}\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(cloneNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n\nfunction __set__(object,key,value){\n\tobject[key] = value\n}\n//do dynamic\ntry{\n\tif(Object.defineProperty){\n\t\tObject.defineProperty(LiveNodeList.prototype,'length',{\n\t\t\tget:function(){\n\t\t\t\t_updateLiveList(this);\n\t\t\t\treturn this.$$length;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(Node.prototype,'textContent',{\n\t\t\tget:function(){\n\t\t\t\treturn getTextContent(this);\n\t\t\t},\n\t\t\tset:function(data){\n\t\t\t\tswitch(this.nodeType){\n\t\t\t\tcase ELEMENT_NODE:\n\t\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\t\twhile(this.firstChild){\n\t\t\t\t\t\tthis.removeChild(this.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tif(data || String(data)){\n\t\t\t\t\t\tthis.appendChild(this.ownerDocument.createTextNode(data));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t//TODO:\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.value = data;\n\t\t\t\t\tthis.nodeValue = data;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t\n\t\tfunction getTextContent(node){\n\t\t\tswitch(node.nodeType){\n\t\t\tcase ELEMENT_NODE:\n\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\tvar buf = [];\n\t\t\t\tnode = node.firstChild;\n\t\t\t\twhile(node){\n\t\t\t\t\tif(node.nodeType!==7 && node.nodeType !==8){\n\t\t\t\t\t\tbuf.push(getTextContent(node));\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t}\n\t\t\t\treturn buf.join('');\n\t\t\tdefault:\n\t\t\t\treturn node.nodeValue;\n\t\t\t}\n\t\t}\n\t\t__set__ = function(object,key,value){\n\t\t\t//console.log(value)\n\t\t\tobject['$$'+key] = value\n\t\t}\n\t}\n}catch(e){//ie8\n}\n\n//if(typeof require == 'function'){\n\texports.DOMImplementation = DOMImplementation;\n\texports.XMLSerializer = XMLSerializer;\n//}\n\n},{}],272:[function(require,module,exports){\n//[4]   \tNameStartChar\t   ::=   \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n//[4a]   \tNameChar\t   ::=   \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\n//[5]   \tName\t   ::=   \tNameStartChar (NameChar)*\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\n\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\nvar S_TAG = 0;//tag name offerring\nvar S_ATTR = 1;//attr name offerring \nvar S_ATTR_SPACE=2;//attr name end and space offer\nvar S_EQ = 3;//=space?\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\nvar S_TAG_CLOSE = 7;//closed el<el />\n\nfunction XMLReader(){\n\t\n}\n\nXMLReader.prototype = {\n\tparse:function(source,defaultNSMap,entityMap){\n\t\tvar domBuilder = this.domBuilder;\n\t\tdomBuilder.startDocument();\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\n\t\tparse(source,defaultNSMap,entityMap,\n\t\t\t\tdomBuilder,this.errorHandler);\n\t\tdomBuilder.endDocument();\n\t}\n}\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\n\tfunction fixedFromCharCode(code) {\n\t\t// String.prototype.fromCharCode does not supports\n\t\t// > 2 bytes unicode chars directly\n\t\tif (code > 0xffff) {\n\t\t\tcode -= 0x10000;\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\n\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\n\t\t} else {\n\t\t\treturn String.fromCharCode(code);\n\t\t}\n\t}\n\tfunction entityReplacer(a){\n\t\tvar k = a.slice(1,-1);\n\t\tif(k in entityMap){\n\t\t\treturn entityMap[k]; \n\t\t}else if(k.charAt(0) === '#'){\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\n\t\t}else{\n\t\t\terrorHandler.error('entity not found:'+a);\n\t\t\treturn a;\n\t\t}\n\t}\n\tfunction appendText(end){//has some bugs\n\t\tif(end>start){\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\tlocator&&position(start);\n\t\t\tdomBuilder.characters(xt,0,end-start);\n\t\t\tstart = end\n\t\t}\n\t}\n\tfunction position(p,m){\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\n\t\t\tlineStart = m.index;\n\t\t\tlineEnd = lineStart + m[0].length;\n\t\t\tlocator.lineNumber++;\n\t\t\t//console.log('line++:',locator,startPos,endPos)\n\t\t}\n\t\tlocator.columnNumber = p-lineStart+1;\n\t}\n\tvar lineStart = 0;\n\tvar lineEnd = 0;\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\n\tvar locator = domBuilder.locator;\n\t\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\n\tvar closeMap = {};\n\tvar start = 0;\n\twhile(true){\n\t\ttry{\n\t\t\tvar tagStart = source.indexOf('<',start);\n\t\t\tif(tagStart<0){\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\n\t\t\t\t\tvar doc = domBuilder.doc;\n\t    \t\t\tvar text = doc.createTextNode(source.substr(start));\n\t    \t\t\tdoc.appendChild(text);\n\t    \t\t\tdomBuilder.currentElement = text;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(tagStart>start){\n\t\t\t\tappendText(tagStart);\n\t\t\t}\n\t\t\tswitch(source.charAt(tagStart+1)){\n\t\t\tcase '/':\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\n\t\t\t\tvar tagName = source.substring(tagStart+2,end);\n\t\t\t\tvar config = parseStack.pop();\n\t\t\t\tif(end<0){\n\t\t\t\t\t\n\t        \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\n\t        \t\t//console.error('#@@@@@@'+tagName)\n\t        \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\n\t        \t\tend = tagStart+1+tagName.length;\n\t        \t}else if(tagName.match(/\\s</)){\n\t        \t\ttagName = tagName.replace(/[\\s<].*/,'');\n\t        \t\terrorHandler.error(\"end tag name: \"+tagName+' maybe not complete');\n\t        \t\tend = tagStart+1+tagName.length;\n\t\t\t\t}\n\t\t\t\t//console.error(parseStack.length,parseStack)\n\t\t\t\t//console.error(config);\n\t\t\t\tvar localNSMap = config.localNSMap;\n\t\t\t\tvar endMatch = config.tagName == tagName;\n\t\t\t\tvar endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()\n\t\t        if(endIgnoreCaseMach){\n\t\t        \tdomBuilder.endElement(config.uri,config.localName,tagName);\n\t\t\t\t\tif(localNSMap){\n\t\t\t\t\t\tfor(var prefix in localNSMap){\n\t\t\t\t\t\t\tdomBuilder.endPrefixMapping(prefix) ;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!endMatch){\n\t\t            \terrorHandler.fatalError(\"end tag name: \"+tagName+' is not match the current start tagName:'+config.tagName );\n\t\t\t\t\t}\n\t\t        }else{\n\t\t        \tparseStack.push(config)\n\t\t        }\n\t\t\t\t\n\t\t\t\tend++;\n\t\t\t\tbreak;\n\t\t\t\t// end elment\n\t\t\tcase '?':// <?...?>\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\n\t\t\t\tbreak;\n\t\t\tcase '!':// <!doctype,<![CDATA,<!--\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseDCC(source,tagStart,domBuilder,errorHandler);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tvar el = new ElementAttributes();\n\t\t\t\tvar currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\t\t\t\t//elStartEnd\n\t\t\t\tvar end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);\n\t\t\t\tvar len = el.length;\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tif(!entityMap.nbsp){\n\t\t\t\t\t\terrorHandler.warning('unclosed xml attribute');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(locator && len){\n\t\t\t\t\tvar locator2 = copyLocator(locator,{});\n\t\t\t\t\t//try{//attribute position fixed\n\t\t\t\t\tfor(var i = 0;i<len;i++){\n\t\t\t\t\t\tvar a = el[i];\n\t\t\t\t\t\tposition(a.offset);\n\t\t\t\t\t\ta.locator = copyLocator(locator,{});\n\t\t\t\t\t}\n\t\t\t\t\t//}catch(e){console.error('@@@@@'+e)}\n\t\t\t\t\tdomBuilder.locator = locator2\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\n\t\t\t\t\t\tparseStack.push(el)\n\t\t\t\t\t}\n\t\t\t\t\tdomBuilder.locator = locator;\n\t\t\t\t}else{\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\n\t\t\t\t\t\tparseStack.push(el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){\n\t\t\t\t\tend = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)\n\t\t\t\t}else{\n\t\t\t\t\tend++;\n\t\t\t\t}\n\t\t\t}\n\t\t}catch(e){\n\t\t\terrorHandler.error('element parse error: '+e)\n\t\t\t//errorHandler.error('element parse error: '+e);\n\t\t\tend = -1;\n\t\t\t//throw e;\n\t\t}\n\t\tif(end>start){\n\t\t\tstart = end;\n\t\t}else{\n\t\t\t//TODO: 这里有可能sax回退，有位置错误风险\n\t\t\tappendText(Math.max(tagStart,start)+1);\n\t\t}\n\t}\n}\nfunction copyLocator(f,t){\n\tt.lineNumber = f.lineNumber;\n\tt.columnNumber = f.columnNumber;\n\treturn t;\n}\n\n/**\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\n */\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\n\tvar attrName;\n\tvar value;\n\tvar p = ++start;\n\tvar s = S_TAG;//status\n\twhile(true){\n\t\tvar c = source.charAt(p);\n\t\tswitch(c){\n\t\tcase '=':\n\t\t\tif(s === S_ATTR){//attrName\n\t\t\t\tattrName = source.slice(start,p);\n\t\t\t\ts = S_EQ;\n\t\t\t}else if(s === S_ATTR_SPACE){\n\t\t\t\ts = S_EQ;\n\t\t\t}else{\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\n\t\t\t\tthrow new Error('attribute equal must after attrName');\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '\\'':\n\t\tcase '\"':\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\n\t\t\t\t){//equal\n\t\t\t\tif(s === S_ATTR){\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t}\n\t\t\t\tstart = p+1;\n\t\t\t\tp = source.indexOf(c,start)\n\t\t\t\tif(p>0){\n\t\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\t\tel.add(attrName,value,start-1);\n\t\t\t\t\ts = S_ATTR_END;\n\t\t\t\t}else{\n\t\t\t\t\t//fatalError: no end quot match\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\n\t\t\t\t}\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\tvalue = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\t//console.log(attrName,value,start,p)\n\t\t\t\tel.add(attrName,value,start);\n\t\t\t\t//console.dir(el)\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\n\t\t\t\tstart = p+1;\n\t\t\t\ts = S_ATTR_END\n\t\t\t}else{\n\t\t\t\t//fatalError: no equal before\n\t\t\t\tthrow new Error('attribute value must after \"=\"');\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '/':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\ts =S_TAG_CLOSE;\n\t\t\t\tel.closed = true;\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\tcase S_ATTR:\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tbreak;\n\t\t\t//case S_EQ:\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\")\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ''://end document\n\t\t\t//throw new Error('unexpected end of input')\n\t\t\terrorHandler.error('unexpected end of input');\n\t\t\tif(s == S_TAG){\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\t}\n\t\t\treturn p;\n\t\tcase '>':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\tbreak;//normal\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\n\t\t\tcase S_ATTR:\n\t\t\t\tvalue = source.slice(start,p);\n\t\t\t\tif(value.slice(-1) === '/'){\n\t\t\t\t\tel.closed  = true;\n\t\t\t\t\tvalue = value.slice(0,-1)\n\t\t\t\t}\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tif(s === S_ATTR_SPACE){\n\t\t\t\t\tvalue = attrName;\n\t\t\t\t}\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\tel.add(attrName,value.replace(/&#?\\w+;/g,entityReplacer),start)\n\t\t\t\t}else{\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\n\t\t\t\t\t}\n\t\t\t\t\tel.add(value,value,start)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase S_EQ:\n\t\t\t\tthrow new Error('attribute value missed!!');\n\t\t\t}\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\n\t\t\treturn p;\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\n\t\tcase '\\u0080':\n\t\t\tc = ' ';\n\t\tdefault:\n\t\t\tif(c<= ' '){//space\n\t\t\t\tswitch(s){\n\t\t\t\tcase S_TAG:\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR:\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t\ts = S_ATTR_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\t\t\tvar value = source.slice(start,p).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\tel.add(attrName,value,start)\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\t//case S_TAG_SPACE:\n\t\t\t\t//case S_EQ:\n\t\t\t\t//case S_ATTR_SPACE:\n\t\t\t\t//\tvoid();break;\n\t\t\t\t//case S_TAG_CLOSE:\n\t\t\t\t\t//ignore warning\n\t\t\t\t}\n\t\t\t}else{//not space\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\n\t\t\t\tswitch(s){\n\t\t\t\t//case S_TAG:void();break;\n\t\t\t\t//case S_ATTR:void();break;\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tvar tagName =  el.tagName;\n\t\t\t\t\tif(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\n\t\t\t\t\t}\n\t\t\t\t\tel.add(attrName,attrName,start);\n\t\t\t\t\tstart = p;\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\n\t\t\t\tcase S_TAG_SPACE:\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_EQ:\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_TAG_CLOSE:\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\n\t\t\t\t}\n\t\t\t}\n\t\t}//end outer switch\n\t\t//console.log('p++',p)\n\t\tp++;\n\t}\n}\n/**\n * @return true if has new namespace define\n */\nfunction appendElement(el,domBuilder,currentNSMap){\n\tvar tagName = el.tagName;\n\tvar localNSMap = null;\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\tvar i = el.length;\n\twhile(i--){\n\t\tvar a = el[i];\n\t\tvar qName = a.qName;\n\t\tvar value = a.value;\n\t\tvar nsp = qName.indexOf(':');\n\t\tif(nsp>0){\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\n\t\t\tvar localName = qName.slice(nsp+1);\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\n\t\t}else{\n\t\t\tlocalName = qName;\n\t\t\tprefix = null\n\t\t\tnsPrefix = qName === 'xmlns' && ''\n\t\t}\n\t\t//can not set prefix,because prefix !== ''\n\t\ta.localName = localName ;\n\t\t//prefix == null for no ns prefix attribute \n\t\tif(nsPrefix !== false){//hack!!\n\t\t\tif(localNSMap == null){\n\t\t\t\tlocalNSMap = {}\n\t\t\t\t//console.log(currentNSMap,0)\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\n\t\t\t\t//console.log(currentNSMap,1)\n\t\t\t}\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\n\t\t\ta.uri = 'http://www.w3.org/2000/xmlns/'\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value) \n\t\t}\n\t}\n\tvar i = el.length;\n\twhile(i--){\n\t\ta = el[i];\n\t\tvar prefix = a.prefix;\n\t\tif(prefix){//no prefix attribute has no namespace\n\t\t\tif(prefix === 'xml'){\n\t\t\t\ta.uri = 'http://www.w3.org/XML/1998/namespace';\n\t\t\t}if(prefix !== 'xmlns'){\n\t\t\t\ta.uri = currentNSMap[prefix || '']\n\t\t\t\t\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\n\t\t\t}\n\t\t}\n\t}\n\tvar nsp = tagName.indexOf(':');\n\tif(nsp>0){\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\n\t}else{\n\t\tprefix = null;//important!!\n\t\tlocalName = el.localName = tagName;\n\t}\n\t//no prefix element has default namespace\n\tvar ns = el.uri = currentNSMap[prefix || ''];\n\tdomBuilder.startElement(ns,localName,tagName,el);\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\n\t//localNSMap = null\n\tif(el.closed){\n\t\tdomBuilder.endElement(ns,localName,tagName);\n\t\tif(localNSMap){\n\t\t\tfor(prefix in localNSMap){\n\t\t\t\tdomBuilder.endPrefixMapping(prefix) \n\t\t\t}\n\t\t}\n\t}else{\n\t\tel.currentNSMap = currentNSMap;\n\t\tel.localNSMap = localNSMap;\n\t\t//parseStack.push(el);\n\t\treturn true;\n\t}\n}\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\n\tif(/^(?:script|textarea)$/i.test(tagName)){\n\t\tvar elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\n\t\tif(/[&<]/.test(text)){\n\t\t\tif(/^script$/i.test(tagName)){\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\n\t\t\t\t\t//lexHandler.startCDATA();\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\t\t//lexHandler.endCDATA();\n\t\t\t\t\treturn elEndStart;\n\t\t\t\t//}\n\t\t\t}//}else{//text area\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\treturn elEndStart;\n\t\t\t//}\n\t\t\t\n\t\t}\n\t}\n\treturn elStartEnd+1;\n}\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\n\t//if(tagName in closeMap){\n\tvar pos = closeMap[tagName];\n\tif(pos == null){\n\t\t//console.log(tagName)\n\t\tpos =  source.lastIndexOf('</'+tagName+'>')\n\t\tif(pos<elStartEnd){//忘记闭合\n\t\t\tpos = source.lastIndexOf('</'+tagName)\n\t\t}\n\t\tcloseMap[tagName] =pos\n\t}\n\treturn pos<elStartEnd;\n\t//} \n}\nfunction _copy(source,target){\n\tfor(var n in source){target[n] = source[n]}\n}\nfunction parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'\n\tvar next= source.charAt(start+2)\n\tswitch(next){\n\tcase '-':\n\t\tif(source.charAt(start + 3) === '-'){\n\t\t\tvar end = source.indexOf('-->',start+4);\n\t\t\t//append comment source.substring(4,end)//<!--\n\t\t\tif(end>start){\n\t\t\t\tdomBuilder.comment(source,start+4,end-start-4);\n\t\t\t\treturn end+3;\n\t\t\t}else{\n\t\t\t\terrorHandler.error(\"Unclosed comment\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}else{\n\t\t\t//error\n\t\t\treturn -1;\n\t\t}\n\tdefault:\n\t\tif(source.substr(start+3,6) == 'CDATA['){\n\t\t\tvar end = source.indexOf(']]>',start+9);\n\t\t\tdomBuilder.startCDATA();\n\t\t\tdomBuilder.characters(source,start+9,end-start-9);\n\t\t\tdomBuilder.endCDATA() \n\t\t\treturn end+3;\n\t\t}\n\t\t//<!DOCTYPE\n\t\t//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) \n\t\tvar matchs = split(source,start);\n\t\tvar len = matchs.length;\n\t\tif(len>1 && /!doctype/i.test(matchs[0][0])){\n\t\t\tvar name = matchs[1][0];\n\t\t\tvar pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]\n\t\t\tvar sysid = len>4 && matchs[4][0];\n\t\t\tvar lastMatch = matchs[len-1]\n\t\t\tdomBuilder.startDTD(name,pubid && pubid.replace(/^(['\"])(.*?)\\1$/,'$2'),\n\t\t\t\t\tsysid && sysid.replace(/^(['\"])(.*?)\\1$/,'$2'));\n\t\t\tdomBuilder.endDTD();\n\t\t\t\n\t\t\treturn lastMatch.index+lastMatch[0].length\n\t\t}\n\t}\n\treturn -1;\n}\n\n\n\nfunction parseInstruction(source,start,domBuilder){\n\tvar end = source.indexOf('?>',start);\n\tif(end){\n\t\tvar match = source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);\n\t\tif(match){\n\t\t\tvar len = match[0].length;\n\t\t\tdomBuilder.processingInstruction(match[1], match[2]) ;\n\t\t\treturn end+2;\n\t\t}else{//error\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * @param source\n */\nfunction ElementAttributes(source){\n\t\n}\nElementAttributes.prototype = {\n\tsetTagName:function(tagName){\n\t\tif(!tagNamePattern.test(tagName)){\n\t\t\tthrow new Error('invalid tagName:'+tagName)\n\t\t}\n\t\tthis.tagName = tagName\n\t},\n\tadd:function(qName,value,offset){\n\t\tif(!tagNamePattern.test(qName)){\n\t\t\tthrow new Error('invalid attribute:'+qName)\n\t\t}\n\t\tthis[this.length++] = {qName:qName,value:value,offset:offset}\n\t},\n\tlength:0,\n\tgetLocalName:function(i){return this[i].localName},\n\tgetLocator:function(i){return this[i].locator},\n\tgetQName:function(i){return this[i].qName},\n\tgetURI:function(i){return this[i].uri},\n\tgetValue:function(i){return this[i].value}\n//\t,getIndex:function(uri, localName)){\n//\t\tif(localName){\n//\t\t\t\n//\t\t}else{\n//\t\t\tvar qName = uri\n//\t\t}\n//\t},\n//\tgetValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},\n//\tgetType:function(uri,localName){}\n//\tgetType:function(i){},\n}\n\n\n\n\nfunction _set_proto_(thiz,parent){\n\tthiz.__proto__ = parent;\n\treturn thiz;\n}\nif(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){\n\t_set_proto_ = function(thiz,parent){\n\t\tfunction p(){};\n\t\tp.prototype = parent;\n\t\tp = new p();\n\t\tfor(parent in thiz){\n\t\t\tp[parent] = thiz[parent];\n\t\t}\n\t\treturn p;\n\t}\n}\n\nfunction split(source,start){\n\tvar match;\n\tvar buf = [];\n\tvar reg = /'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;\n\treg.lastIndex = start;\n\treg.exec(source);//skip <\n\twhile(match = reg.exec(source)){\n\t\tbuf.push(match);\n\t\tif(match[1])return buf;\n\t}\n}\n\nexports.XMLReader = XMLReader;\n\n\n},{}],273:[function(require,module,exports){\nmodule.exports={\n  \"name\": \"@jscad/web\",\n  \"version\": \"1.10.0\",\n  \"description\": \"Web UI for OpenJsCAD\",\n  \"repository\": \"https://github.com/jscad/OpenJSCAD.org\",\n  \"scripts\": {\n    \"build-web\": \"browserify src/ui/index.js -o dist/index.js -t [babelify browserify minifyify]\",\n    \"build-min\": \"browserify src/ui/min.js -o dist/min.js -t [babelify browserify minifyify]\",\n    \"build-opt\": \"browserify src/ui/opt.js -o dist/opt.js -t [babelify browserify minifyify]\",\n    \"build-umd\": \"browserify --standalone openjscad src/ui/umd.js -o dist/openjscad.umd.js -t [babelify browserify minifyify]\",\n    \"build-all\": \"npm run build-web && npm run build-min && npm run build-opt && npm run build-umd\",\n    \"start-dev\": \"budo src/ui/index.js:dist/index.js --port=8080 --live -- -b -t babelify\",\n    \"preversion\": \"npm test\",\n    \"version\": \"npm run build-all && git add -A \",\n    \"postversion\": \"git push origin master && git push origin master --tags\",\n    \"release-patch\": \"git checkout master && git pull origin master && npm version patch\",\n    \"release-minor\": \"git checkout master && git pull origin master && npm version minor\",\n    \"release-major\": \"git checkout master && git pull origin master && npm version major\",\n    \"postinstall\": \"node postInstall.js && node -e \\\"console.log('\\\\u001b[35m\\\\u001b[1mLove OpenJSCAD? You can now donate to our open collective:\\\\u001b[22m\\\\u001b[39m\\\\n > \\\\u001b[34mhttps://opencollective.com/openjscad/donate\\\\u001b[0m')\\\"\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Rene K. Mueller\",\n      \"url\": \"http://renekmueller.com\"\n    },\n    {\n      \"name\": \"z3dev\",\n      \"url\": \"http://www.z3d.jp\"\n    },\n    {\n      \"name\": \"Mark 'kaosat-dev' Moissette\",\n      \"url\": \"http://kaosat.net\"\n    }\n  ],\n  \"license\": \"MIT\",\n  \"main\": \"dist/openjscad.umd.js\",\n  \"module\": \"dist/openjscad.umd.js\",\n  \"dependencies\": {\n    \"@jscad/core\": \"^0.4.0\",\n    \"@jscad/csg\": \"0.7.0\",\n    \"@jscad/examples\": \"^1.7.2\",\n    \"@jscad/io\": \"0.4.7\",\n    \"@jscad/openscad-openjscad-translator\": \"0.0.11\",\n    \"astring\": \"^1.3.1\",\n    \"brace\": \"0.10.0\",\n    \"esprima\": \"^3.1.3\",\n    \"estraverse\": \"^4.2.0\",\n    \"most-gestures\": \"^0.3.0\",\n    \"webworkify\": \"^1.4.0\"\n  },\n  \"devDependencies\": {\n    \"ava\": \"^0.23.0\",\n    \"babel-cli\": \"^6.6.5\",\n    \"babel-core\": \"^6.2.1\",\n    \"babel-preset-es2015\": \"^6.1.18\",\n    \"babelify\": \"^7.2.0\",\n    \"browserify\": \"14.3.0\",\n    \"browserify-shim\": \"^3.8.12\",\n    \"budo\": \"10.0.3\",\n    \"copy-dir\": \"^0.3.0\",\n    \"minifyify\": \"^7.3.3\"\n  },\n  \"browserify\": {\n    \"transform\": [\n      \"browserify-shim\"\n    ]\n  },\n  \"browserify-shim\": {},\n  \"collective\": {\n    \"type\": \"opencollective\",\n    \"url\": \"https://opencollective.com/openjscad\",\n    \"logo\": \"https://opencollective.com/openjscad/logo.txt\"\n  }\n}\n\n},{}],274:[function(require,module,exports){\n'use strict';\n\n// conversion worker.js\n//\n// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// Implementation of Conversion Worker Thread\n//\n// History:\n//   2016/10/15: 0.5.2: added conversion of JSON by Z3 Dev\n//   2016/06/27: 0.5.1: refactored AMF import and export by Z3 Dev\n//   2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n// Handle the onmessage event which starts the thread\n// The \"event\" (message) is expected to have:\n//   data - an anonymous object for passing data\n//   data.url      - url of the page\n//   data.filename - name of the source file\n//   data.source   - contents of the source file\n//\n// A message is posted back to the main thread with:\n//   source    - source code for the editor (See logic below)\n//   converted - converted code for the processor (See logic below)\n// Depending on what's being converted, the two are different or the same.\n//\n// NOTE: Additional scripts (libraries) are imported only if necessary\n\nmodule.exports = function (self) {\n  self.onmessage = function (e) {\n    var r = { source: '', converted: '', filename: '', baseurl: '', cache: false };\n    if (e.data instanceof Object) {\n      var data = e.data;\n      if ('cache' in data) {\n        r.cache = data.cache; // forward cache (gMemFS) controls\n      }\n      if ('baseurl' in data) {\n        r.baseurl = data.baseurl;\n      }\n      if ('filename' in data) {\n        r.filename = data.filename;\n        if ('source' in data) {\n          var e = data.filename.toLowerCase().match(/\\.(\\w+)$/i);\n          e = RegExp.$1;\n          var options = { version: data.version };\n          switch (e) {\n            case 'amf':\n              var deserializeAmf = require('@jscad/io').amfDeSerializer.deserialize;\n              r.source = r.converted = deserializeAmf(data.source, data.filename, options);\n              break;\n            case 'gcode':\n              var deserializeGcode = require('@jscad/io').gcodeDeSerializer.deserialize;\n              r.source = r.converted = deserializeGcode(data.source, data.filename, options);\n              break;\n            case 'obj':\n              var deserializeObj = require('@jscad/io').objDeSerializer.deserialize;\n              r.source = r.converted = deserializeObj(data.source, data.filename, options);\n              break;\n            case 'scad':\n              // importScripts(r.baseurl + 'js/lib/csg.js', r.baseurl + 'js/openjscad.js', r.baseurl + 'js/openscad.js', r.baseurl + 'js/lib/underscore.js', r.baseurl + 'js/lib/openscad-openjscad-translator.js')\n              r.source = data.source;\n              if (!r.source.match(/^\\/\\/!OpenSCAD/i)) {\n                r.source = '//!OpenSCAD\\n' + data.source;\n              }\n              var openscadOpenJscadParser = require('@jscad/openscad-openjscad-translator');\n              r.converted = openscadOpenJscadParser.parse(r.source);\n              break;\n            case 'stl':\n              var deserializeStl = require('@jscad/io').stlDeSerializer.deserialize;\n              r.source = r.converted = deserializeStl(data.source, data.filename, options);\n              break;\n            case 'js':\n              r.source = r.converted = data.source;\n              break;\n            case 'jscad':\n              r.source = r.converted = data.source;\n              break;\n            case 'svg':\n              var deserializeSvg = require('@jscad/io').svgDeSerializer.deserialize;\n              r.source = r.converted = deserializeSvg(data.source, data.filename, options);\n              break;\n            case 'json':\n              var deserializeJson = require('@jscad/io').jsonDeSerializer.deserialize;\n              r.source = r.converted = deserializeJson(data.source, data.filename, options);\n              break;\n            case 'dxf':\n              var deserializeDXF = require('@jscad/io').dxfDeSerializer.deserialize;\n              r.source = r.converted = deserializeDXF(data.source, data.filename, options);\n              break;\n            default:\n              r.source = r.converted = '// Invalid file type in conversion (' + e + ')';\n              break;\n          }\n        }\n      }\n    }\n    postMessage(r);\n  };\n};\n\n},{\"@jscad/io\":94,\"@jscad/openscad-openjscad-translator\":122}],275:[function(require,module,exports){\n'use strict';\n\n// ui-worker.js\n//\n// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// History:\n//   2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n// Create an worker (thread) for converting various formats to JSCAD\n//\n// See conversion-worker.js for the conversion process\n//\nvar WebWorkify = require('webworkify');\n\nfunction createConversionWorker(onDone) {\n  //this spawns web workers that can do 'require()' calls\n  var worker = WebWorkify(require('./conversionWorker.js'));\n  // when the worker finishes\n  // - put the converted source into the editor\n  // - save the converted source into the cache (gMemFs)\n  // - set the converted source into the processor (viewer)\n  worker.onmessage = function (e) {\n    //console.log('got response from conversionWorker', e)\n    if (e.data instanceof Object) {\n      var data = e.data;\n      onDone(data);\n    }\n  };\n  return worker;\n}\n\nmodule.exports = { createConversionWorker: createConversionWorker };\n\n},{\"./conversionWorker.js\":274,\"webworkify\":269}],276:[function(require,module,exports){\n'use strict';\n\nvar generateOutputFileBlobUrl = require('../io/generateOutputFileBlobUrl');\nvar generateOutputFileFileSystem = require('../io/generateOutputFileFileSystem');\n\nfunction generateOutputFile(extension, blob, onDone, context) {\n  try {\n    generateOutputFileFileSystem(extension, blob, onDone.bind(context));\n  } catch (e) {\n    generateOutputFileBlobUrl(extension, blob, onDone.bind(context));\n  }\n}\n\nmodule.exports = {\n  generateOutputFile: generateOutputFile\n};\n\n},{\"../io/generateOutputFileBlobUrl\":277,\"../io/generateOutputFileFileSystem\":278}],277:[function(require,module,exports){\n'use strict';\n\nvar _require = require('./utils'),\n    isSafari = _require.isSafari,\n    getWindowURL = _require.getWindowURL;\n\nmodule.exports = function generateOutputFileBlobUrl(extension, blob, callback) {\n  if (isSafari()) {\n    // console.log(\"Trying download via DATA URI\")\n    // convert BLOB to DATA URI\n    var reader = new FileReader();\n    reader.onloadend = function () {\n      if (reader.result) {\n        callback(reader.result, 'openjscad.' + extension, true, true);\n      }\n    };\n    reader.readAsDataURL(blob);\n  } else {\n    // console.log(\"Trying download via BLOB URL\")\n    // convert BLOB to BLOB URL (HTML5 Standard)\n    var windowURL = getWindowURL();\n    var outputFileBlobUrl = windowURL.createObjectURL(blob);\n    if (!outputFileBlobUrl) throw new Error('createObjectURL() failed');\n    callback(outputFileBlobUrl, 'openjscad.' + extension, true, false);\n  }\n};\n\n},{\"./utils\":279}],278:[function(require,module,exports){\n'use strict';\n\nvar FileSystemApiErrorHandler = require('./utils');\n\nmodule.exports = function generateOutputFileFileSystem(extension, blob, callback) {\n  var request = window.requestFileSystem || window.webkitRequestFileSystem;\n  if (!request) {\n    throw new Error('Your browser does not support the HTML5 FileSystem API. Please try the Chrome browser instead.');\n  }\n  // console.log(\"Trying download via FileSystem API\")\n  // create a random directory name:\n  var dirname = 'OpenJsCadOutput1_' + parseInt(Math.random() * 1000000000, 10) + '_' + extension;\n  var filename = 'output.' + extension; // FIXME this should come from this.filename\n  request(TEMPORARY, 20 * 1024 * 1024, function (fs) {\n    fs.root.getDirectory(dirname, { create: true, exclusive: true }, function (dirEntry) {\n      dirEntry.getFile(filename, { create: true, exclusive: true }, function (fileEntry) {\n        fileEntry.createWriter(function (fileWriter) {\n          fileWriter.onwriteend = function (e) {\n            callback(fileEntry.toURL(), fileEntry.name);\n          };\n          fileWriter.onerror = function (e) {\n            throw new Error('Write failed: ' + e.toString());\n          };\n          fileWriter.write(blob);\n        }, function (fileerror) {\n          FileSystemApiErrorHandler(fileerror, 'createWriter');\n        });\n      }, function (fileerror) {\n        FileSystemApiErrorHandler(fileerror, \"getFile('\" + filename + \"')\");\n      });\n    }, function (fileerror) {\n      FileSystemApiErrorHandler(fileerror, \"getDirectory('\" + dirname + \"')\");\n    });\n  }, function (fileerror) {\n    FileSystemApiErrorHandler(fileerror, 'requestFileSystem');\n  });\n};\n\n},{\"./utils\":279}],279:[function(require,module,exports){\n'use strict';\n\nfunction isSafari() {\n  return (/Version\\/[\\d\\.]+.*Safari/.test(window.navigator.userAgent)\n  ); // FIXME WWW says don't use this\n}\n\nfunction getWindowURL() {\n  if (window.URL) return window.URL;else if (window.webkitURL) return window.webkitURL;else throw new Error(\"Your browser doesn't support window.URL\");\n}\n\nfunction FileSystemApiErrorHandler(fileError, operation) {\n  var errormap = {\n    1: 'NOT_FOUND_ERR',\n    2: 'SECURITY_ERR',\n    3: 'ABORT_ERR',\n    4: 'NOT_READABLE_ERR',\n    5: 'ENCODING_ERR',\n    6: 'NO_MODIFICATION_ALLOWED_ERR',\n    7: 'INVALID_STATE_ERR',\n    8: 'SYNTAX_ERR',\n    9: 'INVALID_MODIFICATION_ERR',\n    10: 'QUOTA_EXCEEDED_ERR',\n    11: 'TYPE_MISMATCH_ERR',\n    12: 'PATH_EXISTS_ERR'\n  };\n  var errname;\n  if (fileError.code in errormap) {\n    errname = errormap[fileError.code];\n  } else {\n    errname = 'Error #' + fileError.code;\n  }\n  var errtxt = 'FileSystem API error: ' + operation + ' returned error ' + errname;\n  throw new Error(errtxt);\n}\n\nfunction revokeBlobUrl(url) {\n  if (window.URL) window.URL.revokeObjectURL(url);else if (window.webkitURL) window.webkitURL.revokeObjectURL(url);else throw new Error(\"Your browser doesn't support window.URL\");\n}\n\nmodule.exports = {\n  isSafari: isSafari,\n  getWindowURL: getWindowURL,\n  revokeBlobUrl: revokeBlobUrl,\n  FileSystemApiErrorHandler: FileSystemApiErrorHandler\n};\n\n},{}],280:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction log(txt) {\n  var timeInMs = Date.now();\n  var prevtime = undefined; //OpenJsCad.log.prevLogTime\n  if (!prevtime) prevtime = timeInMs;\n  var deltatime = timeInMs - prevtime;\n  log.prevLogTime = timeInMs;\n  var timefmt = (deltatime * 0.001).toFixed(3);\n  txt = '[' + timefmt + '] ' + txt;\n  if ((typeof console === 'undefined' ? 'undefined' : _typeof(console)) == 'object' && typeof console.log == 'function') {\n    console.log(txt);\n  } else if ((typeof self === 'undefined' ? 'undefined' : _typeof(self)) == 'object' && typeof self.postMessage == 'function') {\n    self.postMessage({ cmd: 'log', txt: txt });\n  } else throw new Error('Cannot log');\n}\n\n// See Processor.setStatus()\n// Note: leave for compatibility\nfunction status(s) {\n  log(s);\n}\n\nmodule.exports = {\n  log: log,\n  status: status\n};\n\n},{}],281:[function(require,module,exports){\n'use strict';\n\nvar log = require('./log');\nvar getParameterDefinitions = require('@jscad/core/parameters/getParameterDefinitions');\nvar getParameterValues = require('@jscad/core/parameters/getParameterValuesFromUIControls');\n\nvar _require = require('@jscad/core/code-evaluation/rebuildSolids'),\n    _rebuildSolids = _require.rebuildSolids,\n    rebuildSolidsInWorker = _require.rebuildSolidsInWorker;\n\nvar _require2 = require('@jscad/core/utils/mergeSolids'),\n    mergeSolids = _require2.mergeSolids;\n\n// output handling\n\n\nvar _require3 = require('../io/generateOutputFile'),\n    _generateOutputFile = _require3.generateOutputFile;\n\nvar _require4 = require('@jscad/core/io/prepareOutput'),\n    prepareOutput = _require4.prepareOutput;\n\nvar _require5 = require('@jscad/core/io/convertToBlob'),\n    convertToBlob = _require5.convertToBlob;\n\nvar _require6 = require('@jscad/core/io/formats'),\n    formats = _require6.formats,\n    supportedFormatsForObjects = _require6.supportedFormatsForObjects;\n\nvar _require7 = require('../io/utils'),\n    revokeBlobUrl = _require7.revokeBlobUrl;\n\nvar Viewer = require('../ui/viewer/jscad-viewer');\n\nfunction Processor(containerdiv, options) {\n  if (options === undefined) options = {};\n  // the default options\n  this.opts = {\n    debug: false,\n    libraries: [],\n    openJsCadPath: '',\n    useAsync: true,\n    useSync: true,\n    viewer: {}\n    // apply all options found\n  };for (var x in this.opts) {\n    if (x in options) this.opts[x] = options[x];\n  }\n\n  this.containerdiv = containerdiv;\n\n  this.viewer = null;\n  this.builder = null;\n  this.zoomControl = null;\n\n  // callbacks\n  this.onchange = null; // function(Processor) for callback\n  this.ondownload = null; // function(Processor) for callback\n\n  this.currentObjects = []; // list of objects returned from rebuildObject*\n  this.viewedObject = null; // the object being rendered\n\n  this.selectStartPoint = 0;\n  this.selectEndPoint = 0;\n\n  this.hasOutputFile = false;\n  this.hasError = false;\n  this.paramDefinitions = [];\n  this.paramControls = [];\n  this.script = null;\n  this.formats = formats;\n\n  this.baseurl = document.location.href;\n  this.baseurl = this.baseurl.replace(/#.*$/, ''); // remove remote URL\n  this.baseurl = this.baseurl.replace(/\\?.*$/, ''); // remove parameters\n  if (this.baseurl.lastIndexOf('/') !== this.baseurl.length - 1) {\n    this.baseurl = this.baseurl.substring(0, this.baseurl.lastIndexOf('/') + 1);\n  }\n\n  // state of the processor\n  // 0 - initialized - no viewer, no parameters, etc\n  // 1 - processing  - processing JSCAD script\n  // 2 - complete    - completed processing\n  // 3 - incomplete  - incompleted due to errors in processing\n  this.state = 0; // initialized\n\n  // FIXME: UI only, seperate\n  this.createElements();\n}\n\nProcessor.mergeSolids = mergeSolids;\n\nProcessor.prototype = {\n  createElements: function createElements() {\n    var that = this; // for event handlers\n\n    while (this.containerdiv.children.length > 0) {\n      this.containerdiv.removeChild(0);\n    }\n\n    var viewerdiv = document.createElement('div');\n    viewerdiv.className = 'viewer';\n    viewerdiv.style.width = '100%';\n    viewerdiv.style.height = '100%';\n    this.containerdiv.appendChild(viewerdiv);\n    try {\n      this.viewer = new Viewer(viewerdiv, this.opts.viewer);\n    } catch (e) {\n      viewerdiv.innerHTML = '<b><br><br>Error: ' + e.toString() + '</b><br><br>A browser with support for WebGL is required';\n    }\n    // Zoom control\n    if (0) {\n      // FIXME: what the heck ?\n      var div = document.createElement('div');\n      this.zoomControl = div.cloneNode(false);\n      this.zoomControl.style.width = this.viewerwidth + 'px';\n      this.zoomControl.style.height = '20px';\n      this.zoomControl.style.backgroundColor = 'transparent';\n      this.zoomControl.style.overflowX = 'scroll';\n      div.style.width = this.viewerwidth * 11 + 'px';\n      div.style.height = '1px';\n      this.zoomControl.appendChild(div);\n      this.zoomChangedBySlider = false;\n      this.zoomControl.onscroll = function (event) {\n        var zoom = that.zoomControl;\n        var newzoom = zoom.scrollLeft / (10 * zoom.offsetWidth);\n        that.zoomChangedBySlider = true; // prevent recursion via onZoomChanged\n        that.viewer.setZoom(newzoom);\n        that.zoomChangedBySlider = false;\n      };\n      this.viewer.onZoomChanged = function () {\n        if (!that.zoomChangedBySlider) {\n          var newzoom = that.viewer.getZoom();\n          that.zoomControl.scrollLeft = newzoom * (10 * that.zoomControl.offsetWidth);\n        }\n      };\n\n      this.containerdiv.appendChild(this.zoomControl);\n      this.zoomControl.scrollLeft = this.viewer.viewpointZ / this.viewer.camera.clip.max * (this.zoomControl.scrollWidth - this.zoomControl.offsetWidth);\n\n      // end of zoom control\n    }\n\n    this.selectdiv = this.containerdiv.parentElement.querySelector('div#selectdiv');\n    if (!this.selectdiv) {\n      this.selectdiv = document.createElement('div');\n      this.selectdiv.id = 'selectdiv';\n      this.containerdiv.parentElement.appendChild(this.selectdiv);\n    }\n    var element = document.createElement('input');\n    element.setAttribute('type', 'range');\n    element.id = 'startRange';\n    element.min = 0;\n    element.max = 100;\n    element.step = 1;\n    element.oninput = function (e) {\n      if (that.state === 2) {\n        that.updateView();\n        that.updateFormatsDropdown();\n        that.updateDownloadLink();\n      }\n    };\n    this.selectdiv.appendChild(element);\n    element = document.createElement('input');\n    element.setAttribute('type', 'range');\n    element.id = 'endRange';\n    element.min = 0;\n    element.max = 100;\n    element.step = 1;\n    element.oninput = function (e) {\n      if (that.state === 2) {\n        that.updateView();\n        that.updateFormatsDropdown();\n        that.updateDownloadLink();\n      }\n    };\n    this.selectdiv.appendChild(element);\n\n    this.errordiv = this.containerdiv.parentElement.querySelector('div#errordiv');\n    if (!this.errordiv) {\n      this.errordiv = document.createElement('div');\n      this.errordiv.id = 'errordiv';\n      this.containerdiv.parentElement.appendChild(this.errordiv);\n    }\n    this.errorpre = document.createElement('pre');\n    this.errordiv.appendChild(this.errorpre);\n\n    this.statusdiv = this.containerdiv.parentElement.querySelector('div#statusdiv');\n    if (!this.statusdiv) {\n      this.statusdiv = document.createElement('div');\n      this.statusdiv.id = 'statusdiv';\n      this.containerdiv.parentElement.appendChild(this.statusdiv);\n    }\n    this.statusspan = document.createElement('span');\n    this.statusspan.id = 'statusspan';\n    this.statusbuttons = document.createElement('span');\n    this.statusbuttons.id = 'statusbuttons';\n    this.statusdiv.appendChild(this.statusspan);\n    this.statusdiv.appendChild(this.statusbuttons);\n    this.abortbutton = document.createElement('button');\n    this.abortbutton.innerHTML = 'Abort';\n    this.abortbutton.onclick = function (e) {\n      that.abort();\n    };\n    this.statusbuttons.appendChild(this.abortbutton);\n    this.formatDropdown = document.createElement('select');\n    this.formatDropdown.onchange = function (e) {\n      that.currentFormat = that.formatDropdown.options[that.formatDropdown.selectedIndex].value;\n      that.updateDownloadLink();\n    };\n    this.statusbuttons.appendChild(this.formatDropdown);\n    this.generateOutputFileButton = document.createElement('button');\n    this.generateOutputFileButton.onclick = function (e) {\n      that.generateOutputFile();\n    };\n    this.statusbuttons.appendChild(this.generateOutputFileButton);\n    this.downloadOutputFileLink = document.createElement('a');\n    this.downloadOutputFileLink.className = 'downloadOutputFileLink'; // so we can css it\n    this.statusbuttons.appendChild(this.downloadOutputFileLink);\n\n    this.parametersdiv = this.containerdiv.parentElement.querySelector('div#parametersdiv');\n    if (!this.parametersdiv) {\n      this.parametersdiv = document.createElement('div');\n      this.parametersdiv.id = 'parametersdiv';\n      this.containerdiv.parentElement.appendChild(this.parametersdiv);\n    }\n    this.parameterstable = document.createElement('table');\n    this.parameterstable.className = 'parameterstable';\n    this.parametersdiv.appendChild(this.parameterstable);\n\n    element = this.parametersdiv.querySelector('button#updateButton');\n    if (element === null) {\n      element = document.createElement('button');\n      element.innerHTML = 'Update';\n      element.id = 'updateButton';\n    }\n    element.onclick = function (e) {\n      that.rebuildSolids();\n    };\n    this.parametersdiv.appendChild(element);\n\n    // implementing instantUpdate\n    var instantUpdateCheckbox = document.createElement('input');\n    instantUpdateCheckbox.type = 'checkbox';\n    instantUpdateCheckbox.id = 'instantUpdate';\n    this.parametersdiv.appendChild(instantUpdateCheckbox);\n\n    element = document.getElementById('instantUpdateLabel');\n    if (element === null) {\n      element = document.createElement('label');\n      element.innerHTML = 'Instant Update';\n      element.id = 'instantUpdateLabel';\n    }\n    element.setAttribute('for', instantUpdateCheckbox.id);\n    this.parametersdiv.appendChild(element);\n\n    this.enableItems();\n    this.clearViewer();\n  },\n\n  setCurrentObjects: function setCurrentObjects(objs) {\n    this.currentObjects = objs; // list of CAG or CSG objects\n\n    this.updateSelection();\n    this.selectStartPoint = -1; // force view update\n    this.updateView();\n    this.updateFormatsDropdown();\n    this.updateDownloadLink();\n\n    if (this.onchange) this.onchange(this);\n  },\n\n  selectedFormat: function selectedFormat() {\n    return this.formatDropdown.options[this.formatDropdown.selectedIndex].value;\n  },\n\n  selectedFormatInfo: function selectedFormatInfo() {\n    return this.formatInfo(this.selectedFormat());\n  },\n\n  updateDownloadLink: function updateDownloadLink() {\n    var info = this.selectedFormatInfo();\n    var ext = info.extension;\n    this.generateOutputFileButton.innerHTML = 'Generate ' + ext.toUpperCase();\n  },\n\n  updateSelection: function updateSelection() {\n    var range = document.getElementById('startRange');\n    range.min = 0;\n    range.max = this.currentObjects.length - 1;\n    range.value = 0;\n    range = document.getElementById('endRange');\n    range.min = 0;\n    range.max = this.currentObjects.length - 1;\n    range.value = this.currentObjects.length - 1;\n  },\n\n  updateView: function updateView() {\n    var startpoint = parseInt(document.getElementById('startRange').value, 10);\n    var endpoint = parseInt(document.getElementById('endRange').value, 10);\n    if (startpoint === this.selectStartPoint && endpoint === this.selectEndPoint) {\n      return;\n    }\n\n    // build a list of objects to view\n    this.selectStartPoint = startpoint;\n    this.selectEndPoint = endpoint;\n    if (startpoint > endpoint) {\n      startpoint = this.selectEndPoint;endpoint = this.selectStartPoint;\n    }\n\n    var objs = this.currentObjects.slice(startpoint, endpoint + 1);\n    this.viewedObject = mergeSolids(objs);\n\n    if (this.viewer) {\n      this.viewer.setCsg(this.viewedObject);\n    }\n  },\n\n  updateFormatsDropdown: function updateFormatsDropdown() {\n    while (this.formatDropdown.options.length > 0) {\n      this.formatDropdown.options.remove(0);\n    }\n\n    var that = this;\n    var startpoint = this.selectStartPoint;\n    var endpoint = this.selectEndPoint;\n    if (startpoint > endpoint) {\n      startpoint = this.selectEndPoint;endpoint = this.selectStartPoint;\n    }\n    var objects = this.currentObjects.slice(startpoint, endpoint + 1);\n\n    this.formatInfo('stla'); // make sure the formats are initialized\n    var formats = supportedFormatsForObjects(objects).filter(function (x) {\n      return x !== 'stl';\n    }); // exclude 'stl' since it is an alias for stl(ascii) or stl(binary)\n    formats.forEach(function (format) {\n      var option = document.createElement('option');\n      var info = that.formatInfo(format);\n      option.setAttribute('value', format);\n      option.appendChild(document.createTextNode(info.displayName));\n      that.formatDropdown.options.add(option);\n    });\n  },\n\n  clearViewer: function clearViewer() {\n    this.clearOutputFile();\n    if (this.viewedObject) {\n      this.viewer.clear();\n      this.viewedObject = null;\n      if (this.onchange) this.onchange(this);\n    }\n    this.enableItems();\n  },\n\n  abort: function abort() {\n    // abort if state is processing\n    if (this.state === 1) {\n      // todo: abort\n      this.setStatus('aborted');\n      this.builder.cancel();\n      this.state = 3; // incomplete\n      this.enableItems();\n      if (this.onchange) this.onchange(this);\n    }\n  },\n\n  enableItems: function enableItems() {\n    this.abortbutton.style.display = this.state === 1 ? 'inline' : 'none';\n    this.formatDropdown.style.display = !this.hasOutputFile && this.viewedObject ? 'inline' : 'none';\n    this.generateOutputFileButton.style.display = !this.hasOutputFile && this.viewedObject ? 'inline' : 'none';\n    this.downloadOutputFileLink.style.display = this.hasOutputFile ? 'inline' : 'none';\n    this.parametersdiv.style.display = this.paramControls.length > 0 ? 'inline-block' : 'none'; // was 'block'\n    this.errordiv.style.display = this.hasError ? 'block' : 'none';\n    this.statusdiv.style.display = this.hasError ? 'none' : 'block';\n    this.selectdiv.style.display = this.currentObjects.length > 1 ? 'none' : 'none'; // FIXME once there's a data model\n  },\n\n  setMemfs: function setMemfs(memFs) {\n    this.memFs = memFs;\n  },\n\n  setDebugging: function setDebugging(debugging) {\n    this.opts.debug = debugging;\n  },\n\n  addLibrary: function addLibrary(lib) {\n    this.opts['libraries'].push(lib);\n  },\n\n  setOpenJsCadPath: function setOpenJsCadPath(path) {\n    this.opts['openJsCadPath'] = path;\n  },\n\n  setError: function setError(txt) {\n    this.hasError = txt != '';\n    this.errorpre.textContent = txt;\n    this.enableItems();\n  },\n\n  // set status and data to display\n  setStatus: function setStatus(status, data) {\n    if (typeof document !== 'undefined') {\n      var statusMap = {\n        error: data,\n        ready: 'Ready',\n        aborted: 'Aborted.',\n        busy: data + ' <img id=busy src=\\'imgs/busy.gif\\'>',\n        loading: 'Loading ' + data + ' <img id=busy src=\\'imgs/busy.gif\\'>',\n        loaded: data,\n        saving: data,\n        saved: data,\n        converting: 'Converting ' + data + ' <img id=busy src=\\'imgs/busy.gif\\'>',\n        fetching: 'Fetching ' + data + ' <img id=busy src=\\'imgs/busy.gif\\'>',\n        rendering: 'Rendering. Please wait <img id=busy src=\\'imgs/busy.gif\\'>'\n      };\n      var content = statusMap[status] ? statusMap[status] : data;\n      if (status === 'error') {\n        this.setError(data);\n      }\n\n      this.statusspan.innerHTML = content;\n    } else {\n      log(data);\n    }\n  },\n\n  // script: javascript code\n  // filename: optional, the name of the .jscad file\n  setJsCad: function setJsCad(script, filename, includePathBaseUrl) {\n    // console.log('setJsCad', script, filename)\n    if (!filename) filename = 'openjscad.jscad';\n\n    var prevParamValues = {};\n    // this will fail without existing form\n    try {\n      prevParamValues = getParameterValues(this.paramControls, /* onlyChanged */true);\n    } catch (e) {}\n\n    this.abort();\n    this.paramDefinitions = [];\n\n    this.script = null;\n    this.setError('');\n\n    var scripthaserrors = false;\n    try {\n      this.paramDefinitions = getParameterDefinitions(script);\n      this.paramControls = [];\n      this.createParamControls(prevParamValues);\n    } catch (e) {\n      this.setStatus('error', e.toString());\n      scripthaserrors = true;\n    }\n    if (!scripthaserrors) {\n      this.script = script;\n      this.filename = filename;\n      this.includePathBaseUrl = includePathBaseUrl;\n      this.rebuildSolids();\n    } else {\n      this.enableItems();\n    }\n  },\n\n  // FIXME: not needed anymore, file cache is handled elsewhere\n  getFullScript: function getFullScript() {\n    return this.script;\n    /* var script = ''\n    // add the file cache\n     script += 'var gMemFs = ['\n    if (typeof (this.memFs) === 'object') {\n      var comma = ''\n      for (var fn in this.memFs) {\n        script += comma\n        script += JSON.stringify(this.memFs[fn])\n        comma = ','\n      }\n    }\n    script += '];\\n'\n    script += '\\n'\n    // add the main script\n    script += this.script\n    return script */\n  },\n\n  rebuildSolids: function rebuildSolids() {\n    var _this = this;\n\n    // clear previous solid and settings\n    this.abort();\n    //this clears output file cache\n    this.clearOutputFile();\n    this.enableItems();\n    this.setError('');\n    this.enableItems();\n    this.setStatus('rendering');\n\n    // rebuild the solid\n\n    // prepare all parameters\n    var parameters = getParameterValues(this.paramControls);\n    var script = this.getFullScript();\n    var fullurl = this.includePathBaseUrl ? this.includePathBaseUrl + this.filename : this.filename;\n    var options = { memFs: this.memFs };\n\n    this.state = 1; // processing\n    var that = this;\n    function callback(err, objects) {\n      if (err) {\n        that.clearViewer();\n\n        if (err.stack) {\n          var errtxt = '';\n          errtxt += '\\nStack trace:\\n' + err.stack;\n          //    var errtxt = err.toString()\n        }\n        that.setStatus('error', err); // 'Error.'\n        that.state = 3; // incomplete\n      } else {\n        that.setCurrentObjects(objects);\n        that.setStatus('ready');\n        that.state = 2; // complete\n      }\n      that.enableItems();\n    }\n\n    if (this.opts.useAsync) {\n      this.builder = rebuildSolidsInWorker(script, fullurl, parameters, function (err, objects) {\n        if (err && that.opts.useSync) {\n          _this.builder = _rebuildSolids(script, fullurl, parameters, callback, options);\n        } else callback(undefined, objects);\n      }, options);\n    } else if (this.opts.useSync) {\n      this.builder = _rebuildSolids(script, fullurl, parameters, callback, options);\n    }\n  },\n\n  getState: function getState() {\n    return this.state;\n  },\n\n  clearOutputFile: function clearOutputFile() {\n    if (this.hasOutputFile) {\n      this.hasOutputFile = false;\n      if (this.outputFileDirEntry) {\n        this.outputFileDirEntry.removeRecursively(function () {});\n        this.outputFileDirEntry = null;\n      }\n      if (this.outputFileBlobUrl) {\n        revokeBlobUrl(this.outputFileBlobUrl);\n        this.outputFileBlobUrl = null;\n      }\n      this.enableItems();\n    }\n  },\n\n  generateOutputFile: function generateOutputFile() {\n    this.clearOutputFile();\n    var blob = this.currentObjectsToBlob();\n    var extension = this.selectedFormatInfo().extension;\n\n    function onDone(data, downloadAttribute, blobMode, noData) {\n      this.hasOutputFile = true;\n      this.downloadOutputFileLink.href = data;\n      if (blobMode) {\n        this.outputFileBlobUrl = data;\n      } else {\n        // FIXME: what to do with this one ?\n        // that.outputFileDirEntry = dirEntry // save for later removal\n      }\n      this.downloadOutputFileLink.innerHTML = this.downloadLinkTextForCurrentObject();\n      this.downloadOutputFileLink.setAttribute('download', downloadAttribute);\n      if (noData) {\n        this.downloadOutputFileLink.setAttribute('target', '_blank');\n      }\n      this.enableItems();\n    }\n\n    if (this.viewedObject) {\n      _generateOutputFile(extension, blob, onDone, this);\n      if (this.ondownload) this.ondownload(this);\n    }\n  },\n\n  currentObjectsToBlob: function currentObjectsToBlob() {\n    var startpoint = this.selectStartPoint;\n    var endpoint = this.selectEndPoint;\n    if (startpoint > endpoint) {\n      startpoint = this.selectEndPoint;endpoint = this.selectStartPoint;\n    }\n\n    var format = this.selectedFormat();\n\n    // if output format is jscad or js , use that, otherwise use currentObjects\n    var objects = format === 'jscad' || format === 'js' ? this.script : this.currentObjects.slice(startpoint, endpoint + 1);\n\n    return convertToBlob(prepareOutput(objects, { format: format }));\n  },\n\n  formatInfo: function formatInfo(format) {\n    return this.formats[format];\n  },\n\n  downloadLinkTextForCurrentObject: function downloadLinkTextForCurrentObject() {\n    var ext = this.selectedFormatInfo().extension;\n    return 'Download ' + ext.toUpperCase();\n  },\n\n  createGroupControl: function createGroupControl(definition) {\n    var control = document.createElement('title');\n    control.paramName = definition.name;\n    control.paramType = definition.type;\n    if ('caption' in definition) {\n      control.text = definition.caption;\n      control.className = 'caption';\n    } else {\n      control.text = definition.name;\n    }\n    return control;\n  },\n\n  createChoiceControl: function createChoiceControl(definition, prevValue) {\n    if (!('values' in definition)) {\n      throw new Error('Definition of choice parameter (' + definition.name + \") should include a 'values' parameter\");\n    }\n    var control = document.createElement('select');\n    control.paramName = definition.name;\n    control.paramType = definition.type;\n    var values = definition.values;\n    var captions;\n    if ('captions' in definition) {\n      captions = definition.captions;\n      if (captions.length != values.length) {\n        throw new Error('Definition of choice parameter (' + definition.name + \") should have the same number of items for 'captions' and 'values'\");\n      }\n    } else {\n      captions = values;\n    }\n    var selectedindex = 0;\n    for (var valueindex = 0; valueindex < values.length; valueindex++) {\n      var option = document.createElement('option');\n      option.value = values[valueindex];\n      option.text = captions[valueindex];\n      control.add(option);\n      if (prevValue !== undefined) {\n        if (prevValue === values[valueindex]) {\n          selectedindex = valueindex;\n        }\n      } else if ('default' in definition) {\n        if (definition['default'] === values[valueindex]) {\n          selectedindex = valueindex;\n        }\n      } else if ('initial' in definition) {\n        if (definition.initial === values[valueindex]) {\n          selectedindex = valueindex;\n        }\n      }\n    }\n    if (values.length > 0) {\n      control.selectedIndex = selectedindex;\n    }\n    return control;\n  },\n\n  createControl: function createControl(definition, prevValue) {\n    var control_list = [{ type: 'text', control: 'text', required: ['index', 'type', 'name'], initial: '' }, { type: 'int', control: 'number', required: ['index', 'type', 'name'], initial: 0 }, { type: 'float', control: 'number', required: ['index', 'type', 'name'], initial: 0.0 }, { type: 'number', control: 'number', required: ['index', 'type', 'name'], initial: 0.0 }, { type: 'checkbox', control: 'checkbox', required: ['index', 'type', 'name', 'checked'], initial: '' }, { type: 'radio', control: 'radio', required: ['index', 'type', 'name', 'checked'], initial: '' }, { type: 'color', control: 'color', required: ['index', 'type', 'name'], initial: '#000000' }, { type: 'date', control: 'date', required: ['index', 'type', 'name'], initial: '' }, { type: 'email', control: 'email', required: ['index', 'type', 'name'], initial: '' }, { type: 'password', control: 'password', required: ['index', 'type', 'name'], initial: '' }, { type: 'url', control: 'url', required: ['index', 'type', 'name'], initial: '' }, { type: 'slider', control: 'range', required: ['index', 'type', 'name', 'min', 'max'], initial: 0, label: true }];\n    // check for required parameters\n    if (!('type' in definition)) {\n      throw new Error('Parameter definition (' + definition.index + \") must include a 'type' parameter\");\n    }\n    var control = document.createElement('input');\n    var i, j, c_type, p_name;\n    for (i = 0; i < control_list.length; i++) {\n      c_type = control_list[i];\n      if (c_type.type === definition.type) {\n        for (j = 0; j < c_type.required.length; j++) {\n          p_name = c_type.required[j];\n          if (p_name in definition) {\n            if (p_name === 'index') continue;\n            if (p_name === 'type') continue;\n            if (p_name === 'checked') {\n              // setAttribute() only accepts strings\n              control.checked = definition.checked;\n            } else {\n              control.setAttribute(p_name, definition[p_name]);\n            }\n          } else {\n            throw new Error('Parameter definition (' + definition.index + \") must include a '\" + p_name + \"' parameter\");\n          }\n        }\n        break;\n      }\n    }\n    if (i === control_list.length) {\n      throw new Error('Parameter definition (' + definition.index + \") is not a valid 'type'\");\n    }\n    // set the control type\n    control.setAttribute('type', c_type.control);\n    // set name and type for obtaining values\n    control.paramName = definition.name;\n    control.paramType = definition.type;\n    // determine initial value of control\n    if (prevValue !== undefined) {\n      control.value = prevValue;\n    } else if ('initial' in definition) {\n      control.value = definition.initial;\n    } else if ('default' in definition) {\n      control.value = definition.default;\n    } else {\n      control.value = c_type.initial;\n    }\n    // set generic HTML attributes\n    for (var property in definition) {\n      if (definition.hasOwnProperty(property)) {\n        if (c_type.required.indexOf(property) < 0) {\n          control.setAttribute(property, definition[property]);\n        }\n      }\n    }\n    // add a label if necessary\n    if ('label' in c_type) {\n      control.label = document.createElement('label');\n      control.label.innerHTML = control.value;\n    }\n    return control;\n  },\n\n  createParamControls: function createParamControls(prevParamValues) {\n    this.parameterstable.innerHTML = '';\n    this.paramControls = [];\n\n    for (var i = 0; i < this.paramDefinitions.length; i++) {\n      var paramdef = this.paramDefinitions[i];\n      paramdef.index = i + 1;\n\n      var control = null;\n      var type = paramdef.type.toLowerCase();\n      switch (type) {\n        case 'choice':\n          control = this.createChoiceControl(paramdef, prevParamValues[paramdef.name]);\n          break;\n        case 'group':\n          control = this.createGroupControl(paramdef);\n          break;\n        default:\n          control = this.createControl(paramdef, prevParamValues[paramdef.name]);\n          break;\n      }\n      // add the appropriate element to the table\n      var tr = document.createElement('tr');\n      if (type === 'group') {\n        var th = document.createElement('th');\n        if ('className' in control) {\n          th.className = control.className;\n        }\n        th.innerHTML = control.text;\n        tr.appendChild(th);\n      } else {\n        // implementing instantUpdate\n        var that = this;\n        control.onchange = function (e) {\n          var l = e.currentTarget.nextElementSibling;\n          if (l !== null && l.nodeName === 'LABEL') {\n            l.innerHTML = e.currentTarget.value;\n          }\n          if (document.getElementById('instantUpdate').checked === true) {\n            that.rebuildSolids();\n          }\n        };\n        this.paramControls.push(control);\n\n        var td = document.createElement('td');\n        var label = paramdef.name + ':';\n        if ('caption' in paramdef) {\n          label = paramdef.caption;\n          td.className = 'caption';\n        }\n        td.innerHTML = label;\n        tr.appendChild(td);\n        td = document.createElement('td');\n        td.appendChild(control);\n        if ('label' in control) {\n          td.appendChild(control.label);\n        }\n        tr.appendChild(td);\n      }\n      this.parameterstable.appendChild(tr);\n    }\n  }\n};\n\nmodule.exports = Processor;\n\n},{\"../io/generateOutputFile\":276,\"../io/utils\":279,\"../ui/viewer/jscad-viewer\":295,\"./log\":280,\"@jscad/core/code-evaluation/rebuildSolids\":9,\"@jscad/core/io/convertToBlob\":14,\"@jscad/core/io/formats\":15,\"@jscad/core/io/prepareOutput\":16,\"@jscad/core/parameters/getParameterDefinitions\":17,\"@jscad/core/parameters/getParameterValuesFromUIControls\":18,\"@jscad/core/utils/mergeSolids\":20}],282:[function(require,module,exports){\n'use strict';\n\n// ui-cookies.js\n//\n// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// Cookie Functionality\n//\n// History:\n//   2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n// --- Dependencies\n// none\n\n// --- Global Variables\n\n// --- Global Functions\n\nfunction setCookie(name, value, days) {\n  var expires = '';\n  if (days) {\n    var date = new Date();\n    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n    expires = '; expires=' + date.toGMTString();\n  }\n  document.cookie = escape(name) + '=' + escape(value) + expires + '; path=/';\n}\n\nfunction getCookie(name) {\n  var nameEQ = escape(name) + '=';\n  var ca = document.cookie.split(';');\n  for (var i = 0; i < ca.length; i++) {\n    var c = ca[i];\n    while (c.charAt(0) === ' ') {\n      c = c.substring(1, c.length);\n    }if (c.indexOf(nameEQ) === 0) return unescape(c.substring(nameEQ.length, c.length));\n  }\n  return null;\n}\n\nfunction deleteCookie(name) {\n  setCookie(name, '', -1);\n}\n\nmodule.exports = {\n  setCookie: setCookie,\n  getCookie: getCookie,\n  deleteCookie: deleteCookie\n};\n\n},{}],283:[function(require,module,exports){\n'use strict';\n\nfunction isChrome() {\n  return window.navigator.userAgent.search('Chrome') >= 0;\n}\n\nfunction detectBrowser() {\n  if (navigator.userAgent.match(/(opera|chrome|safari|firefox|msie)/i)) {\n    return RegExp.$1.toLowerCase();\n  } else {\n    return 'unknown';\n  }\n}\n\nmodule.exports = {\n  isChrome: isChrome,\n  detectBrowser: detectBrowser\n};\n\n},{}],284:[function(require,module,exports){\n'use strict';\n\n/**\n * returns list of files whose source has changed compared to the file with the same\n * name in memFs\n * @param {Object} memFs - The reference hash of files, organized by name.\n * @param {Array} files - The list of files : need to have a source & name field.\n * @return array of files that changed\n */\nfunction changedFiles(memFs, files) {\n  return files.filter(function (file) {\n    return !memFs[file.name] || memFs[file.name].source !== file.source;\n  });\n}\n\n/**\n * finds the 'main file' in a list of files either a file called main.jscad/js OR a file containing\n * a function called main()\n * name in memFs\n * @param {Object} memFs,memFsTotal - The reference hash of files, organized by name and the total count.\n * @param {Array} files - The list of files : need to have a source & name field.\n * @return the main file, or undefined\n */\nfunction findMainFile(_ref, files) {\n  var memFs = _ref.memFs,\n      memFsTotal = _ref.memFsTotal;\n\n  var mainFile = void 0;\n  if (memFsTotal > 1) {\n    for (var filename in memFs) {\n      if (memFs[filename].name.match(/main.(jscad|js)$/)) {\n        mainFile = memFs[filename];\n        break;\n      }\n    }\n    if (!mainFile) {\n      // try again but search for the function declaration of main()\n      for (var _filename in memFs) {\n        if (memFs[_filename].source.search(/function\\s+main\\s*\\(/) >= 0) {\n          mainFile = memFs[_filename];\n          break;\n        }\n      }\n    }\n  } else {\n    mainFile = memFs[files[0].name];\n  }\n  return mainFile;\n}\n\n// FIXME : this could be usefull overall , we should reuse\nfunction isLocalMode() {\n  return document.location.toString().match(/^file\\:\\//i);\n}\n\n// FIXME: SAME\nfunction isMobile() {\n  return 'createTouch' in document;\n}\n\n// FIXME: SAME\nfunction hasDragDropSupport() {\n  return window.File && window.FileReader && window.FileList;\n}\n\nmodule.exports = {\n  changedFiles: changedFiles,\n  findMainFile: findMainFile,\n  isLocalMode: isLocalMode,\n  isMobile: isMobile,\n  hasDragDropSupport: hasDragDropSupport\n};\n\n},{}],285:[function(require,module,exports){\n'use strict';\n\n// ui-drag-drop.js\n//\n// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//    from old OpenJsCad processfile.html by Joost Nieuwenhuijse,\n//    with changes by Rene K. Mueller\n//\n// Drag'n'Drop Functionality\n//\n// History:\n//   2016/06/27: 0.5.1: refactored AMF const and export by Z3 Dev\n//   2016/05/01: 0.5.0: Enhanced drag and drop for “mobile” devices, adding a File selection button if necessary\n//   2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n//   2013/04/02: massively upgraded to support multiple-files (chrome & firefox) and entire directory drag'n'drop (chrome only)\n\n// --- Dependencies\n// * gProcessor var\n// * putSourceInEditor function\n// * #conversionWorker element with the worker code\n// * #filedropzone element\n// * #filedropzone_filled element\n// * #filedropzone_empty element\n// * #currentfile element\nvar _require = require('../../io/createConversionWorker'),\n    createConversionWorker = _require.createConversionWorker;\n\nvar _require2 = require('../editor'),\n    putSourceInEditor = _require2.putSourceInEditor; // FIXME : eeek! dependency on ui\n\nvar _require3 = require('./walkFileTree'),\n    walkFileTree = _require3.walkFileTree,\n    pseudoArraytoArray = _require3.pseudoArraytoArray,\n    isSupportedFormat = _require3.isSupportedFormat;\n\nvar _require4 = require('./helpers'),\n    findMainFile = _require4.findMainFile,\n    changedFiles = _require4.changedFiles,\n    isLocalMode = _require4.isLocalMode;\n\nvar version = require('../../../package.json').version;\n\n// --- Global Variables\nvar currentFiles = []; // linear array, contains files (to read)\nvar autoReloadTimer = null;\n\nfunction setupDragDrop(me, _ref) {\n  var memFs = _ref.memFs,\n      gProcessor = _ref.gProcessor,\n      gEditor = _ref.gEditor;\n\n  //memFs : // associated array, contains file content in source memFs[i].{name,source, fullpath}\n  var memFsCount = 0; // async reading: count of already read files\n  var memFsTotal = 0; // async reading: total files to read (Count==Total => all files read)\n  var memFsChanged = 0; // how many files have changed\n  var rootFs = []; // root(s) of folders\n  var previousScript = null;\n\n  var dropZone = document.getElementById('filedropzone');\n  var fileInput = document.getElementById('files-input');\n\n  // Check for the various File API support.\n  if (window.File && window.FileReader && window.FileList) {\n    // All the File APIs are supported.\n    if ('createTouch' in document) {\n      // This device is TOUCH sensitive so assume MOBILE, i.e. no drag and drop\n      document.getElementById('filedropzone_empty').style.display = 'none';\n      document.getElementById('filedropzone_input').style.display = 'block';\n    } else {\n      document.getElementById('filedropzone_empty').style.display = 'block';\n      document.getElementById('filedropzone_input').style.display = 'none';\n    }\n  } else {\n    throw new Error('Error: Your browser does not support the HTML File API');\n  }\n  dropZone.addEventListener('dragover', function (evt) {\n    evt.stopPropagation();\n    evt.preventDefault();\n    evt.dataTransfer.dropEffect = 'copy';\n  }, false);\n  dropZone.addEventListener('drop', handleFileSelect, false);\n  fileInput.addEventListener('change', handleInputFiles, false);\n\n  // ---------\n  function reloadAllFiles() {\n    superviseAllFiles({ forceReload: true });\n  }\n\n  // function is called once ALL files have been read (not evaluated/compiled)\n  function afterFilesRead(_ref2, files) {\n    var memFs = _ref2.memFs,\n        memFsCount = _ref2.memFsCount,\n        memFsTotal = _ref2.memFsTotal,\n        memFsChanged = _ref2.memFsChanged;\n\n    memFsCount = files.length;\n    memFsTotal = files.length;\n\n    // console.log('afterFilesRead', memFs, memFsTotal, files, 'changed',)\n    // NOTE: order is important, if you cache new data first, it will fail\n    var changedFilesCount = changedFiles(memFs, files).length;\n    // FIXME : THIRD time the SAME data is cached\n    files.forEach(function (file) {\n      return saveScript(memFs, file.name, file.source, file.fullpath);\n    });\n    var mainFile = findMainFile({ memFs: memFs, memFsTotal: memFsTotal }, files);\n\n    if (changedFilesCount > 0) {\n      if (!mainFile) throw new Error('No main.jscad found');\n      setCurrentFile(mainFile, memFsTotal);\n    }\n  }\n\n  // this handles all type of data from drag'n'drop, a list of files to read files, folders, etc\n  function handleFilesAndFolders(items) {\n    var files = walkFileTree(items);\n    files.catch(function (error) {\n      console.error('failed to read files', error);\n      if (gProcessor) gProcessor.clearViewer();\n      previousScript = null;\n    });\n    files.then(function (files) {\n      //console.log('processed files & folders', files)\n      afterFilesRead({ memFs: memFs, memFsCount: memFsCount, memFsTotal: memFsTotal, memFsChanged: memFsChanged }, files);\n    });\n  }\n\n  function handleInputFiles(evt) {\n    console.log('handleInputFiles');\n    if (evt.target.files && evt.target.files.length > 0) {\n      var items = pseudoArraytoArray(evt.target.files);\n      memFsCount = 0;\n      memFsTotal = 0;\n      memFsChanged = 0;\n\n      rootFs = items;\n      currentFiles = items;\n      handleFilesAndFolders(items);\n    } else {\n      throw new Error('Please drop and drop one or more files');\n    }\n  }\n\n  function handleFileSelect(evt) {\n    //console.log('handleFileSelect')\n    // FIXME: imperative, ugly, temporary\n    document.getElementById('reloadAllFiles').disabled = false;\n    document.getElementById('autoreload').disabled = false;\n\n    evt.stopPropagation();\n    evt.preventDefault();\n\n    if (!evt.dataTransfer) throw new Error('Event is not a datatransfer (1)');\n    if (!evt.dataTransfer.files) throw new Error('Event is not a datatransfer (2)');\n\n    memFs = [];\n\n    if (evt.dataTransfer.items && evt.dataTransfer.items.length) {\n      // full directories, let's try\n      var items = pseudoArraytoArray(evt.dataTransfer.items);\n      memFsCount = 0;\n      memFsTotal = 0;\n      memFsChanged = 0;\n\n      rootFs = items;\n      currentFiles = items;\n      handleFilesAndFolders(items);\n    }\n    // use the files list if not already processed above, this means you CANNOT use reload/autoreload\n    // TODO: reuse this to set UI , ideally using observables\n    if (!evt.dataTransfer.items) {\n      if (evt.dataTransfer.files.length > 0) {\n        var _items = pseudoArraytoArray(evt.dataTransfer.files);\n        memFsCount = 0;\n        memFsTotal = 0;\n        memFsChanged = 0;\n\n        rootFs = _items;\n        currentFiles = _items;\n        handleFilesAndFolders(_items);\n\n        // FIXME: imperative, ugly, temporary\n        document.getElementById('reloadAllFiles').disabled = true;\n        document.getElementById('autoreload').disabled = true;\n      } else {\n        throw new Error('Please drop and drop one or more files');\n      }\n    }\n  }\n\n  // set one file (the one dragged) or main.jscad\n  function setCurrentFile(file, memFsTotal) {\n    // console.log(`setCurrentFile: ${file.name}: ${file.source}`)\n    if (!isSupportedFormat(file)) {\n      throw new Error('Please drag and drop a compatible file');\n    }\n    if (file.size === 0) {\n      throw new Error('You have dropped an empty file');\n    }\n    updateDropZoneVisual(file, memFsTotal);\n    parseFile(file);\n  }\n\n  // update the dropzone visual\n  function updateDropZoneVisual(file, memFsTotal) {\n    if (file) {\n      var text = memFsTotal > 1 ? 'Current file: ' + file.name + ' (' + (memFsTotal - 1) + ' more files)' : 'Current file: ' + file.name;\n\n      document.getElementById('currentfile').innerHTML = text;\n      document.getElementById('filedropzone_filled').style.display = 'block';\n      document.getElementById('filedropzone_empty').style.display = 'none';\n      document.getElementById('filedropzone_input').style.display = 'none';\n    } else {\n      document.getElementById('filedropzone_filled').style.display = 'none';\n      if ('createTouch' in document) {\n        // This device is TOUCH sensitive so assume MOBILE, i.e. no drag and drop\n        document.getElementById('filedropzone_empty').style.display = 'none';\n        document.getElementById('filedropzone_input').style.display = 'block';\n      } else {\n        document.getElementById('filedropzone_empty').style.display = 'block';\n        document.getElementById('filedropzone_input').style.display = 'none';\n      }\n    }\n  }\n\n  // check if there were changes: (re-)load all files and check if content was changed\n  function superviseAllFiles(p) {\n    // console.log('superviseAllFiles', p)\n    memFsCount = memFsTotal = 0;\n    memFsChanged = 0;\n\n    if (p && p.forceReload) {\n      memFsChanged++;\n    }\n    // walkFileTree won't work the same way with file:// (regardless of chrome|firefox) , use alternative\n    var rawData = !rootFs || rootFs.length === 0 || me === 'web-offline' ? currentFiles : rootFs;\n    handleFilesAndFolders(rawData);\n  }\n\n  function saveScript(memFs, name, source) {\n    var fullpath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    memFs[name] = { name: name, source: source, fullpath: fullpath };\n  }\n\n  function onConversionDone(data) {\n    if ('filename' in data && 'source' in data) {\n      // console.log(\"editor\"+data.source+']')\n      putSourceInEditor(gEditor, data.source, data.filename);\n    }\n    if ('filename' in data && 'converted' in data) {\n      // console.log(\"gProcessor: \"+data.filename+\" [\"+data.converted+']')\n      if ('cache' in data && data.cache === true) {\n        saveScript(memFs, data.filename, data.converted);\n      }\n      // set the gProcessor's active memFs\n      gProcessor.setMemfs(memFs);\n      gProcessor.setJsCad(data.converted, data.filename);\n    }\n  }\n\n  // parse the file (and convert) to a renderable source (jscad)\n  function parseFile(file) {\n    var source = file.source,\n        name = file.name;\n\n    if (source === '') {\n      if (isLocalMode()) {\n        throw new Error('Could not read file. You are using a local copy of OpenJSCAD.org; if you are using Chrome, you need to launch it with the following command line option:\\n\\n--allow-file-access-from-files\\n\\notherwise the browser will not have access to uploaded files due to security restrictions.');\n      }\n      throw new Error('Could not read file.');\n    }\n    if (previousScript === source) return;\n\n    if (gProcessor) {\n      // FIXME: refactor : same code as ui/examples\n      //TODO: don't set these status manually, use something like\n      gProcessor.setStatus('converting', name);\n      var worker = createConversionWorker(onConversionDone);\n      var baseurl = gProcessor.baseurl;\n      // NOTE: cache: true is very important to control the evaluation of all cached files (code)\n      worker.postMessage({ version: version, baseurl: baseurl, source: source, filename: name, cache: true });\n    }\n  }\n\n  // FIXME: horrid hack\n  function toggleAutoReload(toggled) {\n    // console.log(\"toggleAutoReload()\")\n    if (toggled) {\n      autoReloadTimer = setInterval(function () {\n        superviseAllFiles();\n      }, 1000);\n    } else {\n      if (autoReloadTimer !== null) {\n        clearInterval(autoReloadTimer);\n        autoReloadTimer = null;\n      }\n    }\n  }\n  return {\n    toggleAutoReload: toggleAutoReload,\n    reloadAllFiles: reloadAllFiles\n  };\n}\n\nmodule.exports = {\n  setupDragDrop: setupDragDrop\n};\n\n},{\"../../../package.json\":273,\"../../io/createConversionWorker\":275,\"../editor\":287,\"./helpers\":284,\"./walkFileTree\":286}],286:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isSupportedFormat = isSupportedFormat;\nexports.pseudoArraytoArray = pseudoArraytoArray;\nexports.walkFileTree = walkFileTree;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar _require = require('@jscad/core/io/formats'),\n    conversionFormats = _require.conversionFormats;\n\nvar _require2 = require('./helpers'),\n    findMainFile = _require2.findMainFile,\n    changedFiles = _require2.changedFiles;\n\nfunction flatten(array) {\n  var _ref;\n\n  return (_ref = []).concat.apply(_ref, _toConsumableArray(array));\n}\n\nvar readFileAsync = function readFileAsync(file, fileMeta) {\n  var isBinaryFile = file.name.match(/\\.(stl|gcode)$/); // FIXME how to determine?\n  var reader = new FileReader();\n\n  return new Promise(function (resolve, reject) {\n    reader.readAsArrayBuffer(file);\n    // remove rootfolder since all files are within it\n    var fullpath = fileMeta && fileMeta.fullPath ? fileMeta.fullPath.split('/').slice(2).join('/') : '';\n\n    // convert binary to text\n    function convert(buffer) {\n      var binary = '';\n      var bytes = new Uint8Array(buffer);\n      var length = bytes.byteLength;\n      for (var i = 0; i < length; i++) {\n        binary += String.fromCharCode(bytes[i]);\n      }\n      return binary;\n    }\n\n    reader.onloadend = function (event) {\n      event.target.readyState === FileReader.DONE ? resolve({ name: file.name, fullpath: fullpath, source: convert(event.target.result) }) : reject(new Error('Failed to load file'));\n    };\n  });\n};\n\nfunction isSupportedFormat(file) {\n  var e = file.name.toLowerCase().match(/\\.(\\w+)$/i);\n  e = RegExp.$1;\n  return conversionFormats.indexOf(e) >= 0;\n  // NOTE: was incrementing memFsTotal++ ONLY if format is valid, not needed anymore as far as I know\n}\n\nfunction pseudoArraytoArray(pseudoArray) {\n  var array = [];\n  for (var i = 0; i < pseudoArray.length; i++) {\n    var item = pseudoArray[i];\n    array.push(item.webkitGetAsEntry ? item.webkitGetAsEntry() : item);\n  }\n  return array;\n}\n\nfunction processItems(items) {\n  var results = pseudoArraytoArray(items).filter(function (x) {\n    return x !== null && x !== undefined;\n  }) // skip empty items\n  .reduce(function (result, item) {\n    if (item.isFile) {\n      result.push(processFile(item));\n    } else if (item.isDirectory) {\n      result.push(processDirectory(item));\n    } else if (item instanceof File) {\n      var file = isSupportedFormat(item) ? readFileAsync(item, { fullPath: undefined }) : undefined;\n      if (!file) {\n        throw new Error('Unsuported format (or folder in Safari)!');\n      }\n      result.push(file);\n    }\n    return result;\n  }, []);\n\n  // console.warn(`ignoring Unsuported file ${fileData.name}`): this is for cases like .DSSTORE etc on mac\n  return Promise.all(results).then(function (x) {\n    return x.filter(function (x) {\n      return x !== null && x !== undefined;\n    });\n  }).then(flatten);\n}\n\nfunction processFile(fileItem) {\n  return new Promise(function (resolve, reject) {\n    fileItem.file(function (fileData) {\n      isSupportedFormat(fileData) ? resolve(readFileAsync(fileData, fileItem)) : resolve(undefined);\n    }, reject);\n  });\n}\n\nfunction processDirectory(directory) {\n  var reader = directory.createReader();\n\n  return new Promise(function (resolve, reject) {\n    reader.readEntries(function (entries) {\n      entries.length ? processItems(entries).then(resolve) : resolve(null);\n    }, reject);\n  }).then(flatten);\n}\n\n// this is the core of the drag'n'drop:\n//    1) walk the tree\n//    2) read the files (readFileAsync)\n//    3) return a flattened list of promises containing all file entries\nfunction walkFileTree(items) {\n  return processItems(items);\n}\n\n},{\"./helpers\":284,\"@jscad/core/io/formats\":15}],287:[function(require,module,exports){\n'use strict';\n\n// ui-editor.js\n//\n// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\n//\n// Editor Functionality\n//\n// History:\n//   2016/06/27: 0.5.1: added local storage by Robert Starkey\n//   2016/02/02: 0.4.0: GUI refactored, functionality split up into more files, mostly done by Z3 Dev\n\n// --- Dependencies\n// gProcessor var\n// #editor element\n\n// --- Global Variables\nvar ace = require('brace');\nrequire('brace/mode/javascript');\nrequire('brace/mode/scad');\nrequire('brace/theme/chrome');\n\nvar openscadOpenJscadParser = require('@jscad/openscad-openjscad-translator');\n\n// See http://ace.ajax.org/#nav=howto\nfunction setUpEditor(divname, gProcessor) {\n  var gEditor = null;\n  if (divname === undefined) {\n    divname = 'editor';\n  }\n  if (document.getElementById(divname) === null) return;\n\n  gEditor = ace.edit(divname);\n  gEditor.$blockScrolling = Infinity;\n  gEditor.getSession().setMode('ace/mode/javascript');\n  // gEditor.setTheme(\"ace/theme/ambiance\")\n  // gEditor.setTheme(\"ace/theme/chaos\")\n  gEditor.setTheme('ace/theme/chrome');\n  // gEditor.setTheme(\"ace/theme/clouds\")\n  // gEditor.setTheme(\"ace/theme/cobalt\")\n  // gEditor.setTheme(\"ace/theme/dawn\") // nice\n  // gEditor.setTheme(\"ace/theme/dreamweaver\")\n  // gEditor.setTheme(\"ace/theme/eclipse\")\n  // gEditor.setTheme(\"ace/theme/github\")\n  // gEditor.setTheme(\"ace/theme/idle_fingers\")\n  // gEditor.setTheme(\"ace/theme/katzenmilch\")\n  // gEditor.setTheme(\"ace/theme/kr_theme\")\n  // gEditor.setTheme(\"ace/theme/kuroir\")\n  // gEditor.setTheme(\"ace/theme/merbivore\")\n  // gEditor.setTheme(\"ace/theme/mono_industrial\")\n  // gEditor.setTheme(\"ace/theme/monokai\")\n  // gEditor.setTheme(\"ace/theme/pastel_on_dark\")\n  // gEditor.setTheme(\"ace/theme/solarized_dark\")\n  // gEditor.setTheme(\"ace/theme/solarized_light\")\n  // gEditor.setTheme(\"ace/theme/terminal\")\n  // gEditor.setTheme(\"ace/theme/textmate\")\n  // gEditor.setTheme(\"ace/theme/tomorrow\")\n  // gEditor.setTheme(\"ace/theme/tomorrow_night\")\n  // gEditor.setTheme(\"ace/theme/tomorrow_night_blue\")\n  // gEditor.setTheme(\"ace/theme/tomorrow_night_bright\")\n  // gEditor.setTheme(\"ace/theme/tomorrow_night_eighties\")\n  // gEditor.setTheme(\"ace/theme/twilight\")\n  // gEditor.setTheme(\"ace/theme/vibrant_ink\")\n  // gEditor.setTheme(\"ace/theme/xcode\")\n\n  function runExec(editor) {\n    var src = editor.getValue();\n    if (src.match(/^\\/\\/\\!OpenSCAD/i)) {\n      editor.getSession().setMode('ace/mode/scad');\n      // FIXME test for the global function first\n      src = openscadOpenJscadParser.parse(src);\n    } else {\n      editor.getSession().setMode('ace/mode/javascript');\n    }\n    if (gProcessor !== null) {\n      gProcessor.setJsCad(src);\n    }\n  }\n  // enable special keystrokes\n  gEditor.commands.addCommand({\n    name: 'setJSCAD',\n    bindKey: { win: 'F5|Shift-Return', mac: 'F5|Shift-Return' },\n    exec: runExec\n  });\n  document.body.addEventListener('keydown', function (evt) {\n    if (evt.key === 'F5') {\n      evt.preventDefault();\n      //console.log('no accidental reloading!')\n      runExec(gEditor);\n    }\n  });\n  gEditor.commands.addCommand({\n    name: 'viewerReset',\n    bindKey: { win: 'Ctrl-Return', mac: 'Command-Return' },\n    exec: function exec(editor) {\n      if (gProcessor !== null) {\n        gProcessor.viewer.resetCamera();\n      }\n    }\n  });\n  gEditor.commands.addCommand({\n    name: 'saveSource',\n    bindKey: { win: 'Ctrl-S', mac: 'Command-S' },\n    exec: function exec(editor) {\n      var src = editor.getValue();\n      localStorage.editorContent = src;\n      gProcessor.setStatus('saved', 'Saved source to browser storage');\n    }\n  });\n  gEditor.commands.addCommand({\n    name: 'loadSource',\n    bindKey: { win: 'Ctrl-L', mac: 'Command-L' },\n    exec: function exec(editor) {\n      var src = localStorage.editorContent;\n      src && src.length ? editor.setValue(src, 1) : null;\n      gEditor.commands.exec('setJSCAD', editor);\n      gProcessor.setStatus('loaded', 'Loaded source from browser storage');\n    }\n  });\n  gEditor.commands.addCommand({\n    name: 'downloadSource',\n    bindKey: { win: 'Ctrl-Shift-S', mac: 'Command-Shift-S' },\n    exec: function exec(editor) {\n      var src = editor.getValue();\n      setTimeout(function () {\n        var blob = new Blob([src], { type: 'text/plain' });\n        var object_url = URL.createObjectURL(blob);\n        var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');\n        save_link.href = object_url;\n        save_link.download = 'MyDesign.jscad';\n\n        var event = new MouseEvent('click');\n        save_link.dispatchEvent(event);\n      }, 0);\n    }\n  });\n  gEditor.commands.addCommand({\n    name: 'clearStorage',\n    bindKey: { win: 'Ctrl-Shift-\\\\', mac: 'Command-Shift-\\\\' },\n    exec: function exec(editor) {\n      var src = editor.getValue();\n      localStorage.clear();\n      gProcessor.setStatus('cleared', 'Cleared browser storage');\n    }\n  });\n\n  return gEditor;\n}\n\nfunction putSourceInEditor(gEditor, src, fn) {\n  if (gEditor !== null) {\n    gEditor.setValue(src, -1);\n    if (src.match(/^\\/\\/!OpenSCAD/i)) {\n      gEditor.getSession().setMode('ace/mode/scad');\n    } else {\n      gEditor.getSession().setMode('ace/mode/javascript');\n    }\n  }\n}\n\nfunction getSourceFromEditor(gEditor) {\n  if (gEditor !== null) {\n    return gEditor.getValue();\n  }\n  return '';\n}\n\nmodule.exports = {\n  setUpEditor: setUpEditor,\n  putSourceInEditor: putSourceInEditor,\n  getSourceFromEditor: getSourceFromEditor\n};\n\n},{\"@jscad/openscad-openjscad-translator\":122,\"brace\":146,\"brace/mode/javascript\":147,\"brace/mode/scad\":148,\"brace/theme/chrome\":149}],288:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n// Call this routine to install a handler for uncaught exceptions\nfunction AlertUserOfUncaughtExceptions() {\n  window.onerror = function (message, url, line) {\n    var msg = 'uncaught exception';\n    switch (arguments.length) {\n      case 1:\n        // message\n        msg = arguments[0];\n        break;\n      case 2:\n        // message and url\n        msg = arguments[0] + '\\n(' + arguments[1] + ')';\n        break;\n      case 3:\n        // message and url and line#\n        msg = arguments[0] + '\\nLine: ' + arguments[2] + '\\n(' + arguments[1] + ')';\n        break;\n      case 4: // message and url and line# and column#\n      case 5:\n        // message and url and line# and column# and Error\n        msg = arguments[0] + '\\nLine: ' + arguments[2] + ',col: ' + arguments[3] + '\\n(' + arguments[1] + ')';\n        break;\n      default:\n        break;\n    }\n    if ((typeof document === 'undefined' ? 'undefined' : _typeof(document)) == 'object') {\n      var e = document.getElementById('errordiv');\n      if (e !== null) {\n        e.firstChild.textContent = msg;\n        e.style.display = 'block';\n      }\n    } else {\n      console.log(msg);\n    }\n    return false;\n  };\n}\n\nmodule.exports = AlertUserOfUncaughtExceptions;\n\n},{}],289:[function(require,module,exports){\n'use strict';\n\nvar _require = require('../io/createConversionWorker'),\n    createConversionWorker = _require.createConversionWorker;\n\nvar _require2 = require('./editor'),\n    putSourceInEditor = _require2.putSourceInEditor; // FIXME : eeek! dependency on ui\n\n\nvar version = require('../../package.json').version;\n\nvar examples = [{ file: 'juice/mcgee-home-garden-v003.jscad', title: 'McGee Home Garden 3', type: 'OpenJuice', new: true }, { file: 'juice/mcgee-home-garden-v002.jscad', title: 'McGee Home Garden 2', type: 'OpenJuice', new: true }, { file: 'juice/mcgee-home-garden-v001.jscad', title: 'McGee Home Garden 1', type: 'OpenJuice', new: true }, { file: 'juice/tiny-home-backyard-v001.jscad', title: 'Tiny Home Backyard', type: 'OpenJuice', new: true }, { file: 'juice/fortunate-cabin-v001.jscad', title: 'Fortunate Cabin', type: 'OpenJuice', new: true },\n//{ file:'juice/mcgee-home-garage-v001.jscad', title: 'McGee Home Garage', type: 'OpenJuice', new: true },\n\n{ file: 'logo.jscad', title: 'OpenJSCAD.org Logo' }, { file: 'logo.amf', title: 'OpenJSCAD.org Logo', type: 'AMF' }, { file: 'example001.jscad', title: 'Sphere with cutouts', spacing: true }, { file: 'example001.scad', title: 'Sphere with cutouts', type: 'OpenSCAD' }, { file: 'example002.jscad', title: 'Cone with cutouts' }, { file: 'example002.scad', title: 'Cone with cutouts', type: 'OpenSCAD' }, { file: 'example003.jscad', title: 'Cube with cutouts' }, { file: 'example003.scad', title: 'Cube with cutouts', type: 'OpenSCAD' },\n// { file:'example004.jscad', title: 'Cube minus sphere' },\n{ file: 'example005.jscad', title: 'Pavillon' },\n\n// { file:'cnc-cutout.jscad', title: 'CNC Corner Cutouts', new: true, spacing: true },\n\n// { file:'bunch-cubes.jscad', title: 'Bunch of Cubes', new: true },\n{ file: 'transformations.jscad', title: 'Transformations', spacing: true }, { file: 'lookup.jscad', title: 'Lookup()' }, { file: 'expand.jscad', title: 'Expand()' }, { file: 'rectangular_extrude.jscad', title: 'Rectangular_extrude()' }, { file: 'linear_extrude.jscad', title: 'Linear_extrude()' }, { file: 'rotate_extrude.jscad', title: 'Rotate_extrude()' }, { file: 'polyhedron.jscad', title: 'Polyhedron()' }, { file: 'hull.jscad', title: 'Hull()' }, { file: 'chain_hull.jscad', title: 'Chain_hull()' }, { file: 'torus.jscad', title: 'Torus()' }, { file: 'text.jscad', title: 'Vector_text()', spacing: true }, { file: 'transparency.jscad', title: 'Transparency', spacing: true }, { file: 'transparency.amf', title: 'Transparency', type: 'AMF' }, { file: 'transparency2.jscad', title: 'Transparency 2' }, { file: 'slices/double-screw.jscad', title: 'SolidFromSlices(): Double Screw', spacing: true }, { file: 'slices/four2three.jscad', title: 'SolidFromSlices(): 4 to 3' }, { file: 'slices/four2three-round.jscad', title: 'SolidFromSlices(): 4 to 3 round' }, { file: 'slices/spring.jscad', title: 'SolidFromSlices(): Spring' }, { file: 'slices/tor.jscad', title: 'SolidFromSlices(): Tor (multi-color)' }, { file: 'slices/rose.jscad', title: 'SolidFromSlices(): Rose Curve' }, { file: 'servo.jscad', title: 'Interactive Params: Servo Motor', wrap: true }, { file: 'gear.jscad', title: 'Interactive Params: Gear' }, { file: 's-hook.jscad', title: 'Interactive Params: S Hook' }, { file: 'grille.jscad', title: 'Interactive Params: Grille' }, { file: 'axis-coupler.jscad', title: 'Interactive Params: Axis Coupler' }, { file: 'lamp-shade.jscad', title: 'Interactive Params: Lamp Shade' }, { file: 'celtic-knot-ring.jscad', title: 'Interactive Params: Celtic Knot Ring' }, { file: 'stepper-motor.jscad', title: 'Interactive Params: Stepper Motor' }, { file: 'iphone4-case.jscad', title: 'Interactive Params: iPhone4 Case' }, { file: 'name_plate.jscad', title: 'Interactive Params: Name Plate' }, { file: 'balloons.jscad', title: 'Interactive Params: Balloons' }, { file: 'globe.jscad', title: 'Include(): Globe', spacing: true }, { file: 'platonics/', title: 'Recursive Include(): Platonics' }, { file: 'babypanda2.svg', title: 'SVG Image: Baby Panda', spacing: true }, { file: '3d_sculpture-VernonBussler.stl', title: '3D Model: 3D Sculpture (Vernon Bussler)', type: 'STL', spacing: true }, { file: 'frog-OwenCollins.stl', title: '3D Model: Frog (Owen Collins)', type: 'STL' }, { file: 'thing_7-Zomboe.stl', title: '3D Model: Thing 7 / Flower (Zomboe)', type: 'STL' }, { file: 'yoda-RichRap.stl', title: '3D Model: Yoda (RichRap)', type: 'STL' }, { file: 'feathers_mcgraw.stl', title: '3D Model: Feathers Mcgraw (q1g0ng)', type: 'STL' }];\n\nfunction createExamples(me) {\n  if (me === 'web-online') {\n    var wrap = 26;\n    var colp = 100 / Math.floor(examples.length / wrap + 1) + '%';\n    var src = '<table width=100%><tr><td widthx=' + colp + ' valign=top>';\n    for (var i = 0; i < examples.length; i++) {\n      if (examples[i].wrap) {\n        src += '</td><td class=\"examplesSeparator\" widthx=' + colp + ' valign=top>';\n      }\n      if (examples[i].spacing) src += '<p/>';\n      src += '<li><a class=\\'example\\' data-path=' + ('examples/' + examples[i].file) + ' href=\\'#\\'> + ' + examples[i].title + ' </a>\\n';\n      if (examples[i].type) src += ' <span class=type>(' + examples[i].type + ')</span></a>';\n      if (examples[i].new) src += ' <span class=newExample>new</span></a>';\n    }\n    src += '</td></tr></table>';\n    document.querySelector('#examples').innerHTML = src;\n  } else {\n    // examples off-line won't work yet as XHR is used\n    document.querySelector('#examples').innerHTML = \"You are offline, drag'n'drop the examples from your installation\";\n  }\n}\n\nfunction fetchExample(filename, url, _ref) {\n  var memFs = _ref.memFs,\n      gProcessor = _ref.gProcessor,\n      gEditor = _ref.gEditor;\n\n  memFs = [];\n  var hasExtension = filename.match(/\\.[^\\/]+$/);\n  if (!hasExtension) // -- has no extension, ie folder referenced\n    {\n      if (!filename.match(/\\/$/)) {\n        filename += '/'; // add tailing /\n      }\n      filename += 'main.jscad';\n    }\n\n  // FIXME: same as in drag-drop !!\n  function onConversionDone(data) {\n    if ('filename' in data && 'source' in data) {\n      // console.log(\"editor\"+data.source+']')\n      putSourceInEditor(gEditor, data.source, data.filename);\n    }\n    if ('filename' in data && 'converted' in data) {\n      // console.log(\"processor: \"+data.filename+\" [\"+data.converted+']')\n      if ('cache' in data && data.cache === true) {\n        // FIXME: cannot do it from here, bloody globals\n        // saveScript(data.filename, data.converted)\n      }\n      gProcessor.setJsCad(data.converted, data.filename, data.baseurl);\n    }\n  }\n\n  if (1) {\n    // doesn't work off-line yet\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url || filename, true);\n    if (filename.match(/\\.(stl|gcode)$/i)) {\n      xhr.overrideMimeType('text/plain; charset=x-user-defined'); // our pseudo binary retrieval (works with Chrome)\n    }\n    gProcessor.setStatus('loading', filename);\n    xhr.onload = function () {\n      var source = this.responseText;\n      var baseurl = url ? url.replace(/\\/[^\\/]+$/, '/') : gProcessor.baseurl;\n      filename = url ? url.replace(/^.+\\//, '') : filename;\n\n      // FIXME: refactor : same code as ui/drag-drop\n      gProcessor.setStatus('converting', filename);\n      var worker = createConversionWorker(onConversionDone);\n      // NOTE: cache: false is set to allow evaluation of 'include' statements\n      worker.postMessage({ version: version, baseurl: baseurl, source: source, filename: filename, cache: false });\n    };\n    xhr.send();\n  }\n}\n\nvar url = require('url');\n\nfunction fetchUriParams(uri, paramName) {\n  var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n\n  var params = url.parse(uri, true);\n  var result = params.query;\n  if (paramName in result) return result[paramName];\n  return defaultValue;\n}\n\n// helper function to retrieve the nth element of an array\nfunction nth(index, data) {\n  if (!data) {\n    return undefined;\n  }\n  if (data.length < index) {\n    return undefined;\n  }\n  return data[index];\n}\n\nfunction loadViaProxy(url, _ref2) {\n  var memFs = _ref2.memFs,\n      gProcessor = _ref2.gProcessor,\n      gEditor = _ref2.gEditor,\n      proxyUrl = _ref2.proxyUrl;\n\n  var xhr = new XMLHttpRequest();\n  xhr.open('GET', proxyUrl + url, true);\n  if (url.match(/\\.(stl|gcode)$/i)) {\n    xhr.overrideMimeType('text/plain; charset=x-user-defined'); // our pseudo binary retrieval (works with Chrome)\n  }\n  gProcessor.setStatus('loading', url);\n  xhr.onload = function () {\n    var data = JSON.parse(this.responseText);\n    var baseUrl = location.protocol + '//' + location.host + location.pathname;\n    var url = baseUrl + '/' + data.file;\n    fetchExample(data.file, url, { memFs: memFs, gProcessor: gProcessor, gEditor: gEditor });\n    // document.location = docUrl.replace(/#.*$/, '#') // this won't reload the entire web-page\n  };\n  xhr.send();\n}\n\nfunction loadInitialExample(me, params) {\n  if (me === 'web-online') {\n\n    // console.log('useProxy', useProxy, 'documentUri', documentUri, 'baseUrl', baseUrl)\n    // console.log('isRemote', isRemote, 'isLocal', isLocal)\n\n    var loadLocalStorage = function loadLocalStorage(content, _ref3) {\n      var gProcessor = _ref3.gProcessor,\n          gEditor = _ref3.gEditor;\n\n      // load content from local storage if found\n      if (content && content.length) {\n        putSourceInEditor(gEditor, content, 'MyDesign.jscad');\n        gProcessor.setJsCad(content, 'MyDesign.jscad');\n      } else {\n        // gProcessor.setJsCad(getSourceFromEditor(), 'example.jscad')\n      }\n    };\n\n    var loadLocal = function loadLocal(filename, _ref4) {\n      var memFs = _ref4.memFs,\n          gProcessor = _ref4.gProcessor,\n          gEditor = _ref4.gEditor;\n\n      // console.log('loadLocal')\n      fetchExample(filename, undefined, { memFs: memFs, gProcessor: gProcessor, gEditor: gEditor });\n      // document.location = docUrl.replace(/#.*$/, '#')\n    };\n\n    var loadRemote = function loadRemote(url, _ref5) {\n      var memFs = _ref5.memFs,\n          gProcessor = _ref5.gProcessor,\n          gEditor = _ref5.gEditor,\n          proxyUrl = _ref5.proxyUrl;\n\n      // console.log('loadRemote', url)\n      gProcessor.setStatus('loading', url);\n      if (useProxy) {\n        loadViaProxy(url, { memFs: memFs, gProcessor: gProcessor, gEditor: gEditor, proxyUrl: proxyUrl });\n      } else {\n        fetchExample(url.replace(/^.+\\//, ''), url, { memFs: memFs, gProcessor: gProcessor, gEditor: gEditor });\n      }\n      // document.location = baseUrl// docUrl.replace(/#.*$/, '#') // this won't reload the entire web-page\n    };\n\n    var _url = location.href;\n\n    // const proxyPath = fetchUriParams(url, 'proxyPath', undefined)\n    var useProxy = params.proxyUrl !== undefined || document.URL.match(/#(https?:\\/\\/\\S+)$/) !== null;\n    var documentUri = fetchUriParams(_url, 'uri', undefined) || nth(1, document.URL.match(/#(https?:\\/\\/\\S+)$/)) || nth(1, document.URL.match(/#(examples\\/\\S+)$/));\n    var baseUrl = location.protocol + '//' + location.host + location.pathname;\n\n    var isRemote = documentUri ? documentUri.match(/(https?:\\/\\/\\S+)$/) !== null : false;\n    var isLocal = documentUri ? documentUri.match(/(examples\\/\\S+)$/) !== null : false;\n    var isInLocalStorage = localStorage.editorContent && localStorage.editorContent.length;\n\n    if (isRemote) // remote file referenced, e.g. http://openjscad.org/#http://somewhere/something.ext\n      {\n        loadRemote(documentUri, params);\n      } else if (isLocal) {\n      // local example, e.g. http://openjscad.org/#examples/example001.jscad\n      loadLocal(documentUri, params);\n    } else if (isInLocalStorage) {\n      loadLocalStorage(localStorage.editorContent, params);\n    } else {\n      fetchExample('examples/' + examples[0].file, undefined, params);\n    }\n  }\n}\n\nmodule.exports = {\n  createExamples: createExamples,\n  fetchExample: fetchExample,\n  loadInitialExample: loadInitialExample\n};\n\n},{\"../../package.json\":273,\"../io/createConversionWorker\":275,\"./editor\":287,\"url\":265}],290:[function(require,module,exports){\n'use strict';\n\n// == OpenJSCAD.org, Copyright (c) 2013-2016, Licensed under MIT License\nvar _require = require('./editor'),\n    setUpEditor = _require.setUpEditor;\n\nvar _require2 = require('./dragDrop/ui-drag-drop'),\n    setupDragDrop = _require2.setupDragDrop; // toggleAutoReload\n\nvar _require3 = require('./detectBrowser'),\n    detectBrowser = _require3.detectBrowser;\n\nvar _require4 = require('./urlHelpers'),\n    getUrlParams = _require4.getUrlParams;\n\nvar _require5 = require('./examples'),\n    createExamples = _require5.createExamples,\n    fetchExample = _require5.fetchExample,\n    loadInitialExample = _require5.loadInitialExample;\n\nvar _require6 = require('./options'),\n    createOptions = _require6.createOptions,\n    getOptions = _require6.getOptions;\n\nvar AlertUserOfUncaughtExceptions = require('./errorDispatcher');\n\nvar version = require('../../package.json').version;\nvar Processor = require('../jscad/processor');\n\nvar me = document.location.toString().match(/^file:/) ? 'web-offline' : 'web-online';\nvar browser = detectBrowser();\n\nvar showEditor = true;\nvar proxyUrl = './remote.pl?url=';\n// const proxyUrl = './remote.php?url='\n\nvar gProcessor = null;\nvar gEditor = null;\n\nvar memFs = []; // associated array, contains file content in source memFs[i].{name,source}\nvar currentFiles = []; // linear array, contains files (to read)\n\nfunction getElementHeight(element) {\n  return parseInt(getComputedStyle(element).height);\n}\n\nfunction getElementWidth(element) {\n  return parseInt(getComputedStyle(element).width);\n}\n\nfunction setElementHeight(element, height) {\n  element.style.height = '' + height;\n}\n\nfunction setElementWidth(element, width) {\n  element.style.width = '' + width;\n}\n\nfunction addEventListenerList(list, event, callback) {\n  Array.from(list).forEach(function (element) {\n    return element.addEventListener(event, callback);\n  });\n}\n\nfunction init() {\n  // Show all exceptions to the user: // WARNING !! this is not practical at dev time\n  AlertUserOfUncaughtExceptions();\n\n  getUrlParams(document.URL);\n\n  gProcessor = new Processor(document.getElementById('viewerContext'));\n  gEditor = setUpEditor(undefined, gProcessor);\n  // FIXME: temporary hack\n\n  // major DIVs expected\n  var about = document.getElementById('about');\n  var header = document.getElementById('header');\n  var menu = document.getElementById('menu');\n  var tail = document.getElementById('tail');\n  var footer = document.getElementById('footer');\n  var editFrame = document.getElementById('editFrame');\n\n  //createOptions()\n  //getOptions()\n\n  var options = document.getElementById('options');\n  var optionsTitle = document.getElementById('optionsTitle');\n  var plate = document.getElementById('plate');\n\n  window.addEventListener('resize', function () {\n    // adjust the relevant divs\n    if (menu) {\n      setElementHeight(menu, window.innerHeight + 'px');\n      menuHandle.style.top = '45%';\n    }\n    if (editFrame) {\n      setElementHeight(editFrame, window.innerHeight + 'px');\n    }\n  });\n\n  if (menu) {\n    var versionText = 'Version ' + version;\n    document.getElementById('menuVersion').innerHTML = versionText;\n\n    var initialMenuHidingTimeoutID = setTimeout(function () {\n      initialMenuHidingTimeoutID = null;\n      menu.style.left = '-280px';\n      _menuHandle.src = 'imgs/menuHandleVLOut.png';\n      if (examples) {\n        setElementHeight(examples, '0px');\n        examples.style.display = 'none';\n      }\n    }, 3000); // -- hide slide-menu after 3secs\n\n    var examples = document.getElementById('examples');\n    if (examples) {\n      var onLoadExampleClicked = function onLoadExampleClicked(e) {\n        // Don't need to cancel initial menu-hiding timeout, because in order\n        // to get here, user must have clicked on Examples which canceled it\n        // already.\n        if (showEditor) {\n          // FIXME test for the element\n          editor.style.display = 'inline';\n        } else {\n          editor.style.display = 'none';\n        }\n        var examplePath = e.currentTarget.dataset.path;\n        fetchExample(examplePath, undefined, { memFs: memFs, gProcessor: gProcessor, gEditor: gEditor });\n      };\n\n      createExamples(me);\n      loadInitialExample(me, { memFs: memFs, gProcessor: gProcessor, gEditor: gEditor, proxyUrl: proxyUrl });\n\n      // -- Examples\n      examplesTitle.addEventListener('click', function (e) {\n        if (initialMenuHidingTimeoutID !== null) {\n          clearTimeout(initialMenuHidingTimeoutID);\n          initialMenuHidingTimeoutID = null;\n        }\n        // When closed, examples.style.display may be '' or 'none'.\n        // When open, it's reliably 'inline', so test against that.\n        if (examples.style.display === 'inline') {\n          setElementHeight(examples, '0px');\n          examples.style.display = 'none';\n        } else {\n          setElementHeight(examples, 'auto');\n          examples.style.display = 'inline';\n        }\n      });\n\n      var list = examples.querySelectorAll('.example');\n      for (var i = 0; i < list.length; i++) {\n        list[i].addEventListener('click', onLoadExampleClicked);\n      }\n    }\n\n    var _menuHandle = document.getElementById('menuHandle');\n    _menuHandle.addEventListener('click', function (e) {\n      if (initialMenuHidingTimeoutID !== null) {\n        clearTimeout(initialMenuHidingTimeoutID);\n        initialMenuHidingTimeoutID = null;\n      }\n      // When open, left may be '' or '0' or '0px'.  When closed, it's reliably\n      // '-280px', so test against that.\n      if (menu.style.left === '-280px') {\n        // It's closed; open it.\n        menu.style.left = '0';\n        _menuHandle.src = 'imgs/menuHandleVLIn.png';\n      } else {\n        // It's open; close it, and close Examples with it.\n        menu.style.left = '-280px';\n        _menuHandle.src = 'imgs/menuHandleVLOut.png';\n        if (examples) {\n          setElementHeight(examples, '0px');\n          examples.style.display = 'none';\n        }\n      }\n    });\n  }\n\n  if (editFrame) {\n    var editHandle = document.getElementById('editHandle');\n    editHandle.addEventListener('click', function (e) {\n      if (getElementWidth(editFrame) === 0) {\n        setElementWidth(editFrame, '40%');\n        editHandle.src = 'imgs/editHandleIn.png';\n      } else {\n        setElementWidth(editFrame, '0px');\n        editHandle.src = 'imgs/editHandleOut.png';\n      }\n    });\n  }\n\n  // -- Options\n  // FIXME: these don't exist ??? where are options handled in the first place ?\n  /*optionsTitle.addEventListener('click', function (e) {\n    setElementHeight(options, 'auto')\n    editor.style.display = 'inline'\n    setElementHeight(examples, '0px')\n    editor.style.display = 'none'\n  })\n    options.addEventListener('mouseleave', function (e) {\n    setElementHeight(options, 0)\n    options.style.display = 'none'\n  })\n    optionsForm.addEventListener('change', saveOptions())\n  plate.addEventListener('change', function () {\n    if (plate.value === 'custom') {\n      plate.style.display = 'inline'\n    } else {\n      plate.style.display = 'none'\n    }\n  })*/\n\n  // about/ licence section\n  if (about) {\n    var _versionText = 'Version ' + version;\n    document.getElementById('aboutVersion').innerHTML = _versionText;\n\n    addEventListenerList(document.getElementsByClassName('navlink about'), 'click', function () {\n      about.style.display = 'inline';\n      return false;\n    });\n\n    document.querySelector('.okButton').addEventListener('click', function () {\n      about.style.display = 'none';\n      return false;\n    });\n  }\n\n  // dropzone section\n  if (tail) {\n    var dropZone = document.getElementById('filedropzone');\n    if (dropZone) {\n      var dropZoneText = browser === 'chrome' && me === 'web-online' ? ', or folder with jscad files ' : '';\n      document.getElementById('filedropzone_empty').innerHTML = 'Drop one or more supported files\\n           ' + dropZoneText + '\\n           here (see <a style=\\'font-weight: normal\\' href=\\'https://openjscad.org/dokuwiki/doku.php\\' target=_blank>details</a>)\\n           <br>or directly edit OpenJSCAD or OpenSCAD code using the editor.';\n\n      var _setupDragDrop = setupDragDrop(me, { memFs: memFs, gProcessor: gProcessor, gEditor: gEditor }),\n          toggleAutoReload = _setupDragDrop.toggleAutoReload,\n          reloadAllFiles = _setupDragDrop.reloadAllFiles;\n\n      document.getElementById('reloadAllFiles').onclick = reloadAllFiles;\n      document.getElementById('autoreload').onclick = function (e) {\n        var toggle = document.getElementById('autoreload').checked;\n        toggleAutoReload(toggle);\n      };\n    }\n  }\n\n  // version number displays\n  if (footer) {\n    var footerContent = 'OpenJSCAD.org ' + version + ', MIT License, get your own copy/clone/fork from <a target=_blank href=\"https://github.com/jscad/OpenJSCAD.org\">GitHub: OpenJSCAD</a>';\n    document.getElementById('footer').innerHTML = footerContent;\n  }\n}\n\ndocument.addEventListener('DOMContentLoaded', function (event) {\n  init();\n});\n\n},{\"../../package.json\":273,\"../jscad/processor\":281,\"./detectBrowser\":283,\"./dragDrop/ui-drag-drop\":285,\"./editor\":287,\"./errorDispatcher\":288,\"./examples\":289,\"./options\":291,\"./urlHelpers\":292}],291:[function(require,module,exports){\n'use strict';\n\nvar _require = require('./cookies'),\n    getCookie = _require.getCookie;\n\nvar options = ['renderCode', 'author', 'license'];\nvar metakeys = ['author', 'license'];\n\n//small helper function\nfunction getOrCreateElementById(id) {\n  var elt = document.getElementById(id);\n  if (!elt) {\n    elt = document.createElement('div');\n    elt.id = id;\n  }\n  return elt;\n}\n\nfunction saveOptions(metadata) {\n  for (var k in options) {\n    k = options[k];\n    setCookie(k, document.getElementById(k).value);\n    if (metakeys[k]) metadata[k] = options[k];\n  }\n}\n\nfunction getOptions() {\n  for (var k in options) {\n    k = options[k];\n    if (getCookie(k)) {\n      document.getElementById(k).value = getCookie(k);\n    }\n  }\n}\n\nfunction createOptions() {\n  var src = '';\n  src += \"<form id=optionsForm onsubmit='saveOptions(); return false'>\";\n  src += '<div class=optionGroup><b>Your Identity / Full Name & Email</b><br/>';\n  src += '<input id=author type=text name=author size=30><div class=optionInfo>Applies when you export AMF (sets metadata)</div></div>';\n\n  var licenseOptions = {\n    'Public Domain': 'Public Domain',\n    'CC BY': 'Creative Commons CC BY',\n    'CC BY-ND': 'Creative Commons CC BY-ND',\n    'CC BY-NC': 'Creative Commons CC BY-NC',\n    'CC BY-SA': 'Creative Commons CC BY-SA',\n    'CC BY-NC-SA': 'Creative Commons CC BY-NC-SA',\n    'CC BY-NC-ND': 'Creative Commons CC BY-NC-ND',\n    'MIT': 'MIT License',\n    'GPLv2': 'GPLv2',\n    'GPLv3': 'GPLv3',\n    'Copyright': 'Copyright'\n  };\n  src += '<div class=optionGroup><b>Default License</b><br/>';\n  src += '<select id=license name=license>';\n  for (var k in licenseOptions) {\n    src += \"<option value='\" + k + \"'>\" + licenseOptions[k];\n    src += '<br/>';\n  }\n  src += '</select><div class=optionInfo>Applies when you export AMF (sets metadata)</div></div>\\n';\n\n  if (0) {\n    var renderCodeOptions = {\n      shiftReturn: 'SHIFT+RETURN',\n      auto: 'Automatic'\n    };\n    src += '<div class=optionGroup><b>Render Code</b></br>';\n    src += '<select id=renderCode name=renderCode>';\n    for (var k in renderCodeOptions) {\n      src += \"<option value='\" + k + \"'>\" + renderCodeOptions[k];\n    }\n    src += '</select></div>';\n  }\n\n  if (1) {\n    var plateOptions = {\n      '200x200': '200mm x 200mm',\n      '150x150': '150mm x 150mm',\n      '100x100': '100mm x 100mm',\n      'custom': 'Custom',\n      'none': 'None'\n    };\n    src += '<div class=optionGroup><b>Plate</b></br>';\n    src += '<select id=plate name=plate>';\n    for (var k in plateOptions) {\n      src += \"<option value='\" + k + \"'>\" + plateOptions[k];\n    }\n    src += '</select><br/>';\n    src += \"<div style='display: none' id=customPlate>Custom: <input type=text id=plateCustomX name=plateCustomX size=4 value='125'> x <input type=text id=plateCustomY name=plateCustomY size=4 value='125'> [mm]</div>\";\n    src += '</div>';\n  }\n\n  if (1) {\n    var themeOptions = {\n      'bright': 'Bright',\n      'dark': 'Dark'\n    };\n    src += '<div class=optionGroup><b>Theme</b></br>';\n    src += '<select id=theme name=theme>';\n    for (var k in themeOptions) {\n      src += \"<option value='\" + k + \"'>\" + themeOptions[k];\n    }\n    src += '</select><br/>';\n    src += '</div>';\n  }\n\n  src += '</form>';\n  var elt = getOrCreateElementById('options');\n  elt.innerHTML = src;\n  return elt;\n}\n\nmodule.exports = {\n  saveOptions: saveOptions,\n  getOptions: getOptions,\n  createOptions: createOptions\n};\n\n},{\"./cookies\":282}],292:[function(require,module,exports){\n'use strict';\n\n// this is a bit of a hack; doesn't properly supports urls that start with '/'\n// but does handle relative urls containing ../\nfunction makeAbsoluteUrl(url, baseurl) {\n  if (!url.match(/^[a-z]+\\:/i)) {\n    var basecomps = baseurl.split('/');\n    if (basecomps.length > 0) {\n      basecomps.splice(basecomps.length - 1, 1);\n    }\n    var urlcomps = url.split('/');\n    var comps = basecomps.concat(urlcomps);\n    var comps2 = [];\n    comps.map(function (c) {\n      if (c == '..') {\n        if (comps2.length > 0) {\n          comps2.splice(comps2.length - 1, 1);\n        }\n      } else {\n        comps2.push(c);\n      }\n    });\n    url = '';\n    for (var i = 0; i < comps2.length; i++) {\n      if (i > 0) url += '/';\n      url += comps2[i];\n    }\n  }\n  return url;\n}\n\nfunction textToBlobUrl(txt) {\n  var windowURL = getWindowURL();\n  var blob = new Blob([txt], { type: 'application/javascript' });\n  var blobURL = windowURL.createObjectURL(blob);\n  if (!blobURL) throw new Error('createObjectURL() failed');\n  return blobURL;\n}\n\nfunction getUrlParams(url) {\n  var match = void 0;\n  var params = {};\n  var docTitle = void 0;\n  var showEditor = void 0;\n  var fetchUrl = void 0;\n\n  var paramsCandidates = url.split('&');\n  paramsCandidates.map(function (param) {\n    if (match = param.match(/^.*#?param\\[([^\\]]+)\\]=(.*)$/i)) {\n      // console.log(\"matched parameter: key=\"+decodeURIComponent(match[1])+\", val=\"+decodeURIComponent(match[2])+\"\")\n      params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);\n    } else if (match = param.match(/^.*#?showEditor=false$/i)) {\n      showEditor = false;\n    } else if (match = param.match(/^.*#?fetchUrl=(.*)$/i)) {\n      // console.log(\"matched fetchUrl=\"+match[1])\n      var urlParts = url.match(/^([^#]+)#/);\n      // derive an old-style URL for compatibility's sake\n      fetchUrl = urlParts[1] + '#' + decodeURIComponent(match[1]);\n    } else if (match = param.match(/^.*#?title=(.*)$/i)) {\n      // console.log(\"matched title=\"+decodeURIComponent(match[1]))\n      docTitle = decodeURIComponent(match[1]);\n    }\n  });\n\n  return {\n    params: params,\n    docTitle: docTitle,\n    showEditor: showEditor,\n    fetchUrl: fetchUrl\n  };\n}\n\nmodule.exports = {\n  makeAbsoluteUrl: makeAbsoluteUrl,\n  textToBlobUrl: textToBlobUrl,\n  getUrlParams: getUrlParams\n};\n\n},{}],293:[function(require,module,exports){\n'use strict';\n\n/**\n * convert color from rgba object to the array of bytes\n * @param   {object} color `{r: r, g: g, b: b, a: a}`\n * @returns {Array}  `[r, g, b, a]`\n */\nfunction colorBytes(colorRGBA) {\n  var result = [colorRGBA.r, colorRGBA.g, colorRGBA.b];\n  if (colorRGBA.a !== undefined) result.push(colorRGBA.a);\n  return result;\n}\n\nfunction colorRGBA(colorBytes) {\n  var result = { r: colorBytes[0], g: colorBytes[1], b: colorBytes[2] };\n  if (colorBytes[3] !== undefined) result.a = colorBytes[3];\n  return result;\n}\n\nfunction cssFnSingleColor(str) {\n  if (str[str.length - 1] === '%') {\n    return parseInt(str, 10) / 100;\n  } else {\n    return parseInt(str, 10) / 255;\n  }\n}\n\nfunction parseColor(color) {\n  // hsl, hsv, rgba, and #xxyyzz is supported\n  var rx = {\n    'html3': /^#([a-f0-9]{3})$/i,\n    'html6': /^#([a-f0-9]{6})$/i,\n    'fn': /^(rgb|hsl|hsv)a?\\s*\\(([^\\)]+)\\)$/i\n  };\n  var rgba;\n  var match;\n  if (match = color.match(rx.html6)) {\n    rgba = [parseInt(match[1], 16), parseInt(match[2], 16), parseInt(match[3], 16), 1];\n  } else if (match = color.match(rx.html3)) {\n    rgba = [parseInt(match[1] + match[1], 16), parseInt(match[2] + match[2], 16), parseInt(match[3] + match[3], 16), 1];\n  } else if (match = color.match(rx.fn)) {\n    if (match[1] === 'rgb' || match[1] === 'rgba') {\n      // 0-255 or percentage allowed\n      var digits = match[2].split(/\\s*,\\s*/);\n      rgba = [cssFnSingleColor(digits[0]), cssFnSingleColor(digits[1]), cssFnSingleColor(digits[2]), parseFloat(digits[3])];\n    }\n    // rgba = [match[1], match[2], match[3], match[4]]\n    // console.log (rgba)\n  }\n  return rgba;\n}\n\nmodule.exports = {\n  colorBytes: colorBytes,\n  colorRGBA: colorRGBA,\n  cssFnSingleColor: cssFnSingleColor,\n  parseColor: parseColor\n};\n\n},{}],294:[function(require,module,exports){\n'use strict';\n\nvar _require = require('most-gestures'),\n    baseInteractionsFromEvents = _require.baseInteractionsFromEvents,\n    pointerGestures = _require.pointerGestures;\n\nvar GL = require('./lightgl');\n\nvar _require2 = require('./jscad-viewer-helpers'),\n    colorBytes = _require2.colorBytes;\n\n/**\n * lightgl.js renderer for jscad viewer\n * @param {DOMElement} containerelement container element\n * @param {object}     options    options for renderer\n */\n\n\nfunction LightGLEngine(containerelement, options) {\n  this.options = options;\n\n  this.containerEl = containerelement;\n\n  this.createRenderer();\n\n  // only window resize is available, so add an event callback for the canvas\n  window.addEventListener('resize', this.handleResize.bind(this));\n};\n\nLightGLEngine.prototype = {\n  init: function init() {\n    // set initial canvas size\n    this.gl.canvas.width = this.containerEl.width;\n    this.gl.canvas.height = this.containerEl.height;\n\n    this.handleResize();\n  },\n  handleResize: function handleResize() {\n    // Set up the viewport\n\n    var canvas = this.canvas;\n\n    this.resizeCanvas();\n\n    this.gl.viewport(0, 0, canvas.width, canvas.height); // pixels\n    this.gl.matrixMode(this.gl.PROJECTION);\n    this.gl.loadIdentity();\n    this.gl.perspective(this.options.camera.fov, canvas.width / canvas.height, this.options.camera.clip.min, this.options.camera.clip.max);\n    this.gl.matrixMode(this.gl.MODELVIEW);\n\n    this.onDraw();\n  },\n  createRenderer: function createRenderer() {\n    // Set up WebGL state\n    var gl = GL.create(this.options.glOptions);\n    this.gl = gl;\n    this.gl.lineWidth(1); // don't let the library choose\n\n    this.canvas = this.gl.canvas;\n    this.meshes = [];\n    this.containerEl.appendChild(this.gl.canvas);\n\n    this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n    this.gl.clearColor.apply(this.gl, colorBytes(this.options.background.color));\n    this.gl.enable(this.gl.DEPTH_TEST);\n    this.gl.enable(this.gl.CULL_FACE);\n\n    var outlineColor = this.options.solid.outlineColor;\n\n    // Black shader for wireframe\n    this.blackShader = new GL.Shader('\\\n      void main() {\\\n        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\\n      }', '\\\n      void main() {\\\n        gl_FragColor = vec4(' + colorBytes(outlineColor).join(', ') + ');\\\n      }');\n\n    // Shader with diffuse and specular lighting\n    this.lightingShader = new GL.Shader('\\\n      varying vec3 color;\\\n      varying float alpha;\\\n      varying vec3 normal;\\\n      varying vec3 light;\\\n      void main() {\\\n        const vec3 lightDir = vec3(1.0, 2.0, 3.0) / 3.741657386773941;\\\n        light = lightDir;\\\n        color = gl_Color.rgb;\\\n        alpha = gl_Color.a;\\\n        normal = gl_NormalMatrix * gl_Normal;\\\n        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\\n      }', '\\\n      varying vec3 color;\\\n      varying float alpha;\\\n      varying vec3 normal;\\\n      varying vec3 light;\\\n      void main() {\\\n        vec3 n = normalize(normal);\\\n        float diffuse = max(0.0, dot(light, n));\\\n        float specular = pow(max(0.0, -reflect(light, n).z), 10.0) * sqrt(diffuse);\\\n        gl_FragColor = vec4(mix(color * (0.3 + 0.7 * diffuse), vec3(1.0), specular), alpha);\\\n      }');\n\n    var _this = this;\n\n    this.createControls();\n    this.resetCamera();\n\n    this.gl.ondraw = function () {\n      _this.onDraw();\n    };\n\n    // state variables, i.e. used for storing values, etc\n\n    // state of viewer\n    // 0 - initialized, no object\n    // 1 - cleared, no object\n    // 2 - showing, object\n    this.state = 0;\n    this.meshes = [];\n    this.clear(); // and draw the inital viewer\n  },\n  createControls: function createControls() {\n    var _this = this;\n\n    var shiftControl = document.createElement('div');\n    shiftControl.className = 'shift-scene';\n\n    var leftArrow = document.createElement('div');\n    leftArrow.classList.add('arrow');\n    leftArrow.classList.add('arrow-left');\n\n    var rightArrow = document.createElement('div');\n    rightArrow.classList.add('arrow');\n    rightArrow.classList.add('arrow-right');\n\n    var topArrow = document.createElement('div');\n    topArrow.classList.add('arrow');\n    topArrow.classList.add('arrow-top');\n\n    var bottomArrow = document.createElement('div');\n    bottomArrow.classList.add('arrow');\n    bottomArrow.classList.add('arrow-bottom');\n\n    shiftControl.appendChild(leftArrow);\n    shiftControl.appendChild(rightArrow);\n    shiftControl.appendChild(topArrow);\n    shiftControl.appendChild(bottomArrow);\n    this.containerEl.appendChild(shiftControl);\n\n    // we need mobile detection to change the target element of controls:\n    // otherwise we have to disable the build in html zoom on mobile , which is not always ideal\n    var isMobile = typeof window.orientation !== 'undefined';\n    var element = this.containerEl; // for now only use the canvas isMobile ? this.containerEl : document\n    var baseInteractions = baseInteractionsFromEvents(element);\n    var gestures = pointerGestures(baseInteractions);\n\n    var rotateFactor = 0.4;\n    var panFactor = 0.005;\n    var zoomFactor = 1.085;\n\n    gestures.drags.throttle(20).forEach(function (data) {\n      var delta = data.delta,\n          originalEvents = data.originalEvents;\n      var _originalEvents$ = originalEvents[0],\n          altKey = _originalEvents$.altKey,\n          shiftKey = _originalEvents$.shiftKey,\n          ctrlKey = _originalEvents$.ctrlKey,\n          metaKey = _originalEvents$.metaKey;\n\n      var button = originalEvents[0].which;\n\n      if (altKey || button === 3) // ROTATE X,Y (ALT or right mouse button)\n        {\n          _this.angleY += delta.x * rotateFactor;\n          _this.angleX += delta.y * rotateFactor;\n        } else if (shiftKey || button === 2) {\n        // PAN  (SHIFT or middle mouse button)\n        _this.viewpointX -= panFactor * delta.x * _this.viewpointZ;\n        _this.viewpointY -= panFactor * delta.y * _this.viewpointZ;\n      } else if (ctrlKey || metaKey) {\n        // ZOOM IN/OUT\n        var zoom = (-delta.x + delta.y) * 10 * zoomFactor; // arbitrary\n        var coeff = (_this.viewpointZ - _this.options.camera.clip.min) / (_this.options.camera.clip.max - _this.options.camera.clip.min);\n        zoom *= coeff;\n        _this.viewpointZ += zoom;\n        _this.viewpointZ = Math.min(Math.max(_this.viewpointZ, _this.options.camera.clip.min), _this.options.camera.clip.max);\n      } else {\n        _this.angleZ -= delta.x * rotateFactor;\n        _this.angleX += delta.y * rotateFactor;\n      }\n\n      _this.onDraw();\n    });\n\n    gestures.zooms.throttle(20).forEach(function (zoom) {\n      var coeff = (_this.viewpointZ - _this.options.camera.clip.min) / (_this.options.camera.clip.max - _this.options.camera.clip.min);\n      zoom *= zoomFactor * coeff;\n      _this.viewpointZ -= zoom; //* (this.options.camera.clip.max - this.options.camera.clip.min)\n      _this.viewpointZ = Math.min(Math.max(_this.viewpointZ, _this.options.camera.clip.min), _this.options.camera.clip.max);\n      _this.onDraw();\n    });\n\n    /*this.touch = {\n      angleX: 0,\n      angleY: 0,\n      angleZ: 0,\n      lastX: 0,\n      lastY: 0,\n      scale: 0,\n      ctrl: 0,\n      shiftTimer: null,\n      shiftControl: shiftControl,\n      cur: null // current state\n      }*/\n\n    /*\n    hammerElt.on('press', function (e) {\n      console.log('press', e.pointers, e.pointerType)\n      if (e.pointers.length === 1) {\n        var point = e.center\n        shiftControl.classList.add('active')\n        shiftControl.style.left = point.pageX + 'px'\n        shiftControl.style.top = point.pageY + 'px'\n        _this.touch.cur = 'shifting'\n      } else {\n        _this.clearShift()\n      }\n    })\n      hammerElt.on('pressup', function (e) {\n      console.log('pressup')\n      _this.clearShift()\n      if (_this.touch.cur) {\n        shiftControl.classList.remove('active')\n        shiftControl.classList.remove('shift-horizontal')\n        shiftControl.classList.remove('shift-vertical')\n      }\n    })\n      */\n\n    this.gl.ondraw = function () {\n      _this.onDraw();\n    };\n  },\n  clearShift: function clearShift() {\n    if (this.touch.shiftTimer) {\n      clearTimeout(this.touch.shiftTimer);\n      this.touch.shiftTimer = null;\n    }\n    return this;\n  },\n\n  // pan & tilt with one finger\n  onPanTilt: function onPanTilt(e) {\n    // console.log('onPanTilt')\n    this.touch.cur = 'dragging';\n    var deltaX = 0;\n    var deltaY = 0;\n    var factor = 0.3;\n    if (this.touch.lastY !== undefined) {\n      // tilt\n      deltaX = e.deltaY - this.touch.lastY;\n      this.angleX += deltaX * factor;\n      this.touch.lastY = e.deltaY;\n    }\n    if (this.touch.lastX !== undefined) {\n      // pan\n      deltaY = e.deltaX - this.touch.lastX;\n      this.angleZ += deltaY * factor;\n      this.touch.lastX = e.deltaX;\n    }\n    // console.log(delta)\n    if (deltaX || deltaY) {\n      this.onDraw();\n    }\n  },\n\n  // shift after 0.5s touch&hold\n  onShift: function onShift(e) {\n    console.log('onShift');\n    this.touch.cur = 'shifting';\n    var factor = 5e-3;\n    var delta = 0;\n\n    if (this.touch.lastY && (e.direction == 'up' || e.direction == 'down')) {\n      this.touch.shiftControl.removeClass('shift-horizontal').addClass('shift-vertical').css('top', e.center.pageY + 'px');\n      delta = e.deltaY - this.touch.lastY;\n      this.viewpointY -= factor * delta * this.viewpointZ;\n      this.angleX += delta;\n    }\n    if (this.touch.lastX && (e.direction == 'left' || e.direction == 'right')) {\n      this.touch.shiftControl.removeClass('shift-vertical').addClass('shift-horizontal').css('left', e.center.pageX + 'px');\n      delta = e.deltaX - this.touch.lastX;\n      this.viewpointX += factor * delta * this.viewpointZ;\n      this.angleZ += delta;\n    }\n    if (delta) {\n      this.onDraw();\n    }\n    this.touch.lastX = e.deltaX;\n    this.touch.lastY = e.deltaY;\n  },\n\n  onDraw: function onDraw(e) {\n    var gl = this.gl;\n    gl.makeCurrent();\n\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    gl.loadIdentity();\n    // set the perspective based on the camera postion\n    gl.translate(this.viewpointX, this.viewpointY, -this.viewpointZ);\n    gl.rotate(this.angleX, 1, 0, 0);\n    gl.rotate(this.angleY, 0, 1, 0);\n    gl.rotate(this.angleZ, 0, 0, 1);\n    // draw the solid (meshes)\n    if (this.options.solid.draw) {\n      gl.enable(gl.BLEND);\n      if (!this.options.solid.overlay) gl.enable(gl.POLYGON_OFFSET_FILL);\n      for (var i = 0; i < this.meshes.length; i++) {\n        var mesh = this.meshes[i];\n        this.lightingShader.draw(mesh, gl.TRIANGLES);\n      }\n      if (!this.options.solid.overlay) gl.disable(gl.POLYGON_OFFSET_FILL);\n      gl.disable(gl.BLEND);\n\n      if (this.options.solid.lines) {\n        if (this.options.solid.overlay) gl.disable(gl.DEPTH_TEST);\n        gl.enable(gl.BLEND);\n        for (var i = 0; i < this.meshes.length; i++) {\n          var mesh = this.meshes[i];\n          this.blackShader.draw(mesh, gl.LINES);\n        }\n        gl.disable(gl.BLEND);\n        if (this.options.solid.overlay) gl.enable(gl.DEPTH_TEST);\n      }\n    }\n    // draw the plate and the axis\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n    gl.begin(gl.LINES);\n\n    if (this.options.plate.draw) {\n      var m = this.options.plate.m; // short cut\n      var M = this.options.plate.M; // short cut\n      var size = this.options.plate.size / 2;\n      // -- minor grid\n      gl.color.apply(gl, colorBytes(m.color));\n      var mg = m.i;\n      var MG = M.i;\n      for (var x = -size; x <= size; x += mg) {\n        if (x % MG) {\n          // draw only minor grid line\n          gl.vertex(-size, x, 0);\n          gl.vertex(size, x, 0);\n          gl.vertex(x, -size, 0);\n          gl.vertex(x, size, 0);\n        }\n      }\n      // -- major grid\n      gl.color.apply(gl, colorBytes(M.color));\n      for (var x = -size; x <= size; x += MG) {\n        gl.vertex(-size, x, 0);\n        gl.vertex(size, x, 0);\n        gl.vertex(x, -size, 0);\n        gl.vertex(x, size, 0);\n      }\n    }\n    if (this.options.axis.draw) {\n      var size = this.options.plate.size / 2;\n      // X axis\n      var c = this.options.axis.x.neg;\n      gl.color(c.r, c.g, c.b, c.a); // negative direction is lighter\n      gl.vertex(-size, 0, 0);\n      gl.vertex(0, 0, 0);\n      c = this.options.axis.x.pos;\n      gl.color(c.r, c.g, c.b, c.a); // positive direction is lighter\n      gl.vertex(0, 0, 0);\n      gl.vertex(size, 0, 0);\n      // Y axis\n      c = this.options.axis.y.neg;\n      gl.color(c.r, c.g, c.b, c.a); // negative direction is lighter\n      gl.vertex(0, -size, 0);\n      gl.vertex(0, 0, 0);\n      c = this.options.axis.y.pos;\n      gl.color(c.r, c.g, c.b, c.a); // positive direction is lighter\n      gl.vertex(0, 0, 0);\n      gl.vertex(0, size, 0);\n      // Z axis\n      c = this.options.axis.z.neg;\n      gl.color(c.r, c.g, c.b, c.a); // negative direction is lighter\n      gl.vertex(0, 0, -size);\n      gl.vertex(0, 0, 0);\n      c = this.options.axis.z.pos;\n      gl.color(c.r, c.g, c.b, c.a); // positive direction is lighter\n      gl.vertex(0, 0, 0);\n      gl.vertex(0, 0, size);\n    }\n    gl.end();\n    gl.disable(gl.BLEND);\n  },\n\n  // Convert from CSG solid to an array of GL.Mesh objects\n  // limiting the number of vertices per mesh to less than 2^16\n  csgToMeshes: function csgToMeshes(initial_csg) {\n    var csg = initial_csg.canonicalized();\n    var mesh = new GL.Mesh({ normals: true, colors: true });\n    var meshes = [mesh];\n    var vertexTag2Index = {};\n    var vertices = [];\n    var colors = [];\n    var triangles = [];\n    // set to true if we want to use interpolated vertex normals\n    // this creates nice round spheres but does not represent the shape of\n    // the actual model\n    var smoothlighting = this.options.solid.smooth;\n    var polygons = csg.toPolygons();\n    var numpolygons = polygons.length;\n    for (var j = 0; j < numpolygons; j++) {\n      var polygon = polygons[j];\n      var color = colorBytes(this.options.solid.faceColor); // default color\n\n      if (polygon.shared && polygon.shared.color) {\n        color = polygon.shared.color;\n      } else if (polygon.color) {\n        color = polygon.color;\n      }\n\n      if (color.length < 4) {\n        color.push(1.0);\n      } // opaque\n\n      var indices = polygon.vertices.map(function (vertex) {\n        var vertextag = vertex.getTag();\n        var vertexindex = vertexTag2Index[vertextag];\n        var prevcolor = colors[vertexindex];\n        if (smoothlighting && vertextag in vertexTag2Index && prevcolor[0] === color[0] && prevcolor[1] === color[1] && prevcolor[2] === color[2]) {\n          vertexindex = vertexTag2Index[vertextag];\n        } else {\n          vertexindex = vertices.length;\n          vertexTag2Index[vertextag] = vertexindex;\n          vertices.push([vertex.pos.x, vertex.pos.y, vertex.pos.z]);\n          colors.push(color);\n        }\n        return vertexindex;\n      });\n      for (var i = 2; i < indices.length; i++) {\n        triangles.push([indices[0], indices[i - 1], indices[i]]);\n      }\n      // if too many vertices, start a new mesh;\n      if (vertices.length > 65000) {\n        // finalize the old mesh\n        mesh.triangles = triangles;\n        mesh.vertices = vertices;\n        mesh.colors = colors;\n        mesh.computeWireframe();\n        mesh.computeNormals();\n\n        if (mesh.vertices.length) {\n          meshes.push(mesh);\n        }\n\n        // start a new mesh\n        mesh = new GL.Mesh({ normals: true, colors: true });\n        triangles = [];\n        colors = [];\n        vertices = [];\n      }\n    }\n    // finalize last mesh\n    mesh.triangles = triangles;\n    mesh.vertices = vertices;\n    mesh.colors = colors;\n    mesh.computeWireframe();\n    mesh.computeNormals();\n\n    if (mesh.vertices.length) {\n      meshes.push(mesh);\n    }\n\n    return meshes;\n  }\n};\n\nmodule.exports = LightGLEngine;\n\n},{\"./jscad-viewer-helpers\":293,\"./lightgl\":296,\"most-gestures\":166}],295:[function(require,module,exports){\n'use strict';\n\nvar LightGLEngine = require('./jscad-viewer-lightgl');\n\nvar _require = require('./jscad-viewer-helpers'),\n    colorRGBA = _require.colorRGBA,\n    parseColor = _require.parseColor;\n\n/**\n * A viewer is a WebGL canvas that lets the user view a mesh.\n * The user can tumble it around by dragging the mouse.\n * @param {DOMElement} containerelement container element\n * @param {object}     options          options for renderer\n */\n\n\nfunction Viewer(containerelement, options) {\n  // see the defaults method on how to change these\n  this.options = Viewer.defaults();\n  // apply all options found\n  if ('camera' in options) {\n    this.setCameraOptions(options['camera']);\n  }\n  if ('plate' in options) {\n    this.setPlateOptions(options['plate']);\n  }\n  if ('axis' in options) {\n    this.setAxisOptions(options['axis']);\n  }\n  if ('solid' in options) {\n    this.setSolidOptions(options['solid']);\n  }\n  if ('glOptions' in options) {\n    this.options.glOptions = options.glOptions;\n  }\n\n  var engine;\n\n  // select drawing engine from options\n  if (this.options.engine && Viewer[this.options.engine]) {\n    engine = Viewer[this.options.engine];\n  }\n\n  // instantiate the rendering engine\n  if (!engine) {\n    engine = LightGLEngine; // || Viewer.ThreeEngine\n  }\n\n  if (!engine) {\n    throw new Error('Cannot find drawing engine, please define one via \"engine\" option');\n  }\n\n  // mixin methods\n  for (var method in Viewer.prototype) {\n    if (!(method in engine.prototype)) {\n      engine.prototype[method] = Viewer.prototype[method];\n    }\n  }\n\n  var e = new engine(containerelement, this.options);\n  e.init();\n  return e;\n};\n\n/**\n * return defaults which can be customized later\n * @returns {object} [[Description]]\n */\nViewer.defaults = function () {\n  return {\n    camera: {\n      fov: 45, // field of view\n      angle: { x: -60, y: 0, z: -45 }, // view angle about XYZ axis\n      position: { x: 0, y: 0, z: 100 }, // initial position at XYZ\n      clip: { min: 0.5, max: 1000 // rendering outside this range is clipped\n      } },\n    plate: {\n      draw: true, // draw or not\n      size: 200, // plate size (X and Y)\n      // minor grid settings\n      m: {\n        i: 1, // number of units between minor grid lines\n        color: { r: 0.8, g: 0.8, b: 0.8, a: 0.5 // color\n        } },\n      // major grid settings\n      M: {\n        i: 10, // number of units between major grid lines\n        color: { r: 0.5, g: 0.5, b: 0.5, a: 0.5 // color\n        } }\n    },\n    axis: {\n      draw: false, // draw or not\n      x: {\n        neg: { r: 1.0, g: 0.5, b: 0.5, a: 0.5 }, // color in negative direction\n        pos: { r: 1.0, g: 0, b: 0, a: 0.8 // color in positive direction\n        } },\n      y: {\n        neg: { r: 0.5, g: 1.0, b: 0.5, a: 0.5 }, // color in negative direction\n        pos: { r: 0, g: 1.0, b: 0, a: 0.8 // color in positive direction\n        } },\n      z: {\n        neg: { r: 0.5, g: 0.5, b: 1.0, a: 0.5 }, // color in negative direction\n        pos: { r: 0, g: 0, b: 1.0, a: 0.8 // color in positive direction\n        } }\n    },\n    solid: {\n      draw: true, // draw or not\n      lines: false, // draw outlines or not\n      faces: true,\n      overlay: false, // use overlay when drawing lines or not\n      smooth: false, // use smoothing or not\n      faceColor: { r: 1.0, g: 0.4, b: 1.0, a: 1.0 }, // default face color\n      outlineColor: { r: 0.0, g: 0.0, b: 0.0, a: 0.1 // default outline color\n      } },\n    background: {\n      color: { r: 0.93, g: 0.93, b: 0.93, a: 1.0 }\n    }\n  };\n};\n\nViewer.prototype = {\n  parseSizeParams: function parseSizeParams() {\n    // essentially, allow all relative + px. Not cm and such.\n    var winResizeUnits = ['%', 'vh', 'vw', 'vmax', 'vmin'];\n    var width, height;\n    var containerStyle = this.containerEl.style;\n    var wUnit = containerStyle.width.match(/^(\\d+(?:\\.\\d+)?)(.*)$/)[2];\n    var hUnit = typeof containerStyle.height === 'string' ? containerStyle.height.match(/^(\\d+(?:\\.\\d+)?)(.*)$/)[2] : '';\n    // whether unit scales on win resize\n    var isDynUnit = containerStyle.width.match(/^calc\\(/) || containerStyle.height.match(/^calc\\(/) || winResizeUnits.indexOf(wUnit) != -1 || winResizeUnits.indexOf(hUnit) != -1;\n    // e.g if units are %, need to keep resizing canvas with dom\n    if (isDynUnit) {\n      window.addEventListener('resize', this.handleResize.bind(this));\n    }\n  },\n  resizeCanvas: function resizeCanvas() {\n    var canvas = this.canvas;\n\n    var devicePixelRatio = window.devicePixelRatio || 1;\n    canvas.width = this.containerEl.clientWidth * devicePixelRatio;\n    canvas.height = this.containerEl.clientHeight * devicePixelRatio;\n  },\n  setCsg: function setCsg(csg) {\n    if (0 && csg.length) {\n      // preparing multiple CSG's (not union-ed), not yet working\n      for (var i = 0; i < csg.length; i++) {\n        this.meshes.concat(this.csgToMeshes(csg[i]));\n      }\n    } else {\n      this.meshes = this.csgToMeshes(csg);\n    }\n    this.state = 2; // showing, object\n    this.onDraw();\n  },\n\n  clear: function clear() {\n    // empty mesh list:\n    this.meshes = [];\n    this.state = 1; // cleared, no object\n    this.onDraw();\n  },\n\n  resetCamera: function resetCamera() {\n    // reset perpective (camera) to initial settings\n    this.angleX = this.options.camera.angle.x;\n    this.angleY = this.options.camera.angle.y;\n    this.angleZ = this.options.camera.angle.z;\n    this.viewpointX = this.options.camera.position.x;\n    this.viewpointY = this.options.camera.position.y;\n    this.viewpointZ = this.options.camera.position.z;\n    this.onDraw();\n  },\n\n  supported: function supported() {\n    return !!this.gl;\n  },\n\n  setCameraOptions: function setCameraOptions(options) {\n    options = options || {};\n    // apply all options found\n    for (var x in this.options.camera) {\n      if (x in options) {\n        this.options.camera[x] = options[x];\n      }\n    }\n  },\n\n  setPlateOptions: function setPlateOptions(options) {\n    options = options || {};\n    // apply all options found\n    for (var x in this.options.plate) {\n      if (x in options) {\n        this.options.plate[x] = options[x];\n      }\n    }\n  },\n\n  setAxisOptions: function setAxisOptions(options) {\n    options = options || {};\n    // apply all options found\n    for (var x in this.options.axis) {\n      if (x in options) this.options.axis[x] = options[x];\n    }\n  },\n\n  setSolidOptions: function setSolidOptions(options) {\n    options = options || {};\n    // apply all options found\n    for (var x in this.options.solid) {\n      if (x in options) this.options.solid[x] = options[x];\n    }\n  }\n};\n\nmodule.exports = Viewer;\n\n},{\"./jscad-viewer-helpers\":293,\"./jscad-viewer-lightgl\":294}],296:[function(require,module,exports){\n'use strict';\n\n/*\n * lightgl.js\n * http://github.com/evanw/lightgl.js/\n *\n * Copyright 2011 Evan Wallace\n * Released under the MIT license\n */\nvar GL = function () {\n\n\t// src/texture.js\n\t// Provides a simple wrapper around WebGL textures that supports render-to-texture.\n\t// ### new GL.Texture(width, height[, options])\n\t//\n\t// The arguments `width` and `height` give the size of the texture in texels.\n\t// WebGL texture dimensions must be powers of two unless `filter` is set to\n\t// either `gl.NEAREST` or `gl.LINEAR` and `wrap` is set to `gl.CLAMP_TO_EDGE`\n\t// (which they are by default).\n\t//\n\t// Texture parameters can be passed in via the `options` argument.\n\t// Example usage:\n\t//\n\t//     var t = new GL.Texture(256, 256, {\n\t//       // Defaults to gl.LINEAR, set both at once with \"filter\"\n\t//       magFilter: gl.NEAREST,\n\t//       minFilter: gl.LINEAR,\n\t//\n\t//       // Defaults to gl.CLAMP_TO_EDGE, set both at once with \"wrap\"\n\t//       wrapS: gl.REPEAT,\n\t//       wrapT: gl.REPEAT,\n\t//\n\t//       format: gl.RGB, // Defaults to gl.RGBA\n\t//       type: gl.FLOAT // Defaults to gl.UNSIGNED_BYTE\n\t//     });\n\n\n\tfunction Texture(width, height, options) {\n\t\toptions = options || {};\n\t\tthis.id = gl.createTexture();\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.format = options.format || gl.RGBA;\n\t\tthis.type = options.type || gl.UNSIGNED_BYTE;\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.id);\n\t\tgl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, options.filter || options.magFilter || gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, options.filter || options.minFilter || gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, options.wrap || options.wrapS || gl.CLAMP_TO_EDGE);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, options.wrap || options.wrapT || gl.CLAMP_TO_EDGE);\n\t\tgl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, this.type, null);\n\t}\n\n\tvar framebuffer;\n\tvar renderbuffer;\n\tvar checkerboardCanvas;\n\n\tTexture.prototype = {\n\t\t// ### .bind([unit])\n\t\t//\n\t\t// Bind this texture to the given texture unit (0-7, defaults to 0).\n\t\tbind: function bind(unit) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + (unit || 0));\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, this.id);\n\t\t},\n\n\t\t// ### .unbind([unit])\n\t\t//\n\t\t// Clear the given texture unit (0-7, defaults to 0).\n\t\tunbind: function unbind(unit) {\n\t\t\tgl.activeTexture(gl.TEXTURE0 + (unit || 0));\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, null);\n\t\t},\n\n\t\t// ### .drawTo(callback[, options])\n\t\t//\n\t\t// Render all draw calls in `callback` to this texture. This method\n\t\t// sets up a framebuffer with this texture as the color attachment\n\t\t// and a renderbuffer as the depth attachment.  The viewport is\n\t\t// temporarily changed to the size of the texture.\n\t\t//\n\t\t// The depth buffer can be omitted via `options` as shown in the\n\t\t// example below:\n\t\t//\n\t\t//     texture.drawTo(function() {\n\t\t//       gl.clearColor(1, 0, 0, 1);\n\t\t//       gl.clear(gl.COLOR_BUFFER_BIT);\n\t\t//     }, { depth: false });\n\t\tdrawTo: function drawTo(callback, options) {\n\n\t\t\toptions = options || {};\n\t\t\tvar v = gl.getParameter(gl.VIEWPORT);\n\t\t\tgl.viewport(0, 0, this.width, this.height);\n\n\t\t\tframebuffer = framebuffer || gl.createFramebuffer();\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\t\t\tgl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.id, 0);\n\n\t\t\tif (options.depth !== false) {\n\t\t\t\trenderbuffer = renderbuffer || gl.createRenderbuffer();\n\t\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n\t\t\t\tif (this.width != renderbuffer.width || this.height != renderbuffer.height) {\n\t\t\t\t\trenderbuffer.width = this.width;\n\t\t\t\t\trenderbuffer.height = this.height;\n\t\t\t\t\tgl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, this.width, this.height);\n\t\t\t\t}\n\t\t\t\tgl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbuffer);\n\t\t\t}\n\n\t\t\tcallback();\n\n\t\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\t\t\tgl.bindRenderbuffer(gl.RENDERBUFFER, null);\n\t\t\tgl.viewport(v[0], v[1], v[2], v[3]);\n\t\t},\n\n\t\t// ### .swapWith(other)\n\t\t//\n\t\t// Switch this texture with `other`, useful for the ping-pong rendering\n\t\t// technique used in multi-stage rendering.\n\t\tswapWith: function swapWith(other) {\n\t\t\tvar temp;\n\t\t\ttemp = other.id;\n\t\t\tother.id = this.id;\n\t\t\tthis.id = temp;\n\t\t\ttemp = other.width;\n\t\t\tother.width = this.width;\n\t\t\tthis.width = temp;\n\t\t\ttemp = other.height;\n\t\t\tother.height = this.height;\n\t\t\tthis.height = temp;\n\t\t}\n\t};\n\n\t// ### GL.Texture.fromImage(image[, options])\n\t//\n\t// Return a new image created from `image`, an `<img>` tag.\n\tTexture.fromImage = function (image, options) {\n\t\toptions = options || {};\n\t\tvar texture = new Texture(image.width, image.height, options);\n\t\ttry {\n\t\t\tgl.texImage2D(gl.TEXTURE_2D, 0, texture.format, texture.format, texture.type, image);\n\t\t} catch (e) {\n\t\t\tif (window.location.protocol == 'file:') {\n\t\t\t\tthrow 'image not loaded for security reasons (serve this page over \"http://\" instead)';\n\t\t\t} else {\n\t\t\t\tthrow 'image not loaded for security reasons (image must originate from the same ' + 'domain as this page or use Cross-Origin Resource Sharing)';\n\t\t\t}\n\t\t}\n\t\tif (options.minFilter && options.minFilter != gl.NEAREST && options.minFilter != gl.LINEAR) {\n\t\t\tgl.generateMipmap(gl.TEXTURE_2D);\n\t\t}\n\t\treturn texture;\n\t};\n\n\t// ### GL.Texture.fromURL(url[, options])\n\t//\n\t// Returns a checkerboard texture that will switch to the correct texture when\n\t// it loads.\n\tTexture.fromURL = function (url, options) {\n\t\tcheckerboardCanvas = checkerboardCanvas || function () {\n\t\t\tvar c = document.createElement('canvas').getContext('2d');\n\t\t\tc.canvas.width = c.canvas.height = 128;\n\t\t\tfor (var y = 0; y < c.canvas.height; y += 16) {\n\t\t\t\tfor (var x = 0; x < c.canvas.width; x += 16) {\n\t\t\t\t\tc.fillStyle = (x ^ y) & 16 ? '#FFF' : '#DDD';\n\t\t\t\t\tc.fillRect(x, y, 16, 16);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn c.canvas;\n\t\t}();\n\t\tvar texture = Texture.fromImage(checkerboardCanvas, options);\n\t\tvar image = new Image();\n\t\tvar context = gl;\n\t\timage.onload = function () {\n\t\t\tcontext.makeCurrent();\n\t\t\tTexture.fromImage(image, options).swapWith(texture);\n\t\t};\n\t\timage.src = url;\n\t\treturn texture;\n\t};\n\n\t// src/mesh.js\n\t// Represents indexed triangle geometry with arbitrary additional attributes.\n\t// You need a shader to draw a mesh; meshes can't draw themselves.\n\t//\n\t// A mesh is a collection of `GL.Buffer` objects which are either vertex buffers\n\t// (holding per-vertex attributes) or index buffers (holding the order in which\n\t// vertices are rendered). By default, a mesh has a position vertex buffer called\n\t// `vertices` and a triangle index buffer called `triangles`. New buffers can be\n\t// added using `addVertexBuffer()` and `addIndexBuffer()`. Two strings are\n\t// required when adding a new vertex buffer, the name of the data array on the\n\t// mesh instance and the name of the GLSL attribute in the vertex shader.\n\t//\n\t// Example usage:\n\t//\n\t//     var mesh = new GL.Mesh({ coords: true, lines: true });\n\t//\n\t//     // Default attribute \"vertices\", available as \"gl_Vertex\" in\n\t//     // the vertex shader\n\t//     mesh.vertices = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0]];\n\t//\n\t//     // Optional attribute \"coords\" enabled in constructor,\n\t//     // available as \"gl_TexCoord\" in the vertex shader\n\t//     mesh.coords = [[0, 0], [1, 0], [0, 1], [1, 1]];\n\t//\n\t//     // Custom attribute \"weights\", available as \"weight\" in the\n\t//     // vertex shader\n\t//     mesh.addVertexBuffer('weights', 'weight');\n\t//     mesh.weights = [1, 0, 0, 1];\n\t//\n\t//     // Default index buffer \"triangles\"\n\t//     mesh.triangles = [[0, 1, 2], [2, 1, 3]];\n\t//\n\t//     // Optional index buffer \"lines\" enabled in constructor\n\t//     mesh.lines = [[0, 1], [0, 2], [1, 3], [2, 3]];\n\t//\n\t//     // Upload provided data to GPU memory\n\t//     mesh.compile();\n\t// ### new GL.Indexer()\n\t//\n\t// Generates indices into a list of unique objects from a stream of objects\n\t// that may contain duplicates. This is useful for generating compact indexed\n\t// meshes from unindexed data.\n\n\n\tfunction Indexer() {\n\t\tthis.unique = [];\n\t\tthis.indices = [];\n\t\tthis.map = {};\n\t}\n\n\tIndexer.prototype = {\n\t\t// ### .add(v)\n\t\t//\n\t\t// Adds the object `obj` to `unique` if it hasn't already been added. Returns\n\t\t// the index of `obj` in `unique`.\n\t\tadd: function add(obj) {\n\t\t\tvar key = JSON.stringify(obj);\n\t\t\tif (!(key in this.map)) {\n\t\t\t\tthis.map[key] = this.unique.length;\n\t\t\t\tthis.unique.push(obj);\n\t\t\t}\n\t\t\treturn this.map[key];\n\t\t}\n\t};\n\n\t// ### new GL.Buffer(target, type)\n\t//\n\t// Provides a simple method of uploading data to a GPU buffer. Example usage:\n\t//\n\t//     var vertices = new GL.Buffer(gl.ARRAY_BUFFER, Float32Array);\n\t//     var indices = new GL.Buffer(gl.ELEMENT_ARRAY_BUFFER, Uint16Array);\n\t//     vertices.data = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0]];\n\t//     indices.data = [[0, 1, 2], [2, 1, 3]];\n\t//     vertices.compile();\n\t//     indices.compile();\n\t//\n\n\n\tfunction Buffer(target, type) {\n\t\tthis.buffer = null;\n\t\tthis.target = target;\n\t\tthis.type = type;\n\t\tthis.data = [];\n\t}\n\n\tBuffer.prototype = {\n\t\t// ### .compile(type)\n\t\t//\n\t\t// Upload the contents of `data` to the GPU in preparation for rendering. The\n\t\t// data must be a list of lists where each inner list has the same length. For\n\t\t// example, each element of data for vertex normals would be a list of length three.\n\t\t// This will remember the data length and element length for later use by shaders.\n\t\t// The type can be either `gl.STATIC_DRAW` or `gl.DYNAMIC_DRAW`, and defaults to\n\t\t// `gl.STATIC_DRAW`.\n\t\t//\n\t\t// This could have used `[].concat.apply([], this.data)` to flatten\n\t\t// the array but Google Chrome has a maximum number of arguments so the\n\t\t// concatenations are chunked to avoid that limit.\n\t\tcompile: function compile(type) {\n\t\t\tvar data = [];\n\t\t\tfor (var i = 0, chunk = 10000; i < this.data.length; i += chunk) {\n\t\t\t\tdata = Array.prototype.concat.apply(data, this.data.slice(i, i + chunk));\n\t\t\t}\n\t\t\tvar spacing = this.data.length ? data.length / this.data.length : 0;\n\t\t\tif (spacing != Math.round(spacing)) throw 'buffer elements not of consistent size, average size is ' + spacing;\n\t\t\tthis.buffer = this.buffer || gl.createBuffer();\n\t\t\tthis.buffer.length = data.length;\n\t\t\tthis.buffer.spacing = spacing;\n\t\t\tgl.bindBuffer(this.target, this.buffer);\n\t\t\tgl.bufferData(this.target, new this.type(data), type || gl.STATIC_DRAW);\n\t\t}\n\t};\n\n\t// ### new GL.Mesh([options])\n\t//\n\t// Represents a collection of vertex buffers and index buffers. Each vertex\n\t// buffer maps to one attribute in GLSL and has a corresponding property set\n\t// on the Mesh instance. There is one vertex buffer by default: `vertices`,\n\t// which maps to `gl_Vertex`. The `coords`, `normals`, and `colors` vertex\n\t// buffers map to `gl_TexCoord`, `gl_Normal`, and `gl_Color` respectively,\n\t// and can be enabled by setting the corresponding options to true. There are\n\t// two index buffers, `triangles` and `lines`, which are used for rendering\n\t// `gl.TRIANGLES` and `gl.LINES`, respectively. Only `triangles` is enabled by\n\t// default, although `computeWireframe()` will add a normal buffer if it wasn't\n\t// initially enabled.\n\n\n\tfunction Mesh(options) {\n\t\toptions = options || {};\n\t\tthis.vertexBuffers = {};\n\t\tthis.indexBuffers = {};\n\t\tthis.addVertexBuffer('vertices', 'gl_Vertex');\n\t\tif (options.coords) this.addVertexBuffer('coords', 'gl_TexCoord');\n\t\tif (options.normals) this.addVertexBuffer('normals', 'gl_Normal');\n\t\tif (options.colors) this.addVertexBuffer('colors', 'gl_Color');\n\t\tif (!('triangles' in options) || options.triangles) this.addIndexBuffer('triangles');\n\t\tif (options.lines) this.addIndexBuffer('lines');\n\t}\n\n\tMesh.prototype = {\n\t\t// ### .addVertexBuffer(name, attribute)\n\t\t//\n\t\t// Add a new vertex buffer with a list as a property called `name` on this object\n\t\t// and map it to the attribute called `attribute` in all shaders that draw this mesh.\n\t\taddVertexBuffer: function addVertexBuffer(name, attribute) {\n\t\t\tvar buffer = this.vertexBuffers[attribute] = new Buffer(gl.ARRAY_BUFFER, Float32Array);\n\t\t\tbuffer.name = name;\n\t\t\tthis[name] = [];\n\t\t},\n\n\t\t// ### .addIndexBuffer(name)\n\t\t//\n\t\t// Add a new index buffer with a list as a property called `name` on this object.\n\t\taddIndexBuffer: function addIndexBuffer(name) {\n\t\t\tthis.indexBuffers[name] = new Buffer(gl.ELEMENT_ARRAY_BUFFER, Uint16Array);\n\t\t\tthis[name] = [];\n\t\t},\n\n\t\t// ### .compile()\n\t\t//\n\t\t// Upload all attached buffers to the GPU in preparation for rendering. This\n\t\t// doesn't need to be called every frame, only needs to be done when the data\n\t\t// changes.\n\t\tcompile: function compile() {\n\t\t\tfor (var attribute in this.vertexBuffers) {\n\t\t\t\tvar buffer = this.vertexBuffers[attribute];\n\t\t\t\tbuffer.data = this[buffer.name];\n\t\t\t\tbuffer.compile();\n\t\t\t}\n\n\t\t\tfor (var name in this.indexBuffers) {\n\t\t\t\tvar buffer = this.indexBuffers[name];\n\t\t\t\tbuffer.data = this[name];\n\t\t\t\tbuffer.compile();\n\t\t\t}\n\t\t},\n\n\t\t// ### .transform(matrix)\n\t\t//\n\t\t// Transform all vertices by `matrix` and all normals by the inverse transpose\n\t\t// of `matrix`.\n\t\ttransform: function transform(matrix) {\n\t\t\tthis.vertices = this.vertices.map(function (v) {\n\t\t\t\treturn matrix.transformPoint(Vector.fromArray(v)).toArray();\n\t\t\t});\n\t\t\tif (this.normals) {\n\t\t\t\tvar invTrans = matrix.inverse().transpose();\n\t\t\t\tthis.normals = this.normals.map(function (n) {\n\t\t\t\t\treturn invTrans.transformVector(Vector.fromArray(n)).unit().toArray();\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.compile();\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### .computeNormals()\n\t\t//\n\t\t// Computes a new normal for each vertex from the average normal of the\n\t\t// neighboring triangles. This means adjacent triangles must share vertices\n\t\t// for the resulting normals to be smooth.\n\t\tcomputeNormals: function computeNormals() {\n\t\t\tif (!this.normals) this.addVertexBuffer('normals', 'gl_Normal');\n\t\t\tfor (var i = 0; i < this.vertices.length; i++) {\n\t\t\t\tthis.normals[i] = new Vector();\n\t\t\t}\n\t\t\tfor (var i = 0; i < this.triangles.length; i++) {\n\t\t\t\tvar t = this.triangles[i];\n\t\t\t\tvar a = Vector.fromArray(this.vertices[t[0]]);\n\t\t\t\tvar b = Vector.fromArray(this.vertices[t[1]]);\n\t\t\t\tvar c = Vector.fromArray(this.vertices[t[2]]);\n\t\t\t\tvar normal = b.subtract(a).cross(c.subtract(a)).unit();\n\t\t\t\tthis.normals[t[0]] = this.normals[t[0]].add(normal);\n\t\t\t\tthis.normals[t[1]] = this.normals[t[1]].add(normal);\n\t\t\t\tthis.normals[t[2]] = this.normals[t[2]].add(normal);\n\t\t\t}\n\t\t\tfor (var i = 0; i < this.vertices.length; i++) {\n\t\t\t\tthis.normals[i] = this.normals[i].unit().toArray();\n\t\t\t}\n\t\t\tthis.compile();\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### .computeWireframe()\n\t\t//\n\t\t// Populate the `lines` index buffer from the `triangles` index buffer.\n\t\tcomputeWireframe: function computeWireframe() {\n\t\t\tvar indexer = new Indexer();\n\t\t\tfor (var i = 0; i < this.triangles.length; i++) {\n\t\t\t\tvar t = this.triangles[i];\n\t\t\t\tfor (var j = 0; j < t.length; j++) {\n\t\t\t\t\tvar a = t[j],\n\t\t\t\t\t    b = t[(j + 1) % t.length];\n\t\t\t\t\tindexer.add([Math.min(a, b), Math.max(a, b)]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!this.lines) this.addIndexBuffer('lines');\n\t\t\tthis.lines = indexer.unique;\n\t\t\tthis.compile();\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### .getAABB()\n\t\t//\n\t\t// Computes the axis-aligned bounding box, which is an object whose `min` and\n\t\t// `max` properties contain the minimum and maximum coordinates of all vertices.\n\t\tgetAABB: function getAABB() {\n\t\t\tvar aabb = {\n\t\t\t\tmin: new Vector(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE)\n\t\t\t};\n\t\t\taabb.max = aabb.min.negative();\n\t\t\tfor (var i = 0; i < this.vertices.length; i++) {\n\t\t\t\tvar v = Vector.fromArray(this.vertices[i]);\n\t\t\t\taabb.min = Vector.min(aabb.min, v);\n\t\t\t\taabb.max = Vector.max(aabb.max, v);\n\t\t\t}\n\t\t\treturn aabb;\n\t\t},\n\n\t\t// ### .getBoundingSphere()\n\t\t//\n\t\t// Computes a sphere that contains all vertices (not necessarily the smallest\n\t\t// sphere). The returned object has two properties, `center` and `radius`.\n\t\tgetBoundingSphere: function getBoundingSphere() {\n\t\t\tvar aabb = this.getAABB();\n\t\t\tvar sphere = {\n\t\t\t\tcenter: aabb.min.add(aabb.max).divide(2),\n\t\t\t\tradius: 0\n\t\t\t};\n\t\t\tfor (var i = 0; i < this.vertices.length; i++) {\n\t\t\t\tsphere.radius = Math.max(sphere.radius, Vector.fromArray(this.vertices[i]).subtract(sphere.center).length());\n\t\t\t}\n\t\t\treturn sphere;\n\t\t}\n\t};\n\n\t// ### GL.Mesh.plane([options])\n\t//\n\t// Generates a square 2x2 mesh the xy plane centered at the origin. The\n\t// `options` argument specifies options to pass to the mesh constructor.\n\t// Additional options include `detailX` and `detailY`, which set the tesselation\n\t// in x and y, and `detail`, which sets both `detailX` and `detailY` at once.\n\t// Two triangles are generated by default.\n\t// Example usage:\n\t//\n\t//     var mesh1 = GL.Mesh.plane();\n\t//     var mesh2 = GL.Mesh.plane({ detail: 5 });\n\t//     var mesh3 = GL.Mesh.plane({ detailX: 20, detailY: 40 });\n\t//\n\tMesh.plane = function (options) {\n\t\toptions = options || {};\n\t\tvar mesh = new Mesh(options),\n\t\t    detailX = options.detailX || options.detail || 1,\n\t\t    detailY = options.detailY || options.detail || 1;\n\n\t\tfor (var y = 0; y <= detailY; y++) {\n\t\t\tvar t = y / detailY;\n\t\t\tfor (var x = 0; x <= detailX; x++) {\n\t\t\t\tvar s = x / detailX;\n\t\t\t\tmesh.vertices.push([2 * s - 1, 2 * t - 1, 0]);\n\t\t\t\tif (mesh.coords) mesh.coords.push([s, t]);\n\t\t\t\tif (mesh.normals) mesh.normals.push([0, 0, 1]);\n\t\t\t\tif (x < detailX && y < detailY) {\n\t\t\t\t\tvar i = x + y * (detailX + 1);\n\t\t\t\t\tmesh.triangles.push([i, i + 1, i + detailX + 1]);\n\t\t\t\t\tmesh.triangles.push([i + detailX + 1, i + 1, i + detailX + 2]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmesh.compile();\n\t\treturn mesh;\n\t};\n\n\tvar cubeData = [[0, 4, 2, 6, -1, 0, 0], // -x\n\t[1, 3, 5, 7, +1, 0, 0], // +x\n\t[0, 1, 4, 5, 0, -1, 0], // -y\n\t[2, 6, 3, 7, 0, +1, 0], // +y\n\t[0, 2, 1, 3, 0, 0, -1], // -z\n\t[4, 5, 6, 7, 0, 0, +1] // +z\n\t];\n\n\tfunction pickOctant(i) {\n\t\treturn new Vector((i & 1) * 2 - 1, (i & 2) - 1, (i & 4) / 2 - 1);\n\t}\n\n\t// ### GL.Mesh.cube([options])\n\t//\n\t// Generates a 2x2x2 box centered at the origin. The `options` argument\n\t// specifies options to pass to the mesh constructor.\n\tMesh.cube = function (options) {\n\t\tvar mesh = new Mesh(options);\n\n\t\tfor (var i = 0; i < cubeData.length; i++) {\n\t\t\tvar data = cubeData[i],\n\t\t\t    v = i * 4;\n\t\t\tfor (var j = 0; j < 4; j++) {\n\t\t\t\tvar d = data[j];\n\t\t\t\tmesh.vertices.push(pickOctant(d).toArray());\n\t\t\t\tif (mesh.coords) mesh.coords.push([j & 1, (j & 2) / 2]);\n\t\t\t\tif (mesh.normals) mesh.normals.push(data.slice(4, 7));\n\t\t\t}\n\t\t\tmesh.triangles.push([v, v + 1, v + 2]);\n\t\t\tmesh.triangles.push([v + 2, v + 1, v + 3]);\n\t\t}\n\n\t\tmesh.compile();\n\t\treturn mesh;\n\t};\n\n\t// ### GL.Mesh.sphere([options])\n\t//\n\t// Generates a geodesic sphere of radius 1. The `options` argument specifies\n\t// options to pass to the mesh constructor in addition to the `detail` option,\n\t// which controls the tesselation level. The detail is `6` by default.\n\t// Example usage:\n\t//\n\t//     var mesh1 = GL.Mesh.sphere();\n\t//     var mesh2 = GL.Mesh.sphere({ detail: 2 });\n\t//\n\tMesh.sphere = function (options) {\n\t\tfunction tri(a, b, c) {\n\t\t\treturn flip ? [a, c, b] : [a, b, c];\n\t\t}\n\n\t\tfunction fix(x) {\n\t\t\treturn x + (x - x * x) / 2;\n\t\t}\n\t\toptions = options || {};\n\t\tvar mesh = new Mesh(options);\n\t\tvar indexer = new Indexer(),\n\t\t    detail = options.detail || 6;\n\n\t\tfor (var octant = 0; octant < 8; octant++) {\n\t\t\tvar scale = pickOctant(octant);\n\t\t\tvar flip = scale.x * scale.y * scale.z > 0;\n\t\t\tvar data = [];\n\t\t\tfor (var i = 0; i <= detail; i++) {\n\t\t\t\t// Generate a row of vertices on the surface of the sphere\n\t\t\t\t// using barycentric coordinates.\n\t\t\t\tfor (var j = 0; i + j <= detail; j++) {\n\t\t\t\t\tvar a = i / detail;\n\t\t\t\t\tvar b = j / detail;\n\t\t\t\t\tvar c = (detail - i - j) / detail;\n\t\t\t\t\tvar vertex = {\n\t\t\t\t\t\tvertex: new Vector(fix(a), fix(b), fix(c)).unit().multiply(scale).toArray()\n\t\t\t\t\t};\n\t\t\t\t\tif (mesh.coords) vertex.coord = scale.y > 0 ? [1 - a, c] : [c, 1 - a];\n\t\t\t\t\tdata.push(indexer.add(vertex));\n\t\t\t\t}\n\n\t\t\t\t// Generate triangles from this row and the previous row.\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tfor (var j = 0; i + j <= detail; j++) {\n\t\t\t\t\t\tvar a = (i - 1) * (detail + 1) + (i - 1 - (i - 1) * (i - 1)) / 2 + j;\n\t\t\t\t\t\tvar b = i * (detail + 1) + (i - i * i) / 2 + j;\n\t\t\t\t\t\tmesh.triangles.push(tri(data[a], data[a + 1], data[b]));\n\t\t\t\t\t\tif (i + j < detail) {\n\t\t\t\t\t\t\tmesh.triangles.push(tri(data[b], data[a + 1], data[b + 1]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Reconstruct the geometry from the indexer.\n\t\tmesh.vertices = indexer.unique.map(function (v) {\n\t\t\treturn v.vertex;\n\t\t});\n\t\tif (mesh.coords) mesh.coords = indexer.unique.map(function (v) {\n\t\t\treturn v.coord;\n\t\t});\n\t\tif (mesh.normals) mesh.normals = mesh.vertices;\n\t\tmesh.compile();\n\t\treturn mesh;\n\t};\n\n\t// ### GL.Mesh.load(json[, options])\n\t//\n\t// Creates a mesh from the JSON generated by the `convert/convert.py` script.\n\t// Example usage:\n\t//\n\t//     var data = {\n\t//       vertices: [[0, 0, 0], [1, 0, 0], [0, 1, 0]],\n\t//       triangles: [[0, 1, 2]]\n\t//     };\n\t//     var mesh = GL.Mesh.load(data);\n\t//\n\tMesh.load = function (json, options) {\n\t\toptions = options || {};\n\t\tif (!('coords' in options)) options.coords = !!json.coords;\n\t\tif (!('normals' in options)) options.normals = !!json.normals;\n\t\tif (!('colors' in options)) options.colors = !!json.colors;\n\t\tif (!('triangles' in options)) options.triangles = !!json.triangles;\n\t\tif (!('lines' in options)) options.lines = !!json.lines;\n\t\tvar mesh = new Mesh(options);\n\t\tmesh.vertices = json.vertices;\n\t\tif (mesh.coords) mesh.coords = json.coords;\n\t\tif (mesh.normals) mesh.normals = json.normals;\n\t\tif (mesh.colors) mesh.colors = json.colors;\n\t\tif (mesh.triangles) mesh.triangles = json.triangles;\n\t\tif (mesh.lines) mesh.lines = json.lines;\n\t\tmesh.compile();\n\t\treturn mesh;\n\t};\n\n\t// src/vector.js\n\t// Provides a simple 3D vector class. Vector operations can be done using member\n\t// functions, which return new vectors, or static functions, which reuse\n\t// existing vectors to avoid generating garbage.\n\n\n\tfunction Vector(x, y, z) {\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t}\n\n\t// ### Instance Methods\n\t// The methods `add()`, `subtract()`, `multiply()`, and `divide()` can all\n\t// take either a vector or a number as an argument.\n\tVector.prototype = {\n\t\tnegative: function negative() {\n\t\t\treturn new Vector(-this.x, -this.y, -this.z);\n\t\t},\n\t\tadd: function add(v) {\n\t\t\tif (v instanceof Vector) return new Vector(this.x + v.x, this.y + v.y, this.z + v.z);else return new Vector(this.x + v, this.y + v, this.z + v);\n\t\t},\n\t\tsubtract: function subtract(v) {\n\t\t\tif (v instanceof Vector) return new Vector(this.x - v.x, this.y - v.y, this.z - v.z);else return new Vector(this.x - v, this.y - v, this.z - v);\n\t\t},\n\t\tmultiply: function multiply(v) {\n\t\t\tif (v instanceof Vector) return new Vector(this.x * v.x, this.y * v.y, this.z * v.z);else return new Vector(this.x * v, this.y * v, this.z * v);\n\t\t},\n\t\tdivide: function divide(v) {\n\t\t\tif (v instanceof Vector) return new Vector(this.x / v.x, this.y / v.y, this.z / v.z);else return new Vector(this.x / v, this.y / v, this.z / v);\n\t\t},\n\t\tequals: function equals(v) {\n\t\t\treturn this.x == v.x && this.y == v.y && this.z == v.z;\n\t\t},\n\t\tdot: function dot(v) {\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\t\t},\n\t\tcross: function cross(v) {\n\t\t\treturn new Vector(this.y * v.z - this.z * v.y, this.z * v.x - this.x * v.z, this.x * v.y - this.y * v.x);\n\t\t},\n\t\tlength: function length() {\n\t\t\treturn Math.sqrt(this.dot(this));\n\t\t},\n\t\tunit: function unit() {\n\t\t\treturn this.divide(this.length());\n\t\t},\n\t\tmin: function min() {\n\t\t\treturn Math.min(Math.min(this.x, this.y), this.z);\n\t\t},\n\t\tmax: function max() {\n\t\t\treturn Math.max(Math.max(this.x, this.y), this.z);\n\t\t},\n\t\ttoAngles: function toAngles() {\n\t\t\treturn {\n\t\t\t\ttheta: Math.atan2(this.z, this.x),\n\t\t\t\tphi: Math.asin(this.y / this.length())\n\t\t\t};\n\t\t},\n\t\ttoArray: function toArray(n) {\n\t\t\treturn [this.x, this.y, this.z].slice(0, n || 3);\n\t\t},\n\t\tclone: function clone() {\n\t\t\treturn new Vector(this.x, this.y, this.z);\n\t\t},\n\t\tinit: function init(x, y, z) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\treturn this;\n\t\t}\n\t};\n\n\t// ### Static Methods\n\t// `Vector.randomDirection()` returns a vector with a length of 1 and a\n\t// statistically uniform direction. `Vector.lerp()` performs linear\n\t// interpolation between two vectors.\n\tVector.negative = function (a, b) {\n\t\tb.x = -a.x;\n\t\tb.y = -a.y;\n\t\tb.z = -a.z;\n\t\treturn b;\n\t};\n\tVector.add = function (a, b, c) {\n\t\tif (b instanceof Vector) {\n\t\t\tc.x = a.x + b.x;\n\t\t\tc.y = a.y + b.y;\n\t\t\tc.z = a.z + b.z;\n\t\t} else {\n\t\t\tc.x = a.x + b;\n\t\t\tc.y = a.y + b;\n\t\t\tc.z = a.z + b;\n\t\t}\n\t\treturn c;\n\t};\n\tVector.subtract = function (a, b, c) {\n\t\tif (b instanceof Vector) {\n\t\t\tc.x = a.x - b.x;\n\t\t\tc.y = a.y - b.y;\n\t\t\tc.z = a.z - b.z;\n\t\t} else {\n\t\t\tc.x = a.x - b;\n\t\t\tc.y = a.y - b;\n\t\t\tc.z = a.z - b;\n\t\t}\n\t\treturn c;\n\t};\n\tVector.multiply = function (a, b, c) {\n\t\tif (b instanceof Vector) {\n\t\t\tc.x = a.x * b.x;\n\t\t\tc.y = a.y * b.y;\n\t\t\tc.z = a.z * b.z;\n\t\t} else {\n\t\t\tc.x = a.x * b;\n\t\t\tc.y = a.y * b;\n\t\t\tc.z = a.z * b;\n\t\t}\n\t\treturn c;\n\t};\n\tVector.divide = function (a, b, c) {\n\t\tif (b instanceof Vector) {\n\t\t\tc.x = a.x / b.x;\n\t\t\tc.y = a.y / b.y;\n\t\t\tc.z = a.z / b.z;\n\t\t} else {\n\t\t\tc.x = a.x / b;\n\t\t\tc.y = a.y / b;\n\t\t\tc.z = a.z / b;\n\t\t}\n\t\treturn c;\n\t};\n\tVector.cross = function (a, b, c) {\n\t\tc.x = a.y * b.z - a.z * b.y;\n\t\tc.y = a.z * b.x - a.x * b.z;\n\t\tc.z = a.x * b.y - a.y * b.x;\n\t\treturn c;\n\t};\n\tVector.unit = function (a, b) {\n\t\tvar length = a.length();\n\t\tb.x = a.x / length;\n\t\tb.y = a.y / length;\n\t\tb.z = a.z / length;\n\t\treturn b;\n\t};\n\tVector.fromAngles = function (theta, phi) {\n\t\treturn new Vector(Math.cos(theta) * Math.cos(phi), Math.sin(phi), Math.sin(theta) * Math.cos(phi));\n\t};\n\tVector.randomDirection = function () {\n\t\treturn Vector.fromAngles(Math.random() * Math.PI * 2, Math.asin(Math.random() * 2 - 1));\n\t};\n\tVector.min = function (a, b) {\n\t\treturn new Vector(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.min(a.z, b.z));\n\t};\n\tVector.max = function (a, b) {\n\t\treturn new Vector(Math.max(a.x, b.x), Math.max(a.y, b.y), Math.max(a.z, b.z));\n\t};\n\tVector.lerp = function (a, b, fraction) {\n\t\treturn b.subtract(a).multiply(fraction).add(a);\n\t};\n\tVector.fromArray = function (a) {\n\t\treturn new Vector(a[0], a[1], a[2]);\n\t};\n\n\t// src/shader.js\n\t// Provides a convenient wrapper for WebGL shaders. A few uniforms and attributes,\n\t// prefixed with `gl_`, are automatically added to all shader sources to make\n\t// simple shaders easier to write.\n\t//\n\t// Example usage:\n\t//\n\t//     var shader = new GL.Shader('\\\n\t//       void main() {\\\n\t//         gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\\n\t//       }\\\n\t//     ', '\\\n\t//       uniform vec4 color;\\\n\t//       void main() {\\\n\t//         gl_FragColor = color;\\\n\t//       }\\\n\t//     ');\n\t//\n\t//     shader.uniforms({\n\t//       color: [1, 0, 0, 1]\n\t//     }).draw(mesh);\n\n\tfunction regexMap(regex, text, callback) {\n\t\tvar result;\n\t\twhile ((result = regex.exec(text)) !== null) {\n\t\t\tcallback(result);\n\t\t}\n\t}\n\n\t// Non-standard names beginning with `gl_` must be mangled because they will\n\t// otherwise cause a compiler error.\n\tvar LIGHTGL_PREFIX = 'LIGHTGL';\n\n\t// ### new GL.Shader(vertexSource, fragmentSource)\n\t//\n\t// Compiles a shader program using the provided vertex and fragment shaders.\n\n\n\tfunction Shader(vertexSource, fragmentSource) {\n\t\t// Allow passing in the id of an HTML script tag with the source\n\n\n\t\tfunction followScriptTagById(id) {\n\t\t\tvar element = document.getElementById(id);\n\t\t\treturn element ? element.text : id;\n\t\t}\n\t\tvertexSource = followScriptTagById(vertexSource);\n\t\tfragmentSource = followScriptTagById(fragmentSource);\n\n\t\t// Headers are prepended to the sources to provide some automatic functionality.\n\t\tvar header = '\\\n    uniform mat3 gl_NormalMatrix;\\\n    uniform mat4 gl_ModelViewMatrix;\\\n    uniform mat4 gl_ProjectionMatrix;\\\n    uniform mat4 gl_ModelViewProjectionMatrix;\\\n    uniform mat4 gl_ModelViewMatrixInverse;\\\n    uniform mat4 gl_ProjectionMatrixInverse;\\\n    uniform mat4 gl_ModelViewProjectionMatrixInverse;\\\n  ';\n\t\tvar vertexHeader = header + '\\\n    attribute vec4 gl_Vertex;\\\n    attribute vec4 gl_TexCoord;\\\n    attribute vec3 gl_Normal;\\\n    attribute vec4 gl_Color;\\\n    vec4 ftransform() {\\\n      return gl_ModelViewProjectionMatrix * gl_Vertex;\\\n    }\\\n  ';\n\t\tvar fragmentHeader = '\\\n    precision highp float;\\\n  ' + header;\n\n\t\t// Check for the use of built-in matrices that require expensive matrix\n\t\t// multiplications to compute, and record these in `usedMatrices`.\n\t\tvar source = vertexSource + fragmentSource;\n\t\tvar usedMatrices = {};\n\t\tregexMap(/\\b(gl_[^;]*)\\b;/g, header, function (groups) {\n\t\t\tvar name = groups[1];\n\t\t\tif (source.indexOf(name) != -1) {\n\t\t\t\tvar capitalLetters = name.replace(/[a-z_]/g, '');\n\t\t\t\tusedMatrices[capitalLetters] = LIGHTGL_PREFIX + name;\n\t\t\t}\n\t\t});\n\t\tif (source.indexOf('ftransform') != -1) usedMatrices.MVPM = LIGHTGL_PREFIX + 'gl_ModelViewProjectionMatrix';\n\t\tthis.usedMatrices = usedMatrices;\n\n\t\t// The `gl_` prefix must be substituted for something else to avoid compile\n\t\t// errors, since it's a reserved prefix. This prefixes all reserved names with\n\t\t// `_`. The header is inserted after any extensions, since those must come\n\t\t// first.\n\n\n\t\tfunction fix(header, source) {\n\t\t\tvar replaced = {};\n\t\t\tvar match = /^((\\s*\\/\\/.*\\n|\\s*#extension.*\\n)+)\\^*$/.exec(source);\n\t\t\tsource = match ? match[1] + header + source.substr(match[1].length) : header + source;\n\t\t\tregexMap(/\\bgl_\\w+\\b/g, header, function (result) {\n\t\t\t\tif (!(result in replaced)) {\n\t\t\t\t\tsource = source.replace(new RegExp('\\\\b' + result + '\\\\b', 'g'), LIGHTGL_PREFIX + result);\n\t\t\t\t\treplaced[result] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn source;\n\t\t}\n\t\tvertexSource = fix(vertexHeader, vertexSource);\n\t\tfragmentSource = fix(fragmentHeader, fragmentSource);\n\n\t\t// Compile and link errors are thrown as strings.\n\n\n\t\tfunction compileSource(type, source) {\n\t\t\tvar shader = gl.createShader(type);\n\t\t\tgl.shaderSource(shader, source);\n\t\t\tgl.compileShader(shader);\n\t\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\t\tthrow 'compile error: ' + gl.getShaderInfoLog(shader);\n\t\t\t}\n\t\t\treturn shader;\n\t\t}\n\t\tthis.program = gl.createProgram();\n\t\tgl.attachShader(this.program, compileSource(gl.VERTEX_SHADER, vertexSource));\n\t\tgl.attachShader(this.program, compileSource(gl.FRAGMENT_SHADER, fragmentSource));\n\t\tgl.linkProgram(this.program);\n\t\tif (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n\t\t\tthrow 'link error: ' + gl.getProgramInfoLog(this.program);\n\t\t}\n\t\tthis.attributes = {};\n\t\tthis.uniformLocations = {};\n\n\t\t// Sampler uniforms need to be uploaded using `gl.uniform1i()` instead of `gl.uniform1f()`.\n\t\t// To do this automatically, we detect and remember all uniform samplers in the source code.\n\t\tvar isSampler = {};\n\t\tregexMap(/uniform\\s+sampler(1D|2D|3D|Cube)\\s+(\\w+)\\s*;/g, vertexSource + fragmentSource, function (groups) {\n\t\t\tisSampler[groups[2]] = 1;\n\t\t});\n\t\tthis.isSampler = isSampler;\n\t}\n\n\tfunction isArray(obj) {\n\t\tvar str = Object.prototype.toString.call(obj);\n\t\treturn str == '[object Array]' || str == '[object Float32Array]';\n\t}\n\n\tfunction isNumber(obj) {\n\t\tvar str = Object.prototype.toString.call(obj);\n\t\treturn str == '[object Number]' || str == '[object Boolean]';\n\t}\n\n\tShader.prototype = {\n\t\t// ### .uniforms(uniforms)\n\t\t//\n\t\t// Set a uniform for each property of `uniforms`. The correct `gl.uniform*()` method is\n\t\t// inferred from the value types and from the stored uniform sampler flags.\n\t\tuniforms: function uniforms(_uniforms) {\n\t\t\tgl.useProgram(this.program);\n\n\t\t\tfor (var name in _uniforms) {\n\t\t\t\tvar location = this.uniformLocations[name] || gl.getUniformLocation(this.program, name);\n\t\t\t\tif (!location) continue;\n\t\t\t\tthis.uniformLocations[name] = location;\n\t\t\t\tvar value = _uniforms[name];\n\t\t\t\tif (value instanceof Vector) {\n\t\t\t\t\tvalue = [value.x, value.y, value.z];\n\t\t\t\t} else if (value instanceof Matrix) {\n\t\t\t\t\tvalue = value.m;\n\t\t\t\t}\n\t\t\t\tif (isArray(value)) {\n\t\t\t\t\tswitch (value.length) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\tgl.uniform1fv(location, new Float32Array(value));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tgl.uniform2fv(location, new Float32Array(value));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tgl.uniform3fv(location, new Float32Array(value));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tgl.uniform4fv(location, new Float32Array(value));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t// Matrices are automatically transposed, since WebGL uses column-major\n\t\t\t\t\t\t// indices instead of row-major indices.\n\t\t\t\t\t\tcase 9:\n\t\t\t\t\t\t\tgl.uniformMatrix3fv(location, false, new Float32Array([value[0], value[3], value[6], value[1], value[4], value[7], value[2], value[5], value[8]]));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\tgl.uniformMatrix4fv(location, false, new Float32Array([value[0], value[4], value[8], value[12], value[1], value[5], value[9], value[13], value[2], value[6], value[10], value[14], value[3], value[7], value[11], value[15]]));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow 'don\\'t know how to load uniform \"' + name + '\" of length ' + value.length;\n\t\t\t\t\t}\n\t\t\t\t} else if (isNumber(value)) {\n\t\t\t\t\t(this.isSampler[name] ? gl.uniform1i : gl.uniform1f).call(gl, location, value);\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'attempted to set uniform \"' + name + '\" to invalid value ' + value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### .draw(mesh[, mode])\n\t\t//\n\t\t// Sets all uniform matrix attributes, binds all relevant buffers, and draws the\n\t\t// mesh geometry as indexed triangles or indexed lines. Set `mode` to `gl.LINES`\n\t\t// (and either add indices to `lines` or call `computeWireframe()`) to draw the\n\t\t// mesh in wireframe.\n\t\tdraw: function draw(mesh, mode) {\n\t\t\tthis.drawBuffers(mesh.vertexBuffers, mesh.indexBuffers[mode == gl.LINES ? 'lines' : 'triangles'], arguments.length < 2 ? gl.TRIANGLES : mode);\n\t\t},\n\n\t\t// ### .drawBuffers(vertexBuffers, indexBuffer, mode)\n\t\t//\n\t\t// Sets all uniform matrix attributes, binds all relevant buffers, and draws the\n\t\t// indexed mesh geometry. The `vertexBuffers` argument is a map from attribute\n\t\t// names to `Buffer` objects of type `gl.ARRAY_BUFFER`, `indexBuffer` is a `Buffer`\n\t\t// object of type `gl.ELEMENT_ARRAY_BUFFER`, and `mode` is a WebGL primitive mode\n\t\t// like `gl.TRIANGLES` or `gl.LINES`. This method automatically creates and caches\n\t\t// vertex attribute pointers for attributes as needed.\n\t\tdrawBuffers: function drawBuffers(vertexBuffers, indexBuffer, mode) {\n\t\t\t// Only construct up the built-in matrices we need for this shader.\n\t\t\tvar used = this.usedMatrices;\n\t\t\tvar MVM = gl.modelviewMatrix;\n\t\t\tvar PM = gl.projectionMatrix;\n\t\t\tvar MVMI = used.MVMI || used.NM ? MVM.inverse() : null;\n\t\t\tvar PMI = used.PMI ? PM.inverse() : null;\n\t\t\tvar MVPM = used.MVPM || used.MVPMI ? PM.multiply(MVM) : null;\n\t\t\tvar matrices = {};\n\t\t\tif (used.MVM) matrices[used.MVM] = MVM;\n\t\t\tif (used.MVMI) matrices[used.MVMI] = MVMI;\n\t\t\tif (used.PM) matrices[used.PM] = PM;\n\t\t\tif (used.PMI) matrices[used.PMI] = PMI;\n\t\t\tif (used.MVPM) matrices[used.MVPM] = MVPM;\n\t\t\tif (used.MVPMI) matrices[used.MVPMI] = MVPM.inverse();\n\t\t\tif (used.NM) {\n\t\t\t\tvar m = MVMI.m;\n\t\t\t\tmatrices[used.NM] = [m[0], m[4], m[8], m[1], m[5], m[9], m[2], m[6], m[10]];\n\t\t\t}\n\t\t\tthis.uniforms(matrices);\n\n\t\t\t// Create and enable attribute pointers as necessary.\n\t\t\tvar length = 0;\n\t\t\tfor (var attribute in vertexBuffers) {\n\t\t\t\tvar buffer = vertexBuffers[attribute];\n\t\t\t\tvar location = this.attributes[attribute] || gl.getAttribLocation(this.program, attribute.replace(/^(gl_.*)$/, LIGHTGL_PREFIX + '$1'));\n\t\t\t\tif (location == -1 || !buffer.buffer) continue;\n\t\t\t\tthis.attributes[attribute] = location;\n\t\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buffer.buffer);\n\t\t\t\tgl.enableVertexAttribArray(location);\n\t\t\t\tgl.vertexAttribPointer(location, buffer.buffer.spacing, gl.FLOAT, false, 0, 0);\n\t\t\t\tlength = buffer.buffer.length / buffer.buffer.spacing;\n\t\t\t}\n\n\t\t\t// Disable unused attribute pointers.\n\t\t\tfor (var attribute in this.attributes) {\n\t\t\t\tif (!(attribute in vertexBuffers)) {\n\t\t\t\t\tgl.disableVertexAttribArray(this.attributes[attribute]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Draw the geometry.\n\t\t\tif (length && (!indexBuffer || indexBuffer.buffer)) {\n\t\t\t\tif (indexBuffer) {\n\t\t\t\t\tgl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer.buffer);\n\t\t\t\t\tgl.drawElements(mode, indexBuffer.buffer.length, gl.UNSIGNED_SHORT, 0);\n\t\t\t\t} else {\n\t\t\t\t\tgl.drawArrays(mode, 0, length);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t};\n\n\t// ### GL.Shader.fromURL(vsURL, fsURL)\n\t//\n\t// Compiles a shader program using the provided vertex and fragment\n\t// shaders. The shaders are loaded synchronously from the given URLs.\n\t//\n\tShader.fromURL = function (vsURL, fsURL) {\n\n\t\tvar XMLHttpRequestGet = function XMLHttpRequestGet(uri) {\n\t\t\tvar mHttpReq = new XMLHttpRequest();\n\t\t\tmHttpReq.open(\"GET\", uri, false);\n\t\t\tmHttpReq.send(null);\n\t\t\tif (mHttpReq.status !== 200) {\n\t\t\t\tthrow 'could not load ' + uri;\n\t\t\t}\n\t\t\treturn mHttpReq.responseText;\n\t\t};\n\n\t\tvar vsSource = XMLHttpRequestGet(vsURL);\n\t\tvar fsSource = XMLHttpRequestGet(fsURL);\n\n\t\treturn new Shader(vsSource, fsSource);\n\t};\n\n\tShader.from = function (vsURLorID, fsURLorID) {\n\t\ttry {\n\t\t\treturn new Shader(vsURLorID, fsURLorID);\n\t\t} catch (e) {\n\t\t\treturn Shader.fromURL(vsURLorID, fsURLorID);\n\t\t}\n\t};\n\n\t// src/main.js\n\t// The internal `gl` variable holds the current WebGL context.\n\tvar gl;\n\n\tvar GL = {\n\t\t// ### Initialization\n\t\t//\n\t\t// `GL.create()` creates a new WebGL context and augments it with\n\t\t// more methods. Uses the HTML canvas given in 'options' or creates\n\t\t// a new one if necessary. The alpha channel is disabled by default\n\t\t// because it usually causes unintended transparencies in the\n\t\t// canvas.\n\t\tcreate: function create(options) {\n\t\t\toptions = options || {};\n\t\t\tvar canvas = options.canvas;\n\t\t\tif (!canvas) {\n\t\t\t\tcanvas = document.createElement('canvas');\n\t\t\t\tcanvas.width = options.width || 800;\n\t\t\t\tcanvas.height = options.height || 600;\n\t\t\t}\n\t\t\tif (!('alpha' in options)) options.alpha = false;\n\t\t\ttry {\n\t\t\t\tgl = canvas.getContext('webgl', options);\n\t\t\t} catch (e) {}\n\t\t\ttry {\n\t\t\t\tgl = gl || canvas.getContext('experimental-webgl', options);\n\t\t\t} catch (e) {}\n\t\t\tif (!gl) throw 'WebGL not supported';\n\t\t\taddMatrixStack();\n\t\t\taddImmediateMode();\n\t\t\t//addEventListeners();\n\t\t\taddOtherMethods();\n\t\t\treturn gl;\n\t\t},\n\n\t\t// `GL.keys` contains a mapping of key codes to booleans indicating whether\n\t\t// that key is currently pressed.\n\t\tkeys: {},\n\n\t\t// Export all external classes.\n\t\tMatrix: Matrix,\n\t\tIndexer: Indexer,\n\t\tBuffer: Buffer,\n\t\tMesh: Mesh,\n\t\tHitTest: HitTest,\n\t\tRaytracer: Raytracer,\n\t\tShader: Shader,\n\t\tTexture: Texture,\n\t\tVector: Vector\n\t};\n\n\t// ### Matrix stack\n\t//\n\t// Implement the OpenGL modelview and projection matrix stacks, along with some\n\t// other useful GLU matrix functions.\n\n\tfunction addMatrixStack() {\n\t\tgl.MODELVIEW = ENUM | 1;\n\t\tgl.PROJECTION = ENUM | 2;\n\t\tvar tempMatrix = new Matrix();\n\t\tvar resultMatrix = new Matrix();\n\t\tgl.modelviewMatrix = new Matrix();\n\t\tgl.projectionMatrix = new Matrix();\n\t\tvar modelviewStack = [];\n\t\tvar projectionStack = [];\n\t\tvar matrix, stack;\n\t\tgl.matrixMode = function (mode) {\n\t\t\tswitch (mode) {\n\t\t\t\tcase gl.MODELVIEW:\n\t\t\t\t\tmatrix = 'modelviewMatrix';\n\t\t\t\t\tstack = modelviewStack;\n\t\t\t\t\tbreak;\n\t\t\t\tcase gl.PROJECTION:\n\t\t\t\t\tmatrix = 'projectionMatrix';\n\t\t\t\t\tstack = projectionStack;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow 'invalid matrix mode ' + mode;\n\t\t\t}\n\t\t};\n\t\tgl.loadIdentity = function () {\n\t\t\tMatrix.identity(gl[matrix]);\n\t\t};\n\t\tgl.loadMatrix = function (m) {\n\t\t\tvar from = m.m,\n\t\t\t    to = gl[matrix].m;\n\t\t\tfor (var i = 0; i < 16; i++) {\n\t\t\t\tto[i] = from[i];\n\t\t\t}\n\t\t};\n\t\tgl.multMatrix = function (m) {\n\t\t\tgl.loadMatrix(Matrix.multiply(gl[matrix], m, resultMatrix));\n\t\t};\n\t\tgl.perspective = function (fov, aspect, near, far) {\n\t\t\tgl.multMatrix(Matrix.perspective(fov, aspect, near, far, tempMatrix));\n\t\t};\n\t\tgl.frustum = function (l, r, b, t, n, f) {\n\t\t\tgl.multMatrix(Matrix.frustum(l, r, b, t, n, f, tempMatrix));\n\t\t};\n\t\tgl.ortho = function (l, r, b, t, n, f) {\n\t\t\tgl.multMatrix(Matrix.ortho(l, r, b, t, n, f, tempMatrix));\n\t\t};\n\t\tgl.scale = function (x, y, z) {\n\t\t\tgl.multMatrix(Matrix.scale(x, y, z, tempMatrix));\n\t\t};\n\t\tgl.translate = function (x, y, z) {\n\t\t\tgl.multMatrix(Matrix.translate(x, y, z, tempMatrix));\n\t\t};\n\t\tgl.rotate = function (a, x, y, z) {\n\t\t\tgl.multMatrix(Matrix.rotate(a, x, y, z, tempMatrix));\n\t\t};\n\t\tgl.lookAt = function (ex, ey, ez, cx, cy, cz, ux, uy, uz) {\n\t\t\tgl.multMatrix(Matrix.lookAt(ex, ey, ez, cx, cy, cz, ux, uy, uz, tempMatrix));\n\t\t};\n\t\tgl.pushMatrix = function () {\n\t\t\tstack.push(Array.prototype.slice.call(gl[matrix].m));\n\t\t};\n\t\tgl.popMatrix = function () {\n\t\t\tvar m = stack.pop();\n\t\t\tgl[matrix].m = hasFloat32Array ? new Float32Array(m) : m;\n\t\t};\n\t\tgl.project = function (objX, objY, objZ, modelview, projection, viewport) {\n\t\t\tmodelview = modelview || gl.modelviewMatrix;\n\t\t\tprojection = projection || gl.projectionMatrix;\n\t\t\tviewport = viewport || gl.getParameter(gl.VIEWPORT);\n\t\t\tvar point = projection.transformPoint(modelview.transformPoint(new Vector(objX, objY, objZ)));\n\t\t\treturn new Vector(viewport[0] + viewport[2] * (point.x * 0.5 + 0.5), viewport[1] + viewport[3] * (point.y * 0.5 + 0.5), point.z * 0.5 + 0.5);\n\t\t};\n\t\tgl.unProject = function (winX, winY, winZ, modelview, projection, viewport) {\n\t\t\tmodelview = modelview || gl.modelviewMatrix;\n\t\t\tprojection = projection || gl.projectionMatrix;\n\t\t\tviewport = viewport || gl.getParameter(gl.VIEWPORT);\n\t\t\tvar point = new Vector((winX - viewport[0]) / viewport[2] * 2 - 1, (winY - viewport[1]) / viewport[3] * 2 - 1, winZ * 2 - 1);\n\t\t\treturn Matrix.inverse(Matrix.multiply(projection, modelview, tempMatrix), resultMatrix).transformPoint(point);\n\t\t};\n\t\tgl.matrixMode(gl.MODELVIEW);\n\t}\n\n\t// ### Immediate mode\n\t//\n\t// Provide an implementation of OpenGL's deprecated immediate mode. This is\n\t// depricated for a reason: constantly re-specifying the geometry is a bad\n\t// idea for performance. You should use a `GL.Mesh` instead, which specifies\n\t// the geometry once and caches it on the graphics card. Still, nothing\n\t// beats a quick `gl.begin(gl.POINTS); gl.vertex(1, 2, 3); gl.end();` for\n\t// debugging. This intentionally doesn't implement fixed-function lighting\n\t// because it's only meant for quick debugging tasks.\n\n\tfunction addImmediateMode() {\n\t\tvar immediateMode = {\n\t\t\tmesh: new Mesh({\n\t\t\t\tcoords: true,\n\t\t\t\tcolors: true,\n\t\t\t\ttriangles: false\n\t\t\t}),\n\t\t\tmode: -1,\n\t\t\tcoord: [0, 0, 0, 0],\n\t\t\tcolor: [1, 1, 1, 1],\n\t\t\tpointSize: 1,\n\t\t\tshader: new Shader('\\\n      uniform float pointSize;\\\n      varying vec4 color;\\\n      varying vec4 coord;\\\n      void main() {\\\n        color = gl_Color;\\\n        coord = gl_TexCoord;\\\n        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\\n        gl_PointSize = pointSize;\\\n      }\\\n    ', '\\\n      uniform sampler2D texture;\\\n      uniform float pointSize;\\\n      uniform bool useTexture;\\\n      varying vec4 color;\\\n      varying vec4 coord;\\\n      void main() {\\\n        gl_FragColor = color;\\\n        if (useTexture) gl_FragColor *= texture2D(texture, coord.xy);\\\n      }\\\n    ')\n\t\t};\n\t\tgl.pointSize = function (pointSize) {\n\t\t\timmediateMode.shader.uniforms({\n\t\t\t\tpointSize: pointSize\n\t\t\t});\n\t\t};\n\t\tgl.begin = function (mode) {\n\t\t\tif (immediateMode.mode != -1) throw 'mismatched gl.begin() and gl.end() calls';\n\t\t\timmediateMode.mode = mode;\n\t\t\timmediateMode.mesh.colors = [];\n\t\t\timmediateMode.mesh.coords = [];\n\t\t\timmediateMode.mesh.vertices = [];\n\t\t};\n\t\tgl.color = function (r, g, b, a) {\n\t\t\timmediateMode.color = arguments.length == 1 ? r.toArray().concat(1) : [r, g, b, a || 1];\n\t\t};\n\t\tgl.texCoord = function (s, t) {\n\t\t\timmediateMode.coord = arguments.length == 1 ? s.toArray(2) : [s, t];\n\t\t};\n\t\tgl.vertex = function (x, y, z) {\n\t\t\timmediateMode.mesh.colors.push(immediateMode.color);\n\t\t\timmediateMode.mesh.coords.push(immediateMode.coord);\n\t\t\timmediateMode.mesh.vertices.push(arguments.length == 1 ? x.toArray() : [x, y, z]);\n\t\t};\n\t\tgl.end = function () {\n\t\t\tif (immediateMode.mode == -1) throw 'mismatched gl.begin() and gl.end() calls';\n\t\t\timmediateMode.mesh.compile();\n\t\t\timmediateMode.shader.uniforms({\n\t\t\t\tuseTexture: !!gl.getParameter(gl.TEXTURE_BINDING_2D)\n\t\t\t}).draw(immediateMode.mesh, immediateMode.mode);\n\t\t\timmediateMode.mode = -1;\n\t\t};\n\t}\n\n\t// ### Improved mouse events\n\t//\n\t// This adds event listeners on the `gl.canvas` element that call\n\t// `gl.onmousedown()`, `gl.onmousemove()`, and `gl.onmouseup()` with an\n\t// augmented event object. The event object also has the properties `x`, `y`,\n\t// `deltaX`, `deltaY`, and `dragging`.\n\n\n\tfunction addEventListeners() {\n\t\tconsole.log('adding event listeners');\n\n\t\tvar context = gl,\n\t\t    oldX = 0,\n\t\t    oldY = 0,\n\t\t    buttons = {},\n\t\t    hasOld = false;\n\t\tvar has = Object.prototype.hasOwnProperty;\n\n\t\tfunction isDragging() {\n\t\t\tfor (var b in buttons) {\n\t\t\t\tif (has.call(buttons, b) && buttons[b]) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction augment(original) {\n\t\t\t// Make a copy of original, a native `MouseEvent`, so we can overwrite\n\t\t\t// WebKit's non-standard read-only `x` and `y` properties (which are just\n\t\t\t// duplicates of `pageX` and `pageY`). We can't just use\n\t\t\t// `Object.create(original)` because some `MouseEvent` functions must be\n\t\t\t// called in the context of the original event object.\n\t\t\tvar e = {};\n\t\t\tfor (var name in original) {\n\t\t\t\tif (typeof original[name] == 'function') {\n\t\t\t\t\te[name] = function (callback) {\n\t\t\t\t\t\treturn function () {\n\t\t\t\t\t\t\tcallback.apply(original, arguments);\n\t\t\t\t\t\t};\n\t\t\t\t\t}(original[name]);\n\t\t\t\t} else {\n\t\t\t\t\te[name] = original[name];\n\t\t\t\t}\n\t\t\t}\n\t\t\te.original = original;\n\t\t\te.x = e.pageX;\n\t\t\te.y = e.pageY;\n\t\t\tfor (var obj = gl.canvas; obj; obj = obj.offsetParent) {\n\t\t\t\te.x -= obj.offsetLeft;\n\t\t\t\te.y -= obj.offsetTop;\n\t\t\t}\n\t\t\tif (hasOld) {\n\t\t\t\te.deltaX = e.x - oldX;\n\t\t\t\te.deltaY = e.y - oldY;\n\t\t\t} else {\n\t\t\t\te.deltaX = 0;\n\t\t\t\te.deltaY = 0;\n\t\t\t\thasOld = true;\n\t\t\t}\n\t\t\toldX = e.x;\n\t\t\toldY = e.y;\n\t\t\te.dragging = isDragging();\n\t\t\te.preventDefault = function () {\n\t\t\t\te.original.preventDefault();\n\t\t\t};\n\t\t\te.stopPropagation = function () {\n\t\t\t\te.original.stopPropagation();\n\t\t\t};\n\t\t\treturn e;\n\t\t}\n\n\t\tfunction augmentTouchEvent(original) {\n\t\t\tvar e = {};\n\t\t\tfor (var name in original) {\n\t\t\t\tif (typeof original[name] == 'function') {\n\t\t\t\t\te[name] = function (callback) {\n\t\t\t\t\t\treturn function () {\n\t\t\t\t\t\t\tcallback.apply(original, arguments);\n\t\t\t\t\t\t};\n\t\t\t\t\t}(original[name]);\n\t\t\t\t} else {\n\t\t\t\t\te[name] = original[name];\n\t\t\t\t}\n\t\t\t}\n\t\t\te.original = original;\n\n\t\t\tif (e.targetTouches.length > 0) {\n\t\t\t\tvar touch = e.targetTouches[0];\n\t\t\t\te.x = touch.pageX;\n\t\t\t\te.y = touch.pageY;\n\n\t\t\t\tfor (var obj = gl.canvas; obj; obj = obj.offsetParent) {\n\t\t\t\t\te.x -= obj.offsetLeft;\n\t\t\t\t\te.y -= obj.offsetTop;\n\t\t\t\t}\n\t\t\t\tif (hasOld) {\n\t\t\t\t\te.deltaX = e.x - oldX;\n\t\t\t\t\te.deltaY = e.y - oldY;\n\t\t\t\t} else {\n\t\t\t\t\te.deltaX = 0;\n\t\t\t\t\te.deltaY = 0;\n\t\t\t\t\thasOld = true;\n\t\t\t\t}\n\t\t\t\toldX = e.x;\n\t\t\t\toldY = e.y;\n\t\t\t\te.dragging = true;\n\t\t\t}\n\n\t\t\te.preventDefault = function () {\n\t\t\t\te.original.preventDefault();\n\t\t\t};\n\t\t\te.stopPropagation = function () {\n\t\t\t\te.original.stopPropagation();\n\t\t\t};\n\t\t\treturn e;\n\t\t}\n\n\t\tfunction mousedown(e) {\n\t\t\tgl = context;\n\t\t\tif (!isDragging()) {\n\t\t\t\t// Expand the event handlers to the document to handle dragging off canvas.\n\t\t\t\ton(document, 'mousemove', mousemove);\n\t\t\t\ton(document, 'mouseup', mouseup);\n\t\t\t\toff(gl.canvas, 'mousemove', mousemove);\n\t\t\t\toff(gl.canvas, 'mouseup', mouseup);\n\t\t\t}\n\t\t\tbuttons[e.which] = true;\n\t\t\te = augment(e);\n\t\t\tif (gl.onmousedown) gl.onmousedown(e);\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfunction mousemove(e) {\n\t\t\tconsole.log('mousemove', e);\n\t\t\tgl = context;\n\t\t\te = augment(e);\n\t\t\tif (gl.onmousemove) gl.onmousemove(e);\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfunction mouseup(e) {\n\t\t\tgl = context;\n\t\t\tbuttons[e.which] = false;\n\t\t\tif (!isDragging()) {\n\t\t\t\t// Shrink the event handlers back to the canvas when dragging ends.\n\t\t\t\toff(document, 'mousemove', mousemove);\n\t\t\t\toff(document, 'mouseup', mouseup);\n\t\t\t\ton(gl.canvas, 'mousemove', mousemove);\n\t\t\t\ton(gl.canvas, 'mouseup', mouseup);\n\t\t\t}\n\t\t\te = augment(e);\n\t\t\tif (gl.onmouseup) gl.onmouseup(e);\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfunction mousewheel(e) {\n\t\t\tgl = context;\n\t\t\te = augment(e);\n\t\t\tif (gl.onmousewheel) gl.onmousewheel(e);\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfunction touchstart(e) {\n\t\t\tresetAll();\n\t\t\t// Expand the event handlers to the document to handle dragging off canvas.\n\t\t\ton(document, 'touchmove', touchmove);\n\t\t\ton(document, 'touchend', touchend);\n\t\t\toff(gl.canvas, 'touchmove', touchmove);\n\t\t\toff(gl.canvas, 'touchend', touchend);\n\t\t\tgl = context;\n\t\t\te = augmentTouchEvent(e);\n\t\t\tif (gl.ontouchstart) gl.ontouchstart(e);\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfunction touchmove(e) {\n\t\t\tgl = context;\n\t\t\tif (e.targetTouches.length === 0) {\n\t\t\t\ttouchend(e);\n\t\t\t}\n\t\t\te = augmentTouchEvent(e);\n\t\t\tif (gl.ontouchmove) gl.ontouchmove(e);\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfunction touchend(e) {\n\t\t\t// Shrink the event handlers back to the canvas when dragging ends.\n\t\t\toff(document, 'touchmove', touchmove);\n\t\t\toff(document, 'touchend', touchend);\n\t\t\ton(gl.canvas, 'touchmove', touchmove);\n\t\t\ton(gl.canvas, 'touchend', touchend);\n\t\t\tgl = context;\n\t\t\te = augmentTouchEvent(e);\n\t\t\tif (gl.ontouchend) gl.ontouchend(e);\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfunction reset() {\n\t\t\thasOld = false;\n\t\t}\n\n\t\tfunction resetAll() {\n\t\t\tbuttons = {};\n\t\t\thasOld = false;\n\t\t}\n\n\t\t// We can keep mouse and touch events enabled at the same time,\n\t\t// because Google Chrome will apparently never fire both of them.\n\t\ton(gl.canvas, 'mousedown', mousedown);\n\t\ton(gl.canvas, 'mousemove', mousemove);\n\t\ton(gl.canvas, 'mouseup', mouseup);\n\t\ton(gl.canvas, 'mousewheel', mousewheel);\n\t\ton(gl.canvas, 'DOMMouseScroll', mousewheel);\n\t\ton(gl.canvas, 'mouseover', reset);\n\t\ton(gl.canvas, 'mouseout', reset);\n\t\ton(gl.canvas, 'touchstart', touchstart);\n\t\ton(gl.canvas, 'touchmove', touchmove);\n\t\ton(gl.canvas, 'touchend', touchend);\n\t\ton(document, 'contextmenu', resetAll);\n\t}\n\n\t// ### Automatic keyboard state\n\t//\n\t// The current keyboard state is stored in `GL.keys`, a map of integer key\n\t// codes to booleans indicating whether that key is currently pressed. Certain\n\t// keys also have named identifiers that can be used directly, such as\n\t// `GL.keys.SPACE`. Values in `GL.keys` are initially undefined until that\n\t// key is pressed for the first time. If you need a boolean value, you can\n\t// cast the value to boolean by applying the not operator twice (as in\n\t// `!!GL.keys.SPACE`).\n\n\tfunction mapKeyCode(code) {\n\t\tvar named = {\n\t\t\t8: 'BACKSPACE',\n\t\t\t9: 'TAB',\n\t\t\t13: 'ENTER',\n\t\t\t16: 'SHIFT',\n\t\t\t27: 'ESCAPE',\n\t\t\t32: 'SPACE',\n\t\t\t37: 'LEFT',\n\t\t\t38: 'UP',\n\t\t\t39: 'RIGHT',\n\t\t\t40: 'DOWN'\n\t\t};\n\t\treturn named[code] || (code >= 65 && code <= 90 ? String.fromCharCode(code) : null);\n\t}\n\n\tfunction on(element, name, callback) {\n\t\telement.addEventListener(name, callback);\n\t}\n\n\tfunction off(element, name, callback) {\n\t\telement.removeEventListener(name, callback);\n\t}\n\n\ton(document, 'keydown', function (e) {\n\t\tif (!e.altKey && !e.ctrlKey && !e.metaKey) {\n\t\t\tvar key = mapKeyCode(e.keyCode);\n\t\t\tif (key) GL.keys[key] = true;\n\t\t\tGL.keys[e.keyCode] = true;\n\t\t}\n\t});\n\n\ton(document, 'keyup', function (e) {\n\t\tif (!e.altKey && !e.ctrlKey && !e.metaKey) {\n\t\t\tvar key = mapKeyCode(e.keyCode);\n\t\t\tif (key) GL.keys[key] = false;\n\t\t\tGL.keys[e.keyCode] = false;\n\t\t}\n\t});\n\n\tfunction addOtherMethods() {\n\t\t// ### Multiple contexts\n\t\t//\n\t\t// When using multiple contexts in one web page, `gl.makeCurrent()` must be\n\t\t// called before issuing commands to a different context.\n\t\t(function (context) {\n\t\t\tgl.makeCurrent = function () {\n\t\t\t\tgl = context;\n\t\t\t};\n\t\t})(gl);\n\n\t\t// ### Animation\n\t\t//\n\t\t// Call `gl.animate()` to provide an animation loop that repeatedly calls\n\t\t// `gl.onupdate()` and `gl.ondraw()`.\n\t\tgl.animate = function () {\n\t\t\tvar post = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (callback) {\n\t\t\t\tsetTimeout(callback, 1000 / 60);\n\t\t\t};\n\t\t\tvar time = new Date().getTime();\n\t\t\tvar context = gl;\n\n\t\t\tfunction update() {\n\t\t\t\tgl = context;\n\t\t\t\tvar now = new Date().getTime();\n\t\t\t\tif (gl.onupdate) gl.onupdate((now - time) / 1000);\n\t\t\t\tif (gl.ondraw) gl.ondraw();\n\t\t\t\tpost(update);\n\t\t\t\ttime = now;\n\t\t\t}\n\t\t\tupdate();\n\t\t};\n\n\t\t// ### Fullscreen\n\t\t//\n\t\t// Provide an easy way to get a fullscreen app running, including an\n\t\t// automatic 3D perspective projection matrix by default. This should be\n\t\t// called once.\n\t\t//\n\t\t// Just fullscreen, no automatic camera:\n\t\t//\n\t\t//     gl.fullscreen({ camera: false });\n\t\t//\n\t\t// Adjusting field of view, near plane distance, and far plane distance:\n\t\t//\n\t\t//     gl.fullscreen({ fov: 45, near: 0.1, far: 1000 });\n\t\t//\n\t\t// Adding padding from the edge of the window:\n\t\t//\n\t\t//     gl.fullscreen({ paddingLeft: 250, paddingBottom: 60 });\n\t\t//\n\t\tgl.fullscreen = function (options) {\n\t\t\toptions = options || {};\n\t\t\tvar top = options.paddingTop || 0;\n\t\t\tvar left = options.paddingLeft || 0;\n\t\t\tvar right = options.paddingRight || 0;\n\t\t\tvar bottom = options.paddingBottom || 0;\n\t\t\tif (!document.body) {\n\t\t\t\tthrow 'document.body doesn\\'t exist yet (call gl.fullscreen() from ' + 'window.onload() or from inside the <body> tag)';\n\t\t\t}\n\t\t\tdocument.body.appendChild(gl.canvas);\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t\tgl.canvas.style.position = 'absolute';\n\t\t\tgl.canvas.style.left = left + 'px';\n\t\t\tgl.canvas.style.top = top + 'px';\n\n\t\t\tfunction resize() {\n\t\t\t\tgl.canvas.width = window.innerWidth - left - right;\n\t\t\t\tgl.canvas.height = window.innerHeight - top - bottom;\n\t\t\t\tgl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\t\t\t\tif (options.camera || !('camera' in options)) {\n\t\t\t\t\tgl.matrixMode(gl.PROJECTION);\n\t\t\t\t\tgl.loadIdentity();\n\t\t\t\t\tgl.perspective(options.fov || 45, gl.canvas.width / gl.canvas.height, options.near || 0.1, options.far || 1000);\n\t\t\t\t\tgl.matrixMode(gl.MODELVIEW);\n\t\t\t\t}\n\t\t\t\tif (gl.onresize) gl.onresize();\n\t\t\t\tif (gl.ondraw) gl.ondraw();\n\t\t\t}\n\t\t\ton(window, 'resize', resize);\n\t\t\tresize();\n\t\t};\n\t}\n\n\t// A value to bitwise-or with new enums to make them distinguishable from the\n\t// standard WebGL enums.\n\tvar ENUM = 0x12340000;\n\n\t// src/matrix.js\n\t// Represents a 4x4 matrix stored in row-major order that uses Float32Arrays\n\t// when available. Matrix operations can either be done using convenient\n\t// methods that return a new matrix for the result or optimized methods\n\t// that store the result in an existing matrix to avoid generating garbage.\n\tvar hasFloat32Array = typeof Float32Array != 'undefined';\n\n\t// ### new GL.Matrix([elements])\n\t//\n\t// This constructor takes 16 arguments in row-major order, which can be passed\n\t// individually, as a list, or even as four lists, one for each row. If the\n\t// arguments are omitted then the identity matrix is constructed instead.\n\n\n\tfunction Matrix() {\n\t\tvar m = Array.prototype.concat.apply([], arguments);\n\t\tif (!m.length) {\n\t\t\tm = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n\t\t}\n\t\tthis.m = hasFloat32Array ? new Float32Array(m) : m;\n\t}\n\n\tMatrix.prototype = {\n\t\t// ### .inverse()\n\t\t//\n\t\t// Returns the matrix that when multiplied with this matrix results in the\n\t\t// identity matrix.\n\t\tinverse: function inverse() {\n\t\t\treturn Matrix.inverse(this, new Matrix());\n\t\t},\n\n\t\t// ### .transpose()\n\t\t//\n\t\t// Returns this matrix, exchanging columns for rows.\n\t\ttranspose: function transpose() {\n\t\t\treturn Matrix.transpose(this, new Matrix());\n\t\t},\n\n\t\t// ### .multiply(matrix)\n\t\t//\n\t\t// Returns the concatenation of the transforms for this matrix and `matrix`.\n\t\t// This emulates the OpenGL function `glMultMatrix()`.\n\t\tmultiply: function multiply(matrix) {\n\t\t\treturn Matrix.multiply(this, matrix, new Matrix());\n\t\t},\n\n\t\t// ### .transformPoint(point)\n\t\t//\n\t\t// Transforms the vector as a point with a w coordinate of 1. This\n\t\t// means translations will have an effect, for example.\n\t\ttransformPoint: function transformPoint(v) {\n\t\t\tvar m = this.m;\n\t\t\treturn new Vector(m[0] * v.x + m[1] * v.y + m[2] * v.z + m[3], m[4] * v.x + m[5] * v.y + m[6] * v.z + m[7], m[8] * v.x + m[9] * v.y + m[10] * v.z + m[11]).divide(m[12] * v.x + m[13] * v.y + m[14] * v.z + m[15]);\n\t\t},\n\n\t\t// ### .transformPoint(vector)\n\t\t//\n\t\t// Transforms the vector as a vector with a w coordinate of 0. This\n\t\t// means translations will have no effect, for example.\n\t\ttransformVector: function transformVector(v) {\n\t\t\tvar m = this.m;\n\t\t\treturn new Vector(m[0] * v.x + m[1] * v.y + m[2] * v.z, m[4] * v.x + m[5] * v.y + m[6] * v.z, m[8] * v.x + m[9] * v.y + m[10] * v.z);\n\t\t}\n\t};\n\n\t// ### GL.Matrix.inverse(matrix[, result])\n\t//\n\t// Returns the matrix that when multiplied with `matrix` results in the\n\t// identity matrix. You can optionally pass an existing matrix in `result`\n\t// to avoid allocating a new matrix. This implementation is from the Mesa\n\t// OpenGL function `__gluInvertMatrixd()` found in `project.c`.\n\tMatrix.inverse = function (matrix, result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = matrix.m,\n\t\t    r = result.m;\n\n\t\tr[0] = m[5] * m[10] * m[15] - m[5] * m[14] * m[11] - m[6] * m[9] * m[15] + m[6] * m[13] * m[11] + m[7] * m[9] * m[14] - m[7] * m[13] * m[10];\n\t\tr[1] = -m[1] * m[10] * m[15] + m[1] * m[14] * m[11] + m[2] * m[9] * m[15] - m[2] * m[13] * m[11] - m[3] * m[9] * m[14] + m[3] * m[13] * m[10];\n\t\tr[2] = m[1] * m[6] * m[15] - m[1] * m[14] * m[7] - m[2] * m[5] * m[15] + m[2] * m[13] * m[7] + m[3] * m[5] * m[14] - m[3] * m[13] * m[6];\n\t\tr[3] = -m[1] * m[6] * m[11] + m[1] * m[10] * m[7] + m[2] * m[5] * m[11] - m[2] * m[9] * m[7] - m[3] * m[5] * m[10] + m[3] * m[9] * m[6];\n\n\t\tr[4] = -m[4] * m[10] * m[15] + m[4] * m[14] * m[11] + m[6] * m[8] * m[15] - m[6] * m[12] * m[11] - m[7] * m[8] * m[14] + m[7] * m[12] * m[10];\n\t\tr[5] = m[0] * m[10] * m[15] - m[0] * m[14] * m[11] - m[2] * m[8] * m[15] + m[2] * m[12] * m[11] + m[3] * m[8] * m[14] - m[3] * m[12] * m[10];\n\t\tr[6] = -m[0] * m[6] * m[15] + m[0] * m[14] * m[7] + m[2] * m[4] * m[15] - m[2] * m[12] * m[7] - m[3] * m[4] * m[14] + m[3] * m[12] * m[6];\n\t\tr[7] = m[0] * m[6] * m[11] - m[0] * m[10] * m[7] - m[2] * m[4] * m[11] + m[2] * m[8] * m[7] + m[3] * m[4] * m[10] - m[3] * m[8] * m[6];\n\n\t\tr[8] = m[4] * m[9] * m[15] - m[4] * m[13] * m[11] - m[5] * m[8] * m[15] + m[5] * m[12] * m[11] + m[7] * m[8] * m[13] - m[7] * m[12] * m[9];\n\t\tr[9] = -m[0] * m[9] * m[15] + m[0] * m[13] * m[11] + m[1] * m[8] * m[15] - m[1] * m[12] * m[11] - m[3] * m[8] * m[13] + m[3] * m[12] * m[9];\n\t\tr[10] = m[0] * m[5] * m[15] - m[0] * m[13] * m[7] - m[1] * m[4] * m[15] + m[1] * m[12] * m[7] + m[3] * m[4] * m[13] - m[3] * m[12] * m[5];\n\t\tr[11] = -m[0] * m[5] * m[11] + m[0] * m[9] * m[7] + m[1] * m[4] * m[11] - m[1] * m[8] * m[7] - m[3] * m[4] * m[9] + m[3] * m[8] * m[5];\n\n\t\tr[12] = -m[4] * m[9] * m[14] + m[4] * m[13] * m[10] + m[5] * m[8] * m[14] - m[5] * m[12] * m[10] - m[6] * m[8] * m[13] + m[6] * m[12] * m[9];\n\t\tr[13] = m[0] * m[9] * m[14] - m[0] * m[13] * m[10] - m[1] * m[8] * m[14] + m[1] * m[12] * m[10] + m[2] * m[8] * m[13] - m[2] * m[12] * m[9];\n\t\tr[14] = -m[0] * m[5] * m[14] + m[0] * m[13] * m[6] + m[1] * m[4] * m[14] - m[1] * m[12] * m[6] - m[2] * m[4] * m[13] + m[2] * m[12] * m[5];\n\t\tr[15] = m[0] * m[5] * m[10] - m[0] * m[9] * m[6] - m[1] * m[4] * m[10] + m[1] * m[8] * m[6] + m[2] * m[4] * m[9] - m[2] * m[8] * m[5];\n\n\t\tvar det = m[0] * r[0] + m[1] * r[4] + m[2] * r[8] + m[3] * r[12];\n\t\tfor (var i = 0; i < 16; i++) {\n\t\t\tr[i] /= det;\n\t\t}return result;\n\t};\n\n\t// ### GL.Matrix.transpose(matrix[, result])\n\t//\n\t// Returns `matrix`, exchanging columns for rows. You can optionally pass an\n\t// existing matrix in `result` to avoid allocating a new matrix.\n\tMatrix.transpose = function (matrix, result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = matrix.m,\n\t\t    r = result.m;\n\t\tr[0] = m[0];\n\t\tr[1] = m[4];\n\t\tr[2] = m[8];\n\t\tr[3] = m[12];\n\t\tr[4] = m[1];\n\t\tr[5] = m[5];\n\t\tr[6] = m[9];\n\t\tr[7] = m[13];\n\t\tr[8] = m[2];\n\t\tr[9] = m[6];\n\t\tr[10] = m[10];\n\t\tr[11] = m[14];\n\t\tr[12] = m[3];\n\t\tr[13] = m[7];\n\t\tr[14] = m[11];\n\t\tr[15] = m[15];\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.multiply(left, right[, result])\n\t//\n\t// Returns the concatenation of the transforms for `left` and `right`. You can\n\t// optionally pass an existing matrix in `result` to avoid allocating a new\n\t// matrix. This emulates the OpenGL function `glMultMatrix()`.\n\tMatrix.multiply = function (left, right, result) {\n\t\tresult = result || new Matrix();\n\t\tvar a = left.m,\n\t\t    b = right.m,\n\t\t    r = result.m;\n\n\t\tr[0] = a[0] * b[0] + a[1] * b[4] + a[2] * b[8] + a[3] * b[12];\n\t\tr[1] = a[0] * b[1] + a[1] * b[5] + a[2] * b[9] + a[3] * b[13];\n\t\tr[2] = a[0] * b[2] + a[1] * b[6] + a[2] * b[10] + a[3] * b[14];\n\t\tr[3] = a[0] * b[3] + a[1] * b[7] + a[2] * b[11] + a[3] * b[15];\n\n\t\tr[4] = a[4] * b[0] + a[5] * b[4] + a[6] * b[8] + a[7] * b[12];\n\t\tr[5] = a[4] * b[1] + a[5] * b[5] + a[6] * b[9] + a[7] * b[13];\n\t\tr[6] = a[4] * b[2] + a[5] * b[6] + a[6] * b[10] + a[7] * b[14];\n\t\tr[7] = a[4] * b[3] + a[5] * b[7] + a[6] * b[11] + a[7] * b[15];\n\n\t\tr[8] = a[8] * b[0] + a[9] * b[4] + a[10] * b[8] + a[11] * b[12];\n\t\tr[9] = a[8] * b[1] + a[9] * b[5] + a[10] * b[9] + a[11] * b[13];\n\t\tr[10] = a[8] * b[2] + a[9] * b[6] + a[10] * b[10] + a[11] * b[14];\n\t\tr[11] = a[8] * b[3] + a[9] * b[7] + a[10] * b[11] + a[11] * b[15];\n\n\t\tr[12] = a[12] * b[0] + a[13] * b[4] + a[14] * b[8] + a[15] * b[12];\n\t\tr[13] = a[12] * b[1] + a[13] * b[5] + a[14] * b[9] + a[15] * b[13];\n\t\tr[14] = a[12] * b[2] + a[13] * b[6] + a[14] * b[10] + a[15] * b[14];\n\t\tr[15] = a[12] * b[3] + a[13] * b[7] + a[14] * b[11] + a[15] * b[15];\n\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.identity([result])\n\t//\n\t// Returns an identity matrix. You can optionally pass an existing matrix in\n\t// `result` to avoid allocating a new matrix. This emulates the OpenGL function\n\t// `glLoadIdentity()`.\n\tMatrix.identity = function (result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = result.m;\n\t\tm[0] = m[5] = m[10] = m[15] = 1;\n\t\tm[1] = m[2] = m[3] = m[4] = m[6] = m[7] = m[8] = m[9] = m[11] = m[12] = m[13] = m[14] = 0;\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.perspective(fov, aspect, near, far[, result])\n\t//\n\t// Returns a perspective transform matrix, which makes far away objects appear\n\t// smaller than nearby objects. The `aspect` argument should be the width\n\t// divided by the height of your viewport and `fov` is the top-to-bottom angle\n\t// of the field of view in degrees. You can optionally pass an existing matrix\n\t// in `result` to avoid allocating a new matrix. This emulates the OpenGL\n\t// function `gluPerspective()`.\n\tMatrix.perspective = function (fov, aspect, near, far, result) {\n\t\tvar y = Math.tan(fov * Math.PI / 360) * near;\n\t\tvar x = y * aspect;\n\t\treturn Matrix.frustum(-x, x, -y, y, near, far, result);\n\t};\n\n\t// ### GL.Matrix.frustum(left, right, bottom, top, near, far[, result])\n\t//\n\t// Sets up a viewing frustum, which is shaped like a truncated pyramid with the\n\t// camera where the point of the pyramid would be. You can optionally pass an\n\t// existing matrix in `result` to avoid allocating a new matrix. This emulates\n\t// the OpenGL function `glFrustum()`.\n\tMatrix.frustum = function (l, r, b, t, n, f, result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = result.m;\n\n\t\tm[0] = 2 * n / (r - l);\n\t\tm[1] = 0;\n\t\tm[2] = (r + l) / (r - l);\n\t\tm[3] = 0;\n\n\t\tm[4] = 0;\n\t\tm[5] = 2 * n / (t - b);\n\t\tm[6] = (t + b) / (t - b);\n\t\tm[7] = 0;\n\n\t\tm[8] = 0;\n\t\tm[9] = 0;\n\t\tm[10] = -(f + n) / (f - n);\n\t\tm[11] = -2 * f * n / (f - n);\n\n\t\tm[12] = 0;\n\t\tm[13] = 0;\n\t\tm[14] = -1;\n\t\tm[15] = 0;\n\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.ortho(left, right, bottom, top, near, far[, result])\n\t//\n\t// Returns an orthographic projection, in which objects are the same size no\n\t// matter how far away or nearby they are. You can optionally pass an existing\n\t// matrix in `result` to avoid allocating a new matrix. This emulates the OpenGL\n\t// function `glOrtho()`.\n\tMatrix.ortho = function (l, r, b, t, n, f, result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = result.m;\n\n\t\tm[0] = 2 / (r - l);\n\t\tm[1] = 0;\n\t\tm[2] = 0;\n\t\tm[3] = -(r + l) / (r - l);\n\n\t\tm[4] = 0;\n\t\tm[5] = 2 / (t - b);\n\t\tm[6] = 0;\n\t\tm[7] = -(t + b) / (t - b);\n\n\t\tm[8] = 0;\n\t\tm[9] = 0;\n\t\tm[10] = -2 / (f - n);\n\t\tm[11] = -(f + n) / (f - n);\n\n\t\tm[12] = 0;\n\t\tm[13] = 0;\n\t\tm[14] = 0;\n\t\tm[15] = 1;\n\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.scale(x, y, z[, result])\n\t//\n\t// This emulates the OpenGL function `glScale()`. You can optionally pass an\n\t// existing matrix in `result` to avoid allocating a new matrix.\n\tMatrix.scale = function (x, y, z, result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = result.m;\n\n\t\tm[0] = x;\n\t\tm[1] = 0;\n\t\tm[2] = 0;\n\t\tm[3] = 0;\n\n\t\tm[4] = 0;\n\t\tm[5] = y;\n\t\tm[6] = 0;\n\t\tm[7] = 0;\n\n\t\tm[8] = 0;\n\t\tm[9] = 0;\n\t\tm[10] = z;\n\t\tm[11] = 0;\n\n\t\tm[12] = 0;\n\t\tm[13] = 0;\n\t\tm[14] = 0;\n\t\tm[15] = 1;\n\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.translate(x, y, z[, result])\n\t//\n\t// This emulates the OpenGL function `glTranslate()`. You can optionally pass\n\t// an existing matrix in `result` to avoid allocating a new matrix.\n\tMatrix.translate = function (x, y, z, result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = result.m;\n\n\t\tm[0] = 1;\n\t\tm[1] = 0;\n\t\tm[2] = 0;\n\t\tm[3] = x;\n\n\t\tm[4] = 0;\n\t\tm[5] = 1;\n\t\tm[6] = 0;\n\t\tm[7] = y;\n\n\t\tm[8] = 0;\n\t\tm[9] = 0;\n\t\tm[10] = 1;\n\t\tm[11] = z;\n\n\t\tm[12] = 0;\n\t\tm[13] = 0;\n\t\tm[14] = 0;\n\t\tm[15] = 1;\n\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.rotate(a, x, y, z[, result])\n\t//\n\t// Returns a matrix that rotates by `a` degrees around the vector `x, y, z`.\n\t// You can optionally pass an existing matrix in `result` to avoid allocating\n\t// a new matrix. This emulates the OpenGL function `glRotate()`.\n\tMatrix.rotate = function (a, x, y, z, result) {\n\t\tif (!a || !x && !y && !z) {\n\t\t\treturn Matrix.identity(result);\n\t\t}\n\n\t\tresult = result || new Matrix();\n\t\tvar m = result.m;\n\n\t\tvar d = Math.sqrt(x * x + y * y + z * z);\n\t\ta *= Math.PI / 180;\n\t\tx /= d;\n\t\ty /= d;\n\t\tz /= d;\n\t\tvar c = Math.cos(a),\n\t\t    s = Math.sin(a),\n\t\t    t = 1 - c;\n\n\t\tm[0] = x * x * t + c;\n\t\tm[1] = x * y * t - z * s;\n\t\tm[2] = x * z * t + y * s;\n\t\tm[3] = 0;\n\n\t\tm[4] = y * x * t + z * s;\n\t\tm[5] = y * y * t + c;\n\t\tm[6] = y * z * t - x * s;\n\t\tm[7] = 0;\n\n\t\tm[8] = z * x * t - y * s;\n\t\tm[9] = z * y * t + x * s;\n\t\tm[10] = z * z * t + c;\n\t\tm[11] = 0;\n\n\t\tm[12] = 0;\n\t\tm[13] = 0;\n\t\tm[14] = 0;\n\t\tm[15] = 1;\n\n\t\treturn result;\n\t};\n\n\t// ### GL.Matrix.lookAt(ex, ey, ez, cx, cy, cz, ux, uy, uz[, result])\n\t//\n\t// Returns a matrix that puts the camera at the eye point `ex, ey, ez` looking\n\t// toward the center point `cx, cy, cz` with an up direction of `ux, uy, uz`.\n\t// You can optionally pass an existing matrix in `result` to avoid allocating\n\t// a new matrix. This emulates the OpenGL function `gluLookAt()`.\n\tMatrix.lookAt = function (ex, ey, ez, cx, cy, cz, ux, uy, uz, result) {\n\t\tresult = result || new Matrix();\n\t\tvar m = result.m;\n\n\t\tvar e = new Vector(ex, ey, ez);\n\t\tvar c = new Vector(cx, cy, cz);\n\t\tvar u = new Vector(ux, uy, uz);\n\t\tvar f = e.subtract(c).unit();\n\t\tvar s = u.cross(f).unit();\n\t\tvar t = f.cross(s).unit();\n\n\t\tm[0] = s.x;\n\t\tm[1] = s.y;\n\t\tm[2] = s.z;\n\t\tm[3] = -s.dot(e);\n\n\t\tm[4] = t.x;\n\t\tm[5] = t.y;\n\t\tm[6] = t.z;\n\t\tm[7] = -t.dot(e);\n\n\t\tm[8] = f.x;\n\t\tm[9] = f.y;\n\t\tm[10] = f.z;\n\t\tm[11] = -f.dot(e);\n\n\t\tm[12] = 0;\n\t\tm[13] = 0;\n\t\tm[14] = 0;\n\t\tm[15] = 1;\n\n\t\treturn result;\n\t};\n\n\t// src/raytracer.js\n\t// Provides a convenient raytracing interface.\n\t// ### new GL.HitTest([t, hit, normal])\n\t//\n\t// This is the object used to return hit test results. If there are no\n\t// arguments, the constructed argument represents a hit infinitely far\n\t// away.\n\n\n\tfunction HitTest(t, hit, normal) {\n\t\tthis.t = arguments.length ? t : Number.MAX_VALUE;\n\t\tthis.hit = hit;\n\t\tthis.normal = normal;\n\t}\n\n\t// ### .mergeWith(other)\n\t//\n\t// Changes this object to be the closer of the two hit test results.\n\tHitTest.prototype = {\n\t\tmergeWith: function mergeWith(other) {\n\t\t\tif (other.t > 0 && other.t < this.t) {\n\t\t\t\tthis.t = other.t;\n\t\t\t\tthis.hit = other.hit;\n\t\t\t\tthis.normal = other.normal;\n\t\t\t}\n\t\t}\n\t};\n\n\t// ### new GL.Raytracer()\n\t//\n\t// This will read the current modelview matrix, projection matrix, and viewport,\n\t// reconstruct the eye position, and store enough information to later generate\n\t// per-pixel rays using `getRayForPixel()`.\n\t//\n\t// Example usage:\n\t//\n\t//     var tracer = new GL.Raytracer();\n\t//     var ray = tracer.getRayForPixel(\n\t//       gl.canvas.width / 2,\n\t//       gl.canvas.height / 2);\n\t//     var result = GL.Raytracer.hitTestSphere(\n\t//       tracer.eye, ray, new GL.Vector(0, 0, 0), 1);\n\n\n\tfunction Raytracer() {\n\t\tvar v = gl.getParameter(gl.VIEWPORT);\n\t\tvar m = gl.modelviewMatrix.m;\n\n\t\tvar axisX = new Vector(m[0], m[4], m[8]);\n\t\tvar axisY = new Vector(m[1], m[5], m[9]);\n\t\tvar axisZ = new Vector(m[2], m[6], m[10]);\n\t\tvar offset = new Vector(m[3], m[7], m[11]);\n\t\tthis.eye = new Vector(-offset.dot(axisX), -offset.dot(axisY), -offset.dot(axisZ));\n\n\t\tvar minX = v[0],\n\t\t    maxX = minX + v[2];\n\t\tvar minY = v[1],\n\t\t    maxY = minY + v[3];\n\t\tthis.ray00 = gl.unProject(minX, minY, 1).subtract(this.eye);\n\t\tthis.ray10 = gl.unProject(maxX, minY, 1).subtract(this.eye);\n\t\tthis.ray01 = gl.unProject(minX, maxY, 1).subtract(this.eye);\n\t\tthis.ray11 = gl.unProject(maxX, maxY, 1).subtract(this.eye);\n\t\tthis.viewport = v;\n\t}\n\n\tRaytracer.prototype = {\n\t\t// ### .getRayForPixel(x, y)\n\t\t//\n\t\t// Returns the ray originating from the camera and traveling through the pixel `x, y`.\n\t\tgetRayForPixel: function getRayForPixel(x, y) {\n\t\t\tx = (x - this.viewport[0]) / this.viewport[2];\n\t\t\ty = 1 - (y - this.viewport[1]) / this.viewport[3];\n\t\t\tvar ray0 = Vector.lerp(this.ray00, this.ray10, x);\n\t\t\tvar ray1 = Vector.lerp(this.ray01, this.ray11, x);\n\t\t\treturn Vector.lerp(ray0, ray1, y).unit();\n\t\t}\n\t};\n\n\t// ### GL.Raytracer.hitTestBox(origin, ray, min, max)\n\t//\n\t// Traces the ray starting from `origin` along `ray` against the axis-aligned box\n\t// whose coordinates extend from `min` to `max`. Returns a `HitTest` with the\n\t// information or `null` for no intersection.\n\t//\n\t// This implementation uses the [slab intersection method](http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm).\n\tRaytracer.hitTestBox = function (origin, ray, min, max) {\n\t\tvar tMin = min.subtract(origin).divide(ray);\n\t\tvar tMax = max.subtract(origin).divide(ray);\n\t\tvar t1 = Vector.min(tMin, tMax);\n\t\tvar t2 = Vector.max(tMin, tMax);\n\t\tvar tNear = t1.max();\n\t\tvar tFar = t2.min();\n\n\t\tif (tNear > 0 && tNear < tFar) {\n\t\t\tvar epsilon = 1.0e-6,\n\t\t\t    hit = origin.add(ray.multiply(tNear));\n\t\t\tmin = min.add(epsilon);\n\t\t\tmax = max.subtract(epsilon);\n\t\t\treturn new HitTest(tNear, hit, new Vector((hit.x > max.x) - (hit.x < min.x), (hit.y > max.y) - (hit.y < min.y), (hit.z > max.z) - (hit.z < min.z)));\n\t\t}\n\n\t\treturn null;\n\t};\n\n\t// ### GL.Raytracer.hitTestSphere(origin, ray, center, radius)\n\t//\n\t// Traces the ray starting from `origin` along `ray` against the sphere defined\n\t// by `center` and `radius`. Returns a `HitTest` with the information or `null`\n\t// for no intersection.\n\tRaytracer.hitTestSphere = function (origin, ray, center, radius) {\n\t\tvar offset = origin.subtract(center);\n\t\tvar a = ray.dot(ray);\n\t\tvar b = 2 * ray.dot(offset);\n\t\tvar c = offset.dot(offset) - radius * radius;\n\t\tvar discriminant = b * b - 4 * a * c;\n\n\t\tif (discriminant > 0) {\n\t\t\tvar t = (-b - Math.sqrt(discriminant)) / (2 * a),\n\t\t\t    hit = origin.add(ray.multiply(t));\n\t\t\treturn new HitTest(t, hit, hit.subtract(center).divide(radius));\n\t\t}\n\n\t\treturn null;\n\t};\n\n\t// ### GL.Raytracer.hitTestTriangle(origin, ray, a, b, c)\n\t//\n\t// Traces the ray starting from `origin` along `ray` against the triangle defined\n\t// by the points `a`, `b`, and `c`. Returns a `HitTest` with the information or\n\t// `null` for no intersection.\n\tRaytracer.hitTestTriangle = function (origin, ray, a, b, c) {\n\t\tvar ab = b.subtract(a);\n\t\tvar ac = c.subtract(a);\n\t\tvar normal = ab.cross(ac).unit();\n\t\tvar t = normal.dot(a.subtract(origin)) / normal.dot(ray);\n\n\t\tif (t > 0) {\n\t\t\tvar hit = origin.add(ray.multiply(t));\n\t\t\tvar toHit = hit.subtract(a);\n\t\t\tvar dot00 = ac.dot(ac);\n\t\t\tvar dot01 = ac.dot(ab);\n\t\t\tvar dot02 = ac.dot(toHit);\n\t\t\tvar dot11 = ab.dot(ab);\n\t\t\tvar dot12 = ab.dot(toHit);\n\t\t\tvar divide = dot00 * dot11 - dot01 * dot01;\n\t\t\tvar u = (dot11 * dot02 - dot01 * dot12) / divide;\n\t\t\tvar v = (dot00 * dot12 - dot01 * dot02) / divide;\n\t\t\tif (u >= 0 && v >= 0 && u + v <= 1) return new HitTest(t, hit, normal);\n\t\t}\n\n\t\treturn null;\n\t};\n\n\treturn GL;\n}();\n\nmodule.exports = GL;\n\n},{}]},{},[290]);\n"]}