{
  "version": 3,
  "sources": ["/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_async_to_generator.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_instanceof.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_array_with_holes.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_iterable_to_array_limit.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_non_iterable_rest.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_array_like_to_array.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_sliced_to_array.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_array_without_holes.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_iterable_to_array.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_non_iterable_spread.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_to_consumable_array.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_type_of.js", "/Users/TXL/exiftool/node_modules/tslib/tslib.es6.mjs", "exiftool?raw", "/Users/TXL/exiftool/src/ex.ts", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_class_call_check.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_create_class.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_define_property.js", "/Users/TXL/exiftool/src/wasi/abi.ts", "/Users/TXL/exiftool/src/wasi/features/fd.ts", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_object_spread.js", "/Users/TXL/exiftool/src/wasi/features/args.ts", "/Users/TXL/exiftool/src/wasi/features/clock.ts", "/Users/TXL/exiftool/src/wasi/features/environ.ts", "/Users/TXL/exiftool/src/wasi/features/proc.ts", "/Users/TXL/exiftool/src/wasi/features/random.ts", "/Users/TXL/exiftool/src/wasi/index.ts", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_get_prototype_of.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_is_native_reflect_construct.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_assert_this_initialized.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_possible_constructor_return.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_call_super.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_super_prop_base.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_get.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_set_prototype_of.js", "/Users/TXL/exiftool/node_modules/@swc/helpers/esm/_inherits.js", "/Users/TXL/exiftool/src/wasi/asyncify.ts", "/Users/TXL/exiftool/src/sb.ts", "/Users/TXL/exiftool/src/index.ts"],
  "sourcesContent": ["function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n    try {\n        var info = gen[key](arg);\n        var value = info.value;\n    } catch (error) {\n        reject(error);\n        return;\n    }\n    if (info.done) resolve(value);\n    else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n    return function() {\n        var self = this, args = arguments;\n\n        return new Promise(function(resolve, reject) {\n            var gen = fn.apply(self, args);\n\n            function _next(value) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n            }\n\n            function _throw(err) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n            }\n\n            _next(undefined);\n        });\n    };\n}\nexport { _async_to_generator as _ };\n", "function _instanceof(left, right) {\n    if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n        return !!right[Symbol.hasInstance](left);\n    } else return left instanceof right;\n}\nexport { _instanceof as _ };\n", "function _array_with_holes(arr) {\n    if (Array.isArray(arr)) return arr;\n}\nexport { _array_with_holes as _ };\n", "function _iterable_to_array_limit(arr, i) {\n    var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n    if (_i == null) return;\n\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _s, _e;\n\n    try {\n        for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n            _arr.push(_s.value);\n            if (i && _arr.length === i) break;\n        }\n    } catch (err) {\n        _d = true;\n        _e = err;\n    } finally {\n        try {\n            if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n        } finally {\n            if (_d) throw _e;\n        }\n    }\n\n    return _arr;\n}\nexport { _iterable_to_array_limit as _ };\n", "function _non_iterable_rest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _non_iterable_rest as _ };\n", "function _array_like_to_array(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n    return arr2;\n}\nexport { _array_like_to_array as _ };\n", "import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(n);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n", "import { _ as _array_with_holes } from \"./_array_with_holes.js\";\nimport { _ as _iterable_to_array_limit } from \"./_iterable_to_array_limit.js\";\nimport { _ as _non_iterable_rest } from \"./_non_iterable_rest.js\";\nimport { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _sliced_to_array(arr, i) {\n    return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();\n}\nexport { _sliced_to_array as _ };\n", "import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _array_without_holes(arr) {\n    if (Array.isArray(arr)) return _array_like_to_array(arr);\n}\nexport { _array_without_holes as _ };\n", "function _iterable_to_array(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) {\n        return Array.from(iter);\n    }\n}\nexport { _iterable_to_array as _ };\n", "function _non_iterable_spread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _non_iterable_spread as _ };\n", "import { _ as _array_without_holes } from \"./_array_without_holes.js\";\nimport { _ as _iterable_to_array } from \"./_iterable_to_array.js\";\nimport { _ as _non_iterable_spread } from \"./_non_iterable_spread.js\";\nimport { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _to_consumable_array(arr) {\n    return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();\n}\nexport { _to_consumable_array as _ };\n", "function _type_of(obj) {\n    \"@swc/helpers - typeof\";\n\n    return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\nexport { _type_of as _ };\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n", "use strict;use warnings;require 5.004;my$version='13.30';$^W=1;my$exePath;BEGIN {$exePath=@ARGV && lc($ARGV[0])eq '-xpath' && shift()? $^X : $0;my$exeDir=($exePath =~ /(.*)[\\\\\\/]/)? $1 : '.';my$incDir=($0 =~ /(.*)[\\\\\\/]/)? \"$1/lib\" : './lib';if (-l $0){my$lnk=eval {readlink $0};if (defined$lnk){my$lnkDir=($lnk =~ /(.*)[\\\\\\/]/)? $1 : '.';$exeDir=(($lnk =~ m(^/))? '' : $exeDir .'/').$lnkDir;$incDir=\"$exeDir/lib\"}}$Image::ExifTool::exeDir=$exeDir;unshift@INC,$incDir;while (@ARGV and lc($ARGV[0])eq '-config'){shift;push@Image::ExifTool::configFiles,shift}}use Image::ExifTool qw{:Public};sub SigInt();sub SigCont();sub Cleanup();sub GetImageInfo($$);sub SetImageInfo($$$);sub DoHardLink($$$$$);sub CleanXML($);sub EncodeXML($);sub FormatXML($$$);sub EscapeJSON($;$);sub FormatJSON($$$;$);sub PrintCSV(;$);sub AddGroups($$$$);sub ConvertBinary($);sub IsEqual($$);sub Printable($);sub LengthUTF8($);sub Infile($;$);sub AddSetTagsFile($;$);sub Warning($$);sub DoSetFromFile($$$);sub CleanFilename($);sub HasWildcards($);sub SetWindowTitle($);sub ProcessFiles($;$);sub ScanDir($$;$);sub FindFileWindows($$);sub FileNotFound($);sub PreserveTime();sub AbsPath($);sub MyConvertFileName($$);sub SuggestedExtension($$$);sub LoadPrintFormat($;$);sub FilenameSPrintf($;$@);sub NextUnusedFilename($;$);sub CreateDirectory($);sub OpenOutputFile($;@);sub AcceptFile($);sub SlurpFile($$);sub FilterArgfileLine($);sub ReadStayOpen($);sub Progress($$);sub PrintTagList($@);sub PrintErrors($$$);$SIG{INT}='SigInt';$SIG{CONT}='SigCont';END {Cleanup()}my@commonArgs;my@condition;my@csvFiles;my@csvTags;my@delFiles;my@dynamicFiles;my@efile;my@exclude;my (@echo3,@echo4);my@files;my@moreArgs;my@newValues;my@requestTags;my@srcFmt;my@tags;my%altFile;my%appended;my%countLink;my%created;my%csvTags;my%database;my%filterExt;my%ignore;my$ignoreHidden;my%outComma;my%outTrailer;my%preserveTime;my%printFmt;my%seqFileDir;my%setTags;my%setTagsList;my%usedFileName;my%utf8FileName;my%warnedOnce;my%wext;my$allGroup;my$altEnc;my$argFormat;my$binaryOutput;my$binaryStdout;my$binSep;my$binTerm;my$comma;my$count;my$countBad;my$countBadCr;my$countBadWr;my$countCopyWr;my$countDir;my$countFailed;my$countGoodCr;my$countGoodWr;my$countNewDir;my$countSameWr;my$critical;my$csv;my$csvAdd;my$csvDelim;my$csvSaveCount;my$deleteOrig;my$diff;my$disableOutput;my$doSetFileName;my$doUnzip;my ($end,$endDir,%endDir);my$escapeC;my$escapeHTML;my$evalWarning;my$executeID;my$failCondition;my$fastCondition;my$fileHeader;my$fileTrailer;my$filtered;my$filterFlag;my$fixLen;my$forcePrint;my$geoOnly;my$helped;my$html;my$interrupted;my$isBinary;my$isWriting;my$joinLists;my$json;my$langOpt;my$listDir;my$listItem;my$listSep;my$mt;my$multiFile;my$noBinary;my$outFormat;my$outOpt;my$overwriteOrig;my$pause;my$plot;my$preserveTime;my$progress;my$progressCount;my$progressIncr;my$progressMax;my$progressNext;my$progStr;my$quiet;my$rafStdin;my$recurse;my$rtnVal;my$rtnValPrev;my$saveCount;my$scanWritable;my$sectHeader;my$sectTrailer;my$seqFileDir;my$seqFileNum;my$setCharset;my$showGroup;my$showTagID;my$stayOpenBuff='';my$stayOpenFile;my$structOpt;my$tabFormat;my$tagOut;my$textOut;my$textOut2;my$textOverwrite;my$tmpFile;my$tmpText;my$validFile;my$verbose;my$vout;my$windowTitle;my%wroteHEAD;my$xml;my$stayOpen=0;my$rtnValApp=0;my$curTitle='';my$isCRLF={MSWin32=>1,os2=>1,dos=>1 }->{$^O};my%jsonChar=('\"'=>'\"','\\\\'=>'\\\\',\"\\t\"=>'t',\"\\n\"=>'n',\"\\r\"=>'r');my%escC=(\"\\n\"=>'\\n',\"\\r\"=>'\\r',\"\\t\"=>'\\t','\\\\'=>'\\\\\\\\');my%unescC=(a=>\"\\a\",b=>\"\\b\",f=>\"\\f\",n=>\"\\n\",r=>\"\\r\",t=>\"\\t\",0=>\"\\0\",'\\\\'=>'\\\\');my%optArgs=('-tagsfromfile'=>1,'-addtagsfromfile'=>1,'-alltagsfromfile'=>1,'-@'=>1,'-api'=>1,'-c'=>1,'-coordformat'=>1,'-charset'=>0,'-config'=>1,'-csvdelim'=>1,'-d'=>1,'-dateformat'=>1,'-D'=>0,'-diff'=>1,'-echo'=>1,'-echo#'=>1,'-efile'=>1,'-efile#'=>1,'-efile!'=>1,'-efile#!'=>1,'-ext'=>1,'--ext'=>1,'-ext+'=>1,'--ext+'=>1,'-extension'=>1,'--extension'=>1,'-extension+'=>1,'--extension+'=>1,'-fileorder'=>1,'-fileorder#'=>1,'-file#'=>1,'-geotag'=>1,'-globaltimeshift'=>1,'-i'=>1,'-ignore'=>1,'-if'=>1,'-if#'=>1,'-lang'=>0,'-listitem'=>1,'-o'=>1,'-out'=>1,'-p'=>1,'-printformat'=>1,'-p-'=>1,'-printformat-'=>1,'-P'=>0,'-password'=>1,'-require'=>1,'-sep'=>1,'-separator'=>1,'-srcfile'=>1,'-stay_open'=>1,'-use'=>1,'-userparam'=>1,'-w'=>1,'-w!'=>1,'-w+'=>1,'-w+!'=>1,'-w!+'=>1,'-textout'=>1,'-textout!'=>1,'-textout+'=>1,'-textout+!'=>1,'-textout!+'=>1,'-tagout'=>1,'-tagout!'=>1,'-tagout+'=>1,'-tagout+!'=>1,'-tagout!+'=>1,'-wext'=>1,'-wm'=>1,'-writemode'=>1,'-x'=>1,'-exclude'=>1,'-X'=>0,);my@recommends=qw(Archive::Zip Compress::Zlib Digest::MD5 Digest::SHA IO::Compress::Bzip2 POSIX::strptime Time::Local Unicode::LineBreak Compress::Raw::Lzma IO::Compress::RawDeflate IO::Uncompress::RawInflate IO::Compress::Brotli IO::Uncompress::Brotli Win32::API Win32::FindFile Win32API::File);my%altRecommends=('POSIX::strptime'=>'Time::Piece',);my%unescapeChar=('t'=>\"\\t\",'n'=>\"\\n\",'r'=>\"\\r\");sub Image::ExifTool::EndDir() {return$endDir=1}sub Image::ExifTool::End() {return$end=1}sub Exit {if ($pause){if (eval {require Term::ReadKey}){print STDERR \"-- press any key --\";Term::ReadKey::ReadMode('cbreak');Term::ReadKey::ReadKey(0);Term::ReadKey::ReadMode(0);print STDERR \"\\b \\b\" x 20}else {print STDERR \"-- press RETURN --\\n\";<STDIN>}}exit shift}sub Warn {if ($quiet < 2 or $_[0]=~ /^Error/){my$oldWarn=$SIG{'__WARN__'};delete$SIG{'__WARN__'};warn(@_);$SIG{'__WARN__'}=$oldWarn if defined$oldWarn}}sub Error {Warn @_;$rtnVal=1}sub WarnOnce($) {Warn(@_)and $warnedOnce{$_[0]}=1 unless$warnedOnce{$_[0]}}sub SigInt() {$critical and $interrupted=1,return;Cleanup();exit 1}sub SigCont() {}sub Cleanup() {$mt->Unlink($tmpFile)if defined$tmpFile;$mt->Unlink($tmpText)if defined$tmpText;undef$tmpFile;undef$tmpText;PreserveTime()if%preserveTime;SetWindowTitle('')}if (grep /^-common_args$/i,@ARGV){my (@newArgs,$common,$end);for (@ARGV){if (/^-common_args$/i and not $end){$common=1}elsif ($common){push@commonArgs,$_}else {$end=1 if $_ eq '--';push@newArgs,$_}}@ARGV=@newArgs if$common}Command: for (;;){if (@echo3){my$str=join(\"\\n\",@echo3).\"\\n\";$str =~ s/\\$\\{status\\}/$rtnVal/ig;print STDOUT$str}if (@echo4){my$str=join(\"\\n\",@echo4).\"\\n\";$str =~ s/\\$\\{status\\}/$rtnVal/ig;print STDERR$str}$rafStdin->Close()if$rafStdin;undef$rafStdin;$rtnValPrev=$rtnVal;$rtnValApp=$rtnVal if$rtnVal;last unless@ARGV or not defined$rtnVal or $stayOpen >= 2 or @commonArgs;if ($binaryStdout){binmode(STDOUT,':crlf')if $] >= 5.006 and $isCRLF;$binaryStdout=0}if ($stayOpen >= 2){if ($quiet and not defined$executeID){eval {require IO::Handle}and STDERR->flush(),STDOUT->flush()}else {eval {require IO::Handle}and STDERR->flush();my$id=defined$executeID ? $executeID : '';my$save=$|;$|=1;print \"{ready$id}\\n\";$|=$save}}undef@condition;undef@csvFiles;undef@csvTags;undef@delFiles;undef@dynamicFiles;undef@echo3;undef@echo4;undef@efile;undef@exclude;undef@files;undef@newValues;undef@srcFmt;undef@tags;undef%appended;undef%countLink;undef%created;undef%csvTags;undef%database;undef%endDir;undef%filterExt;undef%ignore;undef%outComma;undef%outTrailer;undef%preserveTime;undef%printFmt;undef%seqFileDir;undef%setTags;undef%setTagsList;undef%usedFileName;undef%utf8FileName;undef%warnedOnce;undef%wext;undef$allGroup;undef$altEnc;undef$argFormat;undef$binaryOutput;undef$binSep;undef$binTerm;undef$comma;undef$csv;undef$csvAdd;undef$deleteOrig;undef$diff;undef$disableOutput;undef$doSetFileName;undef$doUnzip;undef$end;undef$endDir;undef$escapeHTML;undef$escapeC;undef$evalWarning;undef$executeID;undef$failCondition;undef$fastCondition;undef$fileHeader;undef$filtered;undef$fixLen;undef$forcePrint;undef$geoOnly;undef$ignoreHidden;undef$joinLists;undef$langOpt;undef$listItem;undef$multiFile;undef$noBinary;undef$outOpt;undef$preserveTime;undef$progress;undef$progressCount;undef$progressIncr;undef$progressMax;undef$progressNext;undef$recurse;undef$scanWritable;undef$sectHeader;undef$setCharset;undef$showGroup;undef$showTagID;undef$structOpt;undef$tagOut;undef$textOut;undef$textOverwrite;undef$tmpFile;undef$tmpText;undef$validFile;undef$verbose;undef$windowTitle;$count=0;$countBad=0;$countBadCr=0;$countBadWr=0;$countCopyWr=0;$countDir=0;$countFailed=0;$countGoodCr=0;$countGoodWr=0;$countNewDir=0;$countSameWr=0;$csvDelim=',';$csvSaveCount=0;$fileTrailer='';$filterFlag=0;$html=0;$isWriting=0;$json=0;$listSep=', ';$outFormat=0;$overwriteOrig=0;$progStr='';$quiet=0;$rtnVal=0;$saveCount=0;$sectTrailer='';$seqFileDir=0;$seqFileNum=0;$tabFormat=0;$vout=\\*STDOUT;$xml=0;my@fileOrder;my$fileOrderFast;my$addGeotime;my$doGlob;my$endOfOpts;my$escapeXML;my$setTagsFile;my$sortOpt;my$srcStdin;my$useMWG;my ($argsLeft,@nextPass,$badCmd);my$pass=0;if ($^O eq 'MSWin32' and eval {require File::Glob}){import File::Glob qw(:globally :nocase);$doGlob=1}$mt=Image::ExifTool->new;$mt->Options(Duplicates=>0)unless%Image::ExifTool::UserDefined::Options and defined$Image::ExifTool::UserDefined::Options{Duplicates};$joinLists=1 if defined$mt->Options('List')and not $mt->Options('List');if (not $preserveTime and $^O eq 'MSWin32'){$preserveTime=2 if eval {require Win32::API}and eval {require Win32API::File}}if (@Image::ExifTool::UserDefined::Arguments){unshift@ARGV,@Image::ExifTool::UserDefined::Arguments}if ($version ne $Image::ExifTool::VERSION){Warn \"Application version $version does not match Image::ExifTool library version $Image::ExifTool::VERSION\\n\"}for (;;){if (not @ARGV or ($ARGV[0]=~ /^(-|\\xe2\\x88\\x92)execute(\\d+)?$/i and not $endOfOpts)){if (@ARGV){$executeID=$2;$helped=1;$badCmd and shift,$rtnVal=1,next Command}elsif ($stayOpen >= 2){ReadStayOpen(\\@ARGV);next}elsif ($badCmd){undef@commonArgs;$rtnVal=1;next Command}if ($pass==0){if (@commonArgs and not defined$argsLeft){$argsLeft=scalar(@ARGV)+ scalar(@moreArgs);unshift@ARGV,@commonArgs;undef@commonArgs unless$argsLeft;next}if (defined$argsLeft and $argsLeft < scalar(@ARGV)+ scalar(@moreArgs)){Warn \"Ignoring -common_args from $ARGV[0] onwards to avoid infinite recursion\\n\";while ($argsLeft < scalar(@ARGV)+ scalar(@moreArgs)){@ARGV and shift(@ARGV),next;shift@moreArgs}}$useMWG=1 if not $useMWG and grep /^([--_0-9A-Z]+:)*1?mwg:/i,@tags,@requestTags;if ($useMWG){require Image::ExifTool::MWG;Image::ExifTool::MWG::Load()}if (defined$forcePrint){unless (defined$mt->Options('MissingTagValue')){$mt->Options(MissingTagValue=>'-')}$forcePrint=$mt->Options('MissingTagValue')}}if (@nextPass){unshift@ARGV,@nextPass;undef@nextPass;undef$endOfOpts;++$pass;next}@ARGV and shift;last}$_=shift;next if$badCmd;if (not $endOfOpts and s/^(-|\\xe2\\x88\\x92)//){s/^\\xe2\\x88\\x92/-/;if ($_ eq '-'){$pass or push@nextPass,'--';$endOfOpts=1;next}my$a=lc $_;if (/^list([wfrdx]|wf|g(\\d*)|geo)?$/i){$pass or push@nextPass,\"-$_\";my$type=lc($1 || '');if (not $type or $type eq 'w' or $type eq 'x'){my$group;if ($ARGV[0]and $ARGV[0]=~ /^(-|\\xe2\\x88\\x92)(.+):(all|\\*)$/i){if ($pass==0){$useMWG=1 if lc($2)eq 'mwg';push@nextPass,shift;next}$group=$2;shift;$group =~ /IFD/i and Warn(\"Can't list tags for specific IFD\\n\"),$helped=1,next;$group =~ /^(all|\\*)$/ and undef$group}else {$pass or next}$helped=1;if ($type eq 'x'){require Image::ExifTool::TagInfoXML;my%opts;$opts{Flags}=1 if defined$forcePrint;$opts{NoDesc}=1 if$outFormat > 0;$opts{Lang}=$langOpt;Image::ExifTool::TagInfoXML::Write(undef,$group,%opts);next}my$wr=($type eq 'w');my$msg=($wr ? 'Writable' : 'Available').($group ? \" $group\" : '').' tags';PrintTagList($msg,$wr ? GetWritableTags($group): GetAllTags($group));next if$group or $wr;my@tagList=GetShortcuts();PrintTagList('Command-line shortcuts',@tagList)if@tagList;next}$pass or next;$helped=1;if ($type eq 'wf'){my@wf;CanWrite($_)and push@wf,$_ foreach GetFileType();PrintTagList('Writable file extensions',@wf)}elsif ($type eq 'f'){PrintTagList('Supported file extensions',GetFileType())}elsif ($type eq 'r'){PrintTagList('Recognized file extensions',GetFileType(undef,0))}elsif ($type eq 'd'){PrintTagList('Deletable groups',GetDeleteGroups())}elsif ($type eq 'geo'){require Image::ExifTool::Geolocation;my ($i,$entry);print \"Geolocation database:\\n\" unless$quiet;my$isAlt=$mt->Options('GeolocAltNames')? ',AltNames' : '';$isAlt='' if$isAlt and not Image::ExifTool::Geolocation::ReadAltNames();print \"City,Region,Subregion,CountryCode,Country,TimeZone,FeatureCode,Population,Latitude,Longitude$isAlt\\n\";Image::ExifTool::Geolocation::SortDatabase('City')if$sortOpt;my$minPop=$mt->Options('GeolocMinPop');my$feature=$mt->Options('GeolocFeature')|| '';my$neg=$feature =~ s/^-//;my%fcodes=map {lc($_)=>1}split /\\s*,\\s*/,$feature;my@isUTF8=(0,1,2,4);push@isUTF8,10 if$isAlt;for ($i=0;;++$i){my@entry=Image::ExifTool::Geolocation::GetEntry($i,$langOpt,1)or last;$#entry=9;next if$minPop and $entry[7]< $minPop;next if%fcodes and $neg ? $fcodes{lc$entry[6]}: not $fcodes{lc$entry[6]};push@entry,Image::ExifTool::Geolocation::GetAltNames($i,1)if$isAlt;$_=defined $_ ? $mt->Decode($_,'UTF8'): '' foreach@entry[@isUTF8];pop@entry if$isAlt and not $entry[10];print join(',',@entry),\"\\n\"}}else {my$family=$2 || 0;PrintTagList(\"Groups in family $family\",$mt->GetAllGroups($family))}next}if ($a eq 'ver'){$pass or push(@nextPass,'-ver'),next;my$libVer=$Image::ExifTool::VERSION;my$str=$libVer eq $version ? '' : \" [Warning: Library version is $libVer]\";if ($verbose){print \"ExifTool version $version$str$Image::ExifTool::RELEASE\\n\";printf \"Perl version %s%s\\n\",$],(defined ${^UNICODE} ? \" (-C${^UNICODE})\" : '');print \"Platform: $^O\\n\";if ($verbose > 8){print \"Current Dir: \" .Cwd::getcwd().\"\\n\" if (eval {require Cwd});print \"Script Name: $0\\n\";print \"Exe Name:    $^X\\n\";print \"Exe Dir:     $Image::ExifTool::exeDir\\n\";print \"Exe Path:    $exePath\\n\"}print \"Optional libraries:\\n\";for (@recommends){next if /^Win32/ and $^O ne 'MSWin32';my$ver=eval \"require $_ and \\$${_}::VERSION\";my$alt=$altRecommends{$_};$ver=eval \"require $alt and \\$${alt}::VERSION\" and $_=$alt if not $ver and $alt;printf \"  %-28s %s\\n\",$_,$ver || '(not installed)'}if ($verbose > 1){print \"Include directories:\\n\";ref $_ or print \"  $_\\n\" foreach@INC}}else {print \"$version$str$Image::ExifTool::RELEASE\\n\"}$helped=1;next}if (/^(all|add)?tagsfromfile(=.*)?$/i){$setTagsFile=$2 ? substr($2,1): (@ARGV ? shift : '');if ($setTagsFile eq ''){Error(\"File must be specified for -tagsFromFile option\\n\");$badCmd=1;next}AddSetTagsFile($setTagsFile,{Replace=>($1 and lc($1)eq 'add')? 0 : 1 });next}if ($a eq '@'){my$argFile=shift or Error(\"Expecting filename for -\\@ option\\n\"),$badCmd=1,next;if ($stayOpen==1){@moreArgs=@ARGV;undef@ARGV}elsif ($stayOpen==3){if ($stayOpenFile and $stayOpenFile ne '-' and $argFile eq $stayOpenFile){$stayOpen=2;Warn \"Ignoring request to switch to the same -stay_open ARGFILE ($argFile)\\n\";next}close STAYOPEN;$stayOpen=1}my$fp=($stayOpen==1 ? \\*STAYOPEN : \\*ARGFILE);unless ($mt->Open($fp,$argFile)){unless ($argFile !~ /^\\// and $mt->Open($fp,\"$Image::ExifTool::exeDir/$argFile\")){Error \"Error opening arg file $argFile\\n\";$badCmd=1;next}}if ($stayOpen==1){$stayOpenFile=$argFile;$stayOpenBuff='';$stayOpen=2;$helped=1;ReadStayOpen(\\@ARGV);next}my (@newArgs,$didBOM);for (<ARGFILE>){unless ($didBOM){s/^\\xef\\xbb\\xbf//;$didBOM=1}$_=FilterArgfileLine($_);push@newArgs,$_ if defined $_}close ARGFILE;unshift@ARGV,@newArgs;next}/^(-?)(a|duplicates)$/i and $mt->Options(Duplicates=>($1 ? 0 : 1)),next;if ($a eq 'api'){my$opt=shift;if (defined$opt and length$opt){my$val=($opt =~ s/=(.*)//s)? $1 : 1;$val=undef unless$opt =~ s/\\^$// or length$val;$mt->Options($opt=>$val)}else {print \"Available API Options:\\n\";my$availableOptions=Image::ExifTool::AvailableOptions();$$_[3]or printf(\"  %-17s - %s\\n\",$$_[0],$$_[2])foreach @$availableOptions;$helped=1}next}/^arg(s|format)$/i and $argFormat=1,next;if (/^(-?)b(inary)?$/i){($binaryOutput,$noBinary)=$1 ? (undef,1): (1,undef);$mt->Options(Binary=>$binaryOutput,NoPDFList=>$binaryOutput);next}if (/^c(oordFormat)?$/i){my$fmt=shift;$fmt or Error(\"Expecting coordinate format for -c option\\n\"),$badCmd=1,next;$mt->Options('CoordFormat',$fmt);next}if ($a eq 'charset'){my$charset=(@ARGV and $ARGV[0]!~ /^(-|\\xe2\\x88\\x92)/)? shift : undef;if (not $charset){$pass or push(@nextPass,'-charset'),next;my%charsets;$charsets{$_}=1 foreach values%Image::ExifTool::charsetName;PrintTagList('Available character sets',sort keys%charsets);$helped=1}elsif ($charset !~ s/^(\\w+)=// or lc($1)eq 'exiftool'){{local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};undef$evalWarning;$mt->Options(Charset=>$charset)}if ($evalWarning){Warn$evalWarning}else {$setCharset=$mt->Options('Charset')}}else {my$type={id3=>'ID3',iptc=>'IPTC',exif=>'EXIF',filename=>'FileName',photoshop=>'Photoshop',quicktime=>'QuickTime',riff=>'RIFF' }->{lc $1};$type or Warn(\"Unknown type for -charset option: $1\\n\"),next;$mt->Options(\"Charset$type\"=>$charset)}next}/^config$/i and Warn(\"Ignored -config option (not first on command line)\\n\"),shift,next;if (/^csv(\\+?=.*)?$/i){my$csvFile=$1;unless ($pass){push@nextPass,\"-$_\";if ($csvFile){push@newValues,{SaveCount=>++$saveCount };$csvSaveCount=$saveCount}next}if ($csvFile){$csvFile =~ s/^(\\+?=)//;$csvAdd=2 if $1 eq '+=';$vout=\\*STDERR if$srcStdin;$verbose and print$vout \"Reading CSV file $csvFile\\n\";my$msg;if ($mt->Open(\\*CSVFILE,$csvFile)){binmode CSVFILE;require Image::ExifTool::Import;$msg=Image::ExifTool::Import::ReadCSV(\\*CSVFILE,\\%database,$forcePrint,$csvDelim);close(CSVFILE)}else {$msg=\"Error opening CSV file '${csvFile}'\"}$msg and Warn(\"$msg\\n\");$isWriting=1}$csv='CSV';next}if (/^csvdelim$/i){$csvDelim=shift;defined$csvDelim or Error(\"Expecting argument for -csvDelim option\\n\"),$badCmd=1,next;$csvDelim =~ /\"/ and Error(\"CSV delimiter can not contain a double quote\\n\"),$badCmd=1,next;my%unescape=('t'=>\"\\t\",'n'=>\"\\n\",'r'=>\"\\r\",'\\\\'=>'\\\\');$csvDelim =~ s/\\\\(.)/$unescape{$1}||\"\\\\$1\"/sge;$mt->Options(CSVDelim=>$csvDelim);next}if (/^d$/ or $a eq 'dateformat'){my$fmt=shift;$fmt or Error(\"Expecting date format for -d option\\n\"),$badCmd=1,next;$mt->Options('DateFormat',$fmt);next}(/^D$/ or $a eq 'decimal')and $showTagID='D',next;if (/^diff$/i){$diff=shift;defined$diff or Error(\"Expecting file name for -$_ option\\n\"),$badCmd=1;next}/^delete_original(!?)$/i and $deleteOrig=($1 ? 2 : 1),next;/^list_dir$/i and $listDir=1,next;(/^e$/ or $a eq '-composite')and $mt->Options(Composite=>0),next;(/^-e$/ or $a eq 'composite')and $mt->Options(Composite=>1),next;(/^E$/ or $a eq 'escapehtml')and require Image::ExifTool::HTML and $escapeHTML=1,next;($a eq 'ec' or $a eq 'escapec')and $escapeC=1,next;($a eq 'ex' or $a eq 'escapexml')and $escapeXML=1,next;if (/^echo(\\d)?$/i){my$n=$1 || 1;my$arg=shift;next unless defined$arg;$n > 4 and Warn(\"Invalid -echo number\\n\"),next;if ($n > 2){$n==3 ? push(@echo3,$arg): push(@echo4,$arg)}else {print {$n==2 ? \\*STDERR : \\*STDOUT}$arg,\"\\n\"}$helped=1;next}if (/^(ee|extractembedded)(\\d*)$/i){$mt->Options(ExtractEmbedded=>$2 || 1);$mt->Options(Duplicates=>1);next}if (/^efile(\\d+)?(!)?$/i){my$arg=shift;defined$arg or Error(\"Expecting file name for -$_ option\\n\"),$badCmd=1,next;$efile[0]=$arg if not $1 or $1 & 0x01;$efile[1]=$arg if $1 and $1 & 0x02;$efile[2]=$arg if $1 and $1 & 0x04;$efile[3]=$arg if $1 and $1 & 0x08;$efile[4]=$arg if $1 and $1 & 0x016;unlink$arg if $2;next}if (/^-?ext(ension)?(\\+)?$/i){my$ext=shift;defined$ext or Error(\"Expecting extension for -ext option\\n\"),$badCmd=1,next;my$flag=/^-/ ? 0 : ($2 ? 2 : 1);$filterFlag |= (0x01 << $flag);$ext =~ s/^\\.//;$filterExt{uc($ext)}=$flag ? 1 : 0;next}if (/^f$/ or $a eq 'forceprint'){$forcePrint=1;next}if (/^F([-+]?\\d*)$/ or /^fixbase([-+]?\\d*)$/i){$mt->Options(FixBase=>$1);next}if (/^fast(\\d*)$/i){$mt->Options(FastScan=>(length $1 ? $1 : 1));next}if (/^(file\\d+)$/i){$altFile{lc $1}=shift or Error(\"Expecting file name for -file option\\n\"),$badCmd=1,next;next}if (/^fileorder(\\d*)$/i){push@fileOrder,shift if@ARGV;my$num=$1 || 0;$fileOrderFast=$num if not defined$fileOrderFast or $fileOrderFast > $num;next}$a eq 'globaltimeshift' and $mt->Options(GlobalTimeShift=>shift),next;if (/^(g)(roupHeadings|roupNames)?([\\d:]*)$/i){$showGroup=$3 || 0;$allGroup=($2 ? lc($2)eq 'roupnames' : $1 eq 'G');$mt->Options(SavePath=>1)if$showGroup =~ /\\b5\\b/;$mt->Options(SaveFormat=>1)if$showGroup =~ /\\b6\\b/;next}if ($a eq 'geotag'){my$trkfile=shift;unless ($pass){push@nextPass,'-geotag',$trkfile;next}$trkfile or Error(\"Expecting file name for -geotag option\\n\"),$badCmd=1,next;if (HasWildcards($trkfile)){my@trks;if ($^O eq 'MSWin32' and eval {require Win32::FindFile}){@trks=FindFileWindows($mt,$trkfile)}elsif (eval {require File::Glob}){@trks=File::Glob::bsd_glob($trkfile)}else {@trks=glob($trkfile)}@trks or Error(\"No matching file found for -geotag option\\n\"),$badCmd=1,next;push@newValues,'geotag='.shift(@trks)while@trks > 1;$trkfile=pop(@trks)}$_=\"geotag=$trkfile\"}if (/^h$/ or $a eq 'htmlformat'){require Image::ExifTool::HTML;$html=$escapeHTML=1;$json=$xml=0;next}(/^H$/ or $a eq 'hex')and $showTagID='H',next;if (/^htmldump([-+]?\\d+)?$/i){$verbose=($verbose || 0)+ 1;$html=2;$mt->Options(HtmlDumpBase=>$1)if defined $1;next}if (/^i(gnore)?$/i){my$dir=shift;defined$dir or Error(\"Expecting directory name for -i option\\n\"),$badCmd=1,next;$ignore{$dir}=1;$dir eq 'HIDDEN' and $ignoreHidden=1;next}if (/^if(\\d*)$/i){my$cond=shift;my$fast=length($1)? $1 : undef;defined$cond or Error(\"Expecting expression for -if option\\n\"),$badCmd=1,next;if (not @condition or not defined$fast or (defined$fastCondition and $fastCondition > $fast)){$fastCondition=$fast}$cond =~ /^\\s*(not\\s*)\\$ok\\s*$/i and ($1 xor $rtnValPrev)and $failCondition=1;push@requestTags,$cond =~ /\\$\\{?((?:[-_0-9A-Z]+:)*[-_0-9A-Z?*]+)/ig;push@condition,$cond;next}if (/^j(son)?(\\+?=.*)?$/i){if ($2){unless ($pass){push@nextPass,\"-$_\";push@newValues,{SaveCount=>++$saveCount };$csvSaveCount=$saveCount;next}my$jsonFile=$2;$jsonFile =~ s/^(\\+?=)//;$csvAdd=2 if $1 eq '+=';$vout=\\*STDERR if$srcStdin;$verbose and print$vout \"Reading JSON file $jsonFile\\n\";my$chset=$mt->Options('Charset');my$msg;if ($mt->Open(\\*JSONFILE,$jsonFile)){binmode JSONFILE;require Image::ExifTool::Import;$msg=Image::ExifTool::Import::ReadJSON(\\*JSONFILE,\\%database,$forcePrint,$chset);close(JSONFILE)}else {$msg=\"Error opening JSON file '${jsonFile}'\"}$msg and Warn(\"$msg\\n\");$isWriting=1;$csv='JSON'}else {$json=1;$html=$xml=0;$mt->Options(Duplicates=>1);require Image::ExifTool::XMP}next}/^(k|pause)$/i and $pause=1,next;(/^l$/ or $a eq 'long')and --$outFormat,next;(/^L$/ or $a eq 'latin')and $mt->Options(Charset=>'Latin'),next;if ($a eq 'lang'){$langOpt=(@ARGV and $ARGV[0]!~ /^(-|\\xe2\\x88\\x92)/)? shift : undef;if ($langOpt){$langOpt =~ tr/-A-Z/_a-z/;$mt->Options(Lang=>$langOpt);next if$langOpt eq $mt->Options('Lang')}else {$pass or push(@nextPass,'-lang'),next}my$langs=$quiet ? '' : \"Available languages:\\n\";$langs .= \"  $_ - $Image::ExifTool::langName{$_}\\n\" foreach@Image::ExifTool::langs;$langs =~ tr/_/-/;$langs=Image::ExifTool::HTML::EscapeHTML($langs)if$escapeHTML;$langs=$mt->Decode($langs,'UTF8');$langOpt and Error(\"Invalid or unsupported language '${langOpt}'.\\n$langs\"),$badCmd=1,next;print$langs;$helped=1;next}if ($a eq 'listitem'){my$li=shift;defined$li and Image::ExifTool::IsInt($li)or Warn(\"Expecting integer for -listItem option\\n\"),next;$mt->Options(ListItem=>$li);$listItem=$li;next}/^(m|ignoreminorerrors)$/i and $mt->Options(IgnoreMinorErrors=>1),next;/^(n|-printconv)$/i and $mt->Options(PrintConv=>0),next;/^(-n|printconv)$/i and $mt->Options(PrintConv=>1),next;$a eq 'nop' and $helped=1,next;if (/^o(ut)?$/i){$outOpt=shift;defined$outOpt or Error(\"Expected output file or directory name for -o option\\n\"),$badCmd=1,next;CleanFilename($outOpt);$vout=\\*STDERR if$vout =~ /^-(\\.\\w+)?$/;next}/^overwrite_original$/i and $overwriteOrig=1,next;/^overwrite_original_in_place$/i and $overwriteOrig=2,next;/^plot$/i and require Image::ExifTool::Plot and $plot=Image::ExifTool::Plot->new,next;if (/^p(-?)$/ or /^printformat(-?)$/i){my$fmt=shift;if ($pass){LoadPrintFormat($fmt,$1 || $binaryOutput);if (not $useMWG and grep /^([-_0-9A-Z]+:)*1?mwg:/i,@requestTags){$useMWG=1;require Image::ExifTool::MWG;Image::ExifTool::MWG::Load()}}else {push@nextPass,\"-$_\",$fmt}next}(/^P$/ or $a eq 'preserve')and $preserveTime=1,next;/^password$/i and $mt->Options(Password=>shift),next;if (/^progress(\\d*)(:.*)?$/i){$progressIncr=$1 || 1;$progressNext=0;if ($2){$windowTitle=substr $2,1;$windowTitle='ExifTool %p%%' unless length$windowTitle;$windowTitle =~ /%\\d*[bpr]/ and $progress=0 unless defined$progress}else {$progress=1;$verbose=0 unless defined$verbose}$progressCount=0;next}/^q(uiet)?$/i and ++$quiet,next;/^r(ecurse)?(\\.?)$/i and $recurse=($2 ? 2 : 1),next;if ($a eq 'require'){my$ver=shift;unless (defined$ver and Image::ExifTool::IsFloat($ver)){Error(\"Expecting version number for -require option\\n\");$badCmd=1;next}unless ($Image::ExifTool::VERSION >= $ver){Error(\"Requires ExifTool version $ver or later\\n\");$badCmd=1}next}/^restore_original$/i and $deleteOrig=0,next;(/^S$/ or $a eq 'veryshort')and $outFormat+=2,next;/^s(hort)?(\\d*)$/i and $outFormat=$2 eq '' ? $outFormat + 1 : $2,next;/^scanforxmp$/i and $mt->Options(ScanForXMP=>1),next;if (/^sep(arator)?$/i){my$sep=$listSep=shift;defined$listSep or Error(\"Expecting list item separator for -sep option\\n\"),$badCmd=1,next;$sep =~ s/\\\\(.)/$unescapeChar{$1}||$1/sge;(defined$binSep ? $binTerm : $binSep)=$sep;$mt->Options(ListSep=>$listSep);$joinLists=1;my$listSplit=quotemeta$listSep;$listSplit =~ s/(\\\\ )+/\\\\s\\*/g;$listSplit='\\\\s+' if$listSplit eq '\\\\s*';$mt->Options(ListSplit=>$listSplit);next}/^(-)?sort$/i and $sortOpt=$1 ? 0 : 1,next;if ($a eq 'srcfile'){@ARGV or Warn(\"Expecting FMT for -srcfile option\\n\"),next;push@srcFmt,shift;next}if ($a eq 'stay_open'){my$arg=shift;defined$arg or Warn(\"Expecting argument for -stay_open option\\n\"),next;if ($arg =~ /^(1|true)$/i){if (not $stayOpen){$stayOpen=1}elsif ($stayOpen==2){$stayOpen=3}else {Warn \"-stay_open already active\\n\"}}elsif ($arg =~ /^(0|false)$/i){if ($stayOpen >= 2){close STAYOPEN;push@ARGV,@moreArgs;undef@moreArgs}elsif (not $stayOpen){Warn(\"-stay_open wasn't active\\n\")}$stayOpen=0}else {Warn \"Invalid argument for -stay_open\\n\"}next}if (/^(-)?struct$/i){$mt->Options(Struct=>$1 ? 0 : 1);next}/^t(ab)?$/ and $tabFormat=1,next;if (/^T$/ or $a eq 'table'){$tabFormat=$forcePrint=1;$outFormat+=2;++$quiet;next}if (/^(u)(nknown(2)?)?$/i){my$inc=($3 or (not $2 and $1 eq 'U'))? 2 : 1;$mt->Options(Unknown=>$mt->Options('Unknown')+ $inc);next}if ($a eq 'use'){my$module=shift;$module or Error(\"Expecting module name for -use option\\n\"),$badCmd=1,next;lc$module eq 'mwg' and $useMWG=1,next;$module =~ /[^\\w:]/ and Error(\"Invalid module name: $module\\n\"),$badCmd=1,next;local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};unless (eval \"require Image::ExifTool::$module\" or eval \"require $module\" or eval \"require '${module}'\"){Error(\"Error using module $module\\n\");$badCmd=1}next}if ($a eq 'userparam'){my$opt=shift;defined$opt or Error(\"Expected parameter for -userParam option\\n\"),$badCmd=1,next;$opt =~ /=/ or $opt .= '=1';$mt->Options(UserParam=>$opt);next}if (/^v(erbose)?(\\d*)$/i){$verbose=($2 eq '')? ($verbose || 0)+ 1 : $2;next}if (/^(w|textout|tagout)([!+]*)$/i){$textOut=shift || Warn(\"Expecting argument for -$_ option\\n\");my ($t1,$t2)=($1,$2);$textOverwrite=0;$textOverwrite += 1 if$t2 =~ /!/;$textOverwrite += 2 if$t2 =~ /\\+/;if ($t1 ne 'W' and lc($t1)ne 'tagout'){undef$tagOut}elsif ($textOverwrite >= 2 and $textOut !~ /%[-+]?\\d*[.:]?\\d*[lu]?[tgso]/){$tagOut=0}else {$tagOut=1}next}if (/^(-?)(wext|tagoutext)$/i){my$ext=shift;defined$ext or Error(\"Expecting extension for -wext option\\n\"),$badCmd=1,next;my$flag=1;$1 and $wext{'*'}=1,$flag=-1;$ext =~ s/^\\.//;$wext{lc$ext}=$flag;next}if ($a eq 'wm' or $a eq 'writemode'){my$wm=shift;defined$wm or Error(\"Expecting argument for -$_ option\\n\"),$badCmd=1,next;$wm =~ /^[wcg]*$/i or Error(\"Invalid argument for -$_ option\\n\"),$badCmd=1,next;$mt->Options(WriteMode=>$wm);next}if (/^x$/ or $a eq 'exclude'){my$tag=shift;defined$tag or Error(\"Expecting tag name for -x option\\n\"),$badCmd=1,next;$tag =~ s/\\ball\\b/\\*/ig;if ($setTagsFile){push @{$setTags{$setTagsFile}},\"-$tag\"}else {push@exclude,$tag}next}(/^X$/ or $a eq 'xmlformat')and $xml=1,$html=$json=0,$mt->Options(Duplicates=>1),next;if (/^php$/i){$json=2;$html=$xml=0;$mt->Options(Duplicates=>1);next}if (/^z(ip)?$/i){$doUnzip=1;$mt->Options(Compress=>1,XMPShorthand=>1);$mt->Options(Compact=>1)unless$mt->Options('Compact');next}$_ eq '' and push(@files,'-'),$srcStdin=1,next;length $_ eq 1 and $_ ne '*' and Error(\"Unknown option -$_\\n\"),$badCmd=1,next;if (/^[^<]+(<?)=(.*)/s){my$val=$2;if ($1 and length($val)and ($val eq '@' or not defined FilenameSPrintf($val))){push@newValues,{SaveCount=>++$saveCount }}push@newValues,$_;if (/^([-_0-9A-Z]+:)*1?mwg:/i){$useMWG=1}elsif (/^([-_0-9A-Z]+:)*(filename|directory|testname)\\b/i){$doSetFileName=1}elsif (/^([-_0-9A-Z]+:)*(geotag|geotime|geosync|geolocate)\\b/i){if (lc $2 eq 'geotime'){$addGeotime=''}else {unshift@newValues,pop@newValues;if (lc $2 eq 'geotag' and (not defined$addGeotime or $addGeotime)and length$val){$addGeotime=($1 || '').q[Geotime<${DateTimeOriginal#;$_=$self->GetValue('SubSecDateTimeOriginal','ValueConv') || $_}]}}}}else {AddSetTagsFile($setTagsFile='@')if not $setTagsFile and /(<|>)/;if ($setTagsFile){push @{$setTags{$setTagsFile}},$_;if ($1 eq '>'){$useMWG=1 if /^(.*>\\s*)?([-_0-9A-Z]+:)*1?mwg:/si;if (/\\b(filename|directory|testname)#?$/i){$doSetFileName=1}elsif (/\\bgeotime#?$/i){$addGeotime=''}}else {$useMWG=1 if /^([^<]+<\\s*(.*\\$\\{?)?)?([-_0-9A-Z]+:)*1?mwg:/si;if (/^([-_0-9A-Z]+:)*(filename|directory|testname)\\b/i){$doSetFileName=1}elsif (/^([-_0-9A-Z]+:)*geotime\\b/i){$addGeotime=''}}}else {my$lst=s/^-// ? \\@exclude : \\@tags;Warn(qq(Invalid TAG name: \"$_\"\\n))unless /^([-_0-9A-Z*]+:)*([-_0-9A-Z*?]+)#?$/i;push @$lst,$_}}}else {unless ($pass){push@nextPass,$_;next}if ($doGlob and HasWildcards($_)){if ($^O eq 'MSWin32' and eval {require Win32::FindFile}){push@files,FindFileWindows($mt,$_)}else {push@files,File::Glob::bsd_glob($_)}$doGlob=2}else {push@files,$_;$srcStdin=1 if $_ eq '-'}}}$mt->Options(UserParam=>'OK=' .(not $rtnValPrev));$vout=\\*STDERR if$srcStdin and ($isWriting or @newValues);$mt->Options(TextOut=>$vout)if$vout eq \\*STDERR;if ($useMWG and not defined$mt->Options('CharsetEXIF')){$mt->Options(CharsetEXIF=>'UTF8')}if (not @files and not $outOpt and not @newValues){my$loc=$mt->Options('Geolocation');$loc and $loc ne '1' and push(@files,qq(\\@JSON:{})),$geoOnly=1}unless ((@tags and not $outOpt)or @files or @newValues or $geoOnly){if ($doGlob and $doGlob==2){Error \"No matching files\\n\";next}$outOpt and Error(\"Nothing to write\\n\"),next;unless ($helped){local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};my$dummy=\\*SAVEERR;unless ($^O eq 'os2'){open SAVEERR,\">&STDERR\";open STDERR,'>/dev/null'}if (system('perldoc',$0)){print \"Syntax:  exiftool [OPTIONS] FILE\\n\\n\";print \"Consult the exiftool documentation for a full list of options.\\n\"}unless ($^O eq 'os2'){close STDERR;open STDERR,'>&SAVEERR'}}next}if (defined$deleteOrig and (@newValues or @tags)){if (not @newValues){my$verb=$deleteOrig ? 'deleting' : 'restoring from';Error \"Can't specify tags when $verb originals\\n\"}elsif ($deleteOrig){Error \"Can't use -delete_original when writing.\\n\";Error \"Maybe you meant -overwrite_original ?\\n\"}else {Error \"It makes no sense to use -restore_original when writing\\n\"}next}if ($overwriteOrig > 1 and $outOpt){Error \"Can't overwrite in place when -o option is used\\n\";next}if (($tagOut or defined$diff)and ($csv or $json or %printFmt or $tabFormat or $xml or $plot or ($verbose and $html))){my$opt=$tagOut ? '-W' : '-diff';Error \"Sorry, $opt may not be combined with -csv, -htmlDump, -j, -p, -t or -X\\n\";next}if ($csv and $csv eq 'CSV' and not $isWriting){$json=0;if ($textOut){$textOut2=$textOut;undef$textOut}if ($binaryOutput){$binaryOutput=0;$setCharset='default' unless defined$setCharset}if (%printFmt){Warn \"The -csv option has no effect when -p is used\\n\";undef$csv}require Image::ExifTool::XMP if$setCharset}if ($plot and $textOut){$textOut2=$textOut;undef$textOut}if ($textOut2){if ($textOverwrite > 1){Error \"Can not append to multi-file output format\\n\";undef$textOut2;next}if (not $textOverwrite and $mt->Exists($textOut2,1)){Error \"Output file $textOut2 already exists\\n\";undef$textOut2;next}CreateDirectory($textOut2);if ($mt->Open(\\*OUTFILE,$textOut2,'>')){close(\\*OUTFILE);unlink($textOut2)}else {Error(\"Error creating $textOut2\\n\");undef$textOut2;next}}if ($escapeHTML or $json){$mt->Options(Charset=>'UTF8')if$json;$mt->Options(Escape=>'HTML')if$escapeHTML and not $xml}elsif ($escapeXML and not $xml){$mt->Options(Escape=>'XML')}if ($sortOpt){my$sort=($outFormat > 0 or $xml or $json or $csv or $plot)? 'Tag' : 'Descr';$mt->Options(Sort=>$sort,Sort2=>$sort)}if ($mt->Options('Struct')and not $structOpt){$structOpt=$mt->Options('Struct');require 'Image/ExifTool/XMPStruct.pl'}if ($plot){undef$joinLists;$mt->Options(List=>1);$plot->Settings($mt->Options('Plot'))}elsif ($xml){require Image::ExifTool::XMP;my$charset=$mt->Options('Charset');my%encoding=(UTF8=>'UTF-8',Latin=>'windows-1252',Latin2=>'windows-1250',Cyrillic=>'windows-1251',Greek=>'windows-1253',Turkish=>'windows-1254',Hebrew=>'windows-1255',Arabic=>'windows-1256',Baltic=>'windows-1257',Vietnam=>'windows-1258',MacRoman=>'macintosh',);unless ($encoding{$charset}){$charset='UTF8';$mt->Options(Charset=>$charset)}$fileHeader=\"<?xml version='1.0' encoding='$encoding{$charset}'?>\\n\" .\"<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\\n\";$fileTrailer=\"</rdf:RDF>\\n\";$joinLists=1 if$outFormat > 0;$mt->Options(List=>1)unless$joinLists;$showGroup=$allGroup=1;$binaryOutput=($outFormat > 0 ? undef : 0)if$binaryOutput;$showTagID='D' if$tabFormat and not $showTagID}elsif ($json){if ($json==1){$fileHeader='[';$fileTrailer=\"]\\n\"}else {$fileHeader='Array(';$fileTrailer=\");\\n\"}if ($binaryOutput){$binaryOutput=0;require Image::ExifTool::XMP if$json==1}$mt->Options(List=>1)unless$joinLists;$showTagID='D' if$tabFormat and not $showTagID}elsif ($structOpt){$mt->Options(List=>1)}else {$joinLists=1}if ($argFormat){$outFormat=3;$allGroup=1 if defined$showGroup}if (Image::ExifTool::IsPC()){tr/\\\\/\\// foreach@files}unless (@files){unless ($outOpt){if ($doGlob and $doGlob==2){Error \"No matching files\\n\"}else {Error \"No file specified\\n\"}next}push@files,''}if ($verbose){$disableOutput=1 unless@tags or @exclude or $tagOut;undef$binaryOutput unless$tagOut;if ($html){$html=2;$mt->Options(HtmlDump=>$verbose)}else {$mt->Options(Verbose=>$verbose)unless$tagOut}}elsif (defined$verbose){require FileHandle;STDOUT->autoflush(1);STDERR->autoflush(1)}my$needSave=1;if (@newValues){if ($addGeotime){AddSetTagsFile($setTagsFile='@')unless$setTagsFile and $setTagsFile eq '@';push @{$setTags{$setTagsFile}},$addGeotime;$verbose and print$vout qq(Using default \"-$addGeotime\"\\n)}my%setTagsIndex;my%addDelOpt=('+'=>'AddValue','-'=>'DelValue',\"\\xe2\\x88\\x92\"=>'DelValue');$saveCount=0;for (@newValues){if (ref $_ eq 'HASH'){if ($$_{SaveCount}){$saveCount=$mt->SaveNewValues();$needSave=0;push@dynamicFiles,\\$csv if $$_{SaveCount}==$csvSaveCount}next}/(.*?)=(.*)/s or next;\n        my ($tag, $newVal) = ($1, $2);\n        $tag =~ s/\\ball\\b/\\*/ig;    # replace 'all' with '*' in tag names\n        $newVal eq '' and undef $newVal unless $tag =~ s/\\^([-+]*)$/$1/;  # undefined to delete tag\n        if ($tag =~ /^(All)?TagsFromFile$/i){defined$newVal or Error(\"Need file name for -tagsFromFile\\n\"),next Command;++$isWriting;if ($newVal eq '@' or not defined FilenameSPrintf($newVal)or grep /\\bfile\\d+:/i,@{$setTags{$newVal}}){push@dynamicFiles,$newVal;next}unless ($mt->Exists($newVal)or $newVal eq '-'){Error \"File '${newVal}' does not exist for -tagsFromFile option\\n\";next Command}my$setTags=$setTags{$newVal};if ($setTagsList{$newVal}){my$i=$setTagsIndex{$newVal}|| 0;$setTagsIndex{$newVal}=$i + 1;$setTags=$setTagsList{$newVal}[$i]if$setTagsList{$newVal}[$i]}unless (DoSetFromFile($mt,$newVal,$setTags)){$rtnVal=1;next Command}$needSave=1;next}my%opts=(Shift=>0);$opts{Protected}=1 unless$tag =~ /[?*]/;if ($tag =~ s/<// and defined$newVal){if (defined FilenameSPrintf($newVal)){SlurpFile($newVal,\\$newVal)or next}else {$tag =~ s/([-+]|\\xe2\\x88\\x92)$// and $opts{$addDelOpt{$1}}=1;my$result=Image::ExifTool::IsWritable($tag);if ($result){$opts{ProtectSaved}=$saveCount;push@dynamicFiles,[$tag,$newVal,\\%opts ];++$isWriting}elsif (defined$result){Warn \"Tag '${tag}' is not writable\\n\"}else {Warn \"Tag '${tag}' does not exist\\n\"}next}}if ($tag =~ s/([-+]|\\xe2\\x88\\x92)$//){$opts{$addDelOpt{$1}}=1;$newVal='' if $1 eq '-' and not defined$newVal}if ($escapeC and defined$newVal){$newVal =~ s/\\\\(x([0-9a-fA-F]{2})|.)/$2 ? chr(hex($2)) : $unescC{$1} || $1/seg}my ($rtn,$wrn)=$mt->SetNewValue($tag,$newVal,%opts);$needSave=1;++$isWriting if$rtn;$wrn and Warning($mt,$wrn);}unless ($csv){for (@exclude){$mt->SetNewValue($_,undef,Replace=>2);$needSave=1}}unless ($isWriting or $outOpt or @tags){Error \"Nothing to do.\\n\";next}}elsif (grep /^(\\*:)?\\*$/,@exclude){Error \"All tags excluded -- nothing to do.\\n\";next}if ($isWriting){if (defined$diff){Error \"Can't use -diff option when writing tags\\n\";next}elsif ($plot){Error \"Can't use -plot option when writing tags\\n\";next}elsif (@tags and not $outOpt and not $csv){my ($tg,$s)=@tags > 1 ? (\"$tags[0] ...\",'s'): ($tags[0],'');Warn \"Ignored superfluous tag name$s or invalid option$s: -$tg\\n\"}}$mt->SaveNewValues()if$outOpt or (@dynamicFiles and $needSave);$multiFile=1 if@files > 1;@exclude and $mt->Options(Exclude=>\\@exclude);undef$binaryOutput if$html;if ($binaryOutput){$outFormat=99;$mt->Options(PrintConv=>0);unless ($textOut or $binaryStdout){binmode(STDOUT);$binaryStdout=1;$mt->Options(TextOut=>($vout=\\*STDERR))}undef$showGroup}if (defined$showGroup and not (@tags and ($allGroup or $csv))and ($sortOpt or not defined$sortOpt)){$mt->Options(Sort=>\"Group$showGroup\")}if ($textOut){CleanFilename($textOut);$textOut=\".$textOut\" unless$textOut =~ /[.%]/ or defined$tagOut}if ($outOpt){my$type=GetFileType($outOpt);if ($type){my$canWrite=CanWrite($outOpt);unless ($canWrite){if (defined$canWrite and $canWrite eq ''){$type=Image::ExifTool::GetFileExtension($outOpt);$type=uc($outOpt)unless defined$type}Error \"Can't write $type files\\n\";next}$scanWritable=$type unless CanCreate($type)}else {$scanWritable=1}$isWriting=1}elsif ($isWriting or defined$deleteOrig){$scanWritable=1}$altEnc=$mt->Options('Charset');undef$altEnc if$altEnc eq 'UTF8';if (not $altEnc and $mt->Options('Lang')ne 'en'){$fixLen=eval {require Unicode::GCString}? 2 : 1}if (@fileOrder){my@allFiles;ProcessFiles($mt,\\@allFiles);my$sortTool=Image::ExifTool->new;$sortTool->Options(FastScan=>$fileOrderFast)if$fileOrderFast;$sortTool->Options(PrintConv=>$mt->Options('PrintConv'));$sortTool->Options(Duplicates=>0);my (%sortBy,%isFloat,@rev,$file);push@rev,(s/^-// ? 1 : 0)foreach@fileOrder;for$file (@allFiles){my@tags;my$info=$sortTool->ImageInfo(Infile($file,1),@fileOrder,\\@tags);for (@tags){$_=$$info{$_};defined $_ or $_='~',next;$isFloat{$_}=Image::ExifTool::IsFloat($_);s/(\\d+)/(length($1) < 12 ? '0'x(12-length($1)) : '') . $1/eg unless$isFloat{$_}}$sortBy{$file}=\\@tags}@files=sort {my ($i,$cmp);for ($i=0;$i<@rev;++$i){my$u=$sortBy{$a}[$i];my$v=$sortBy{$b}[$i];if (not $isFloat{$u}and not $isFloat{$v}){$cmp=$u cmp $v}elsif ($isFloat{$u}and $isFloat{$v}){$cmp=$u <=> $v}else {$cmp=$isFloat{$u}? -1 : 1}return$rev[$i]? -$cmp : $cmp if$cmp}return$a cmp $b}@allFiles}elsif (defined$progress){my@allFiles;ProcessFiles($mt,\\@allFiles);@files=@allFiles}$progressMax=scalar@files if defined$progress;my@dbKeys=keys%database;if (@dbKeys){if (eval {require Cwd}){undef$evalWarning;local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};for (@dbKeys){my$db=$database{$_};tr/\\\\/\\// and $database{$_}=$db;my$absPath=AbsPath($_);if (defined$absPath){$database{$absPath}=$db unless$database{$absPath};if ($verbose and $verbose > 1){print$vout \"Imported entry for '${_}' (full path: '${absPath}')\\n\"}}elsif ($verbose and $verbose > 1){print$vout \"Imported entry for '${_}' (no full path)\\n\"}}}}ProcessFiles($mt);Error \"No file with specified extension\\n\" if$filtered and not $validFile;if ($textOut){for (keys%outTrailer){next unless$outTrailer{$_};if ($mt->Open(\\*OUTTRAIL,$_,'>>')){my$fp=\\*OUTTRAIL;print$fp $outTrailer{$_};close$fp}else {Error(\"Error appending to $_\\n\")}}}else {print$sectTrailer if$sectTrailer;print$fileTrailer if$fileTrailer and not $fileHeader;my ($fp,$err);if ($textOut2){if ($mt->Open(\\*OUTFILE,$textOut2,'>')){$fp=\\*OUTFILE}else {Error(\"Error creating $textOut2\\n\");$err=1}}unless ($err){PrintCSV($fp)if$csv and not $isWriting;if ($plot){$plot->Draw($fp || \\*STDOUT);if ($$plot{Error}){Error(\"Error: $$plot{Error}\\n\");$err=1}elsif ($$plot{Warn}){Warn(\"Warning: $$plot{Warn}\\n\")}}}if ($fp){close($fp)or $err=1;if ($err){$mt->Unlink($textOut2)}else {$created{$textOut2}=1}}}my$totWr=$countGoodWr + $countBadWr + $countSameWr + $countCopyWr + $countGoodCr + $countBadCr;if (defined$deleteOrig){unless ($quiet){printf \"%5d directories scanned\\n\",$countDir if$countDir;printf \"%5d directories created\\n\",$countNewDir if$countNewDir;printf \"%5d files failed condition\\n\",$countFailed if$countFailed;printf \"%5d image files found\\n\",$count}if (@delFiles){if ($deleteOrig==1){printf '%5d originals will be deleted!  Are you sure [y/n]? ',scalar(@delFiles);my$response=<STDIN>;unless ($response =~ /^(y|yes)\\s*$/i){Warn \"Originals not deleted.\\n\";next}}$countGoodWr=$mt->Unlink(@delFiles);$countBad=scalar(@delFiles)- $countGoodWr}if ($quiet){}elsif ($count and not $countGoodWr and not $countBad){printf \"%5d original files found\\n\",$countGoodWr}elsif ($deleteOrig){printf \"%5d original files deleted\\n\",$countGoodWr if$count;printf \"%5d originals not deleted due to errors\\n\",$countBad if$countBad}else {printf \"%5d image files restored from original\\n\",$countGoodWr if$count;printf \"%5d files not restored due to errors\\n\",$countBad if$countBad}}elsif ((not $binaryStdout or $verbose)and not $quiet){my$tot=$count + $countBad;if ($countDir or $totWr or $countFailed or $tot > 1 or $textOut or %countLink){my$o=(($html or $json or $xml or %printFmt or $csv or $plot)and not $textOut)? \\*STDERR : $vout;printf($o \"%5d directories scanned\\n\",$countDir)if$countDir;printf($o \"%5d directories created\\n\",$countNewDir)if$countNewDir;printf($o \"%5d files failed condition\\n\",$countFailed)if$countFailed;printf($o \"%5d image files created\\n\",$countGoodCr)if$countGoodCr;printf($o \"%5d image files updated\\n\",$countGoodWr)if$totWr - $countGoodCr - $countBadCr - $countCopyWr;printf($o \"%5d image files unchanged\\n\",$countSameWr)if$countSameWr;printf($o \"%5d image files %s\\n\",$countCopyWr,$overwriteOrig ? 'moved' : 'copied')if$countCopyWr;printf($o \"%5d files weren't updated due to errors\\n\",$countBadWr)if$countBadWr;printf($o \"%5d files weren't created due to errors\\n\",$countBadCr)if$countBadCr;printf($o \"%5d image files read\\n\",$count)if ($tot+$countFailed)>1 or ($countDir and not $totWr);printf($o \"%5d files could not be read\\n\",$countBad)if$countBad;printf($o \"%5d output files created\\n\",scalar(keys%created))if$textOut or $textOut2;printf($o \"%5d output files appended\\n\",scalar(keys%appended))if%appended;printf($o \"%5d hard links created\\n\",$countLink{Hard}|| 0)if$countLink{Hard}or $countLink{BadHard};printf($o \"%5d hard links could not be created\\n\",$countLink{BadHard})if$countLink{BadHard};printf($o \"%5d symbolic links created\\n\",$countLink{Sym}|| 0)if$countLink{Sym}or $countLink{BadSym};printf($o \"%5d symbolic links could not be created\\n\",$countLink{BadSym})if$countLink{BadSym}}}if ($countBadWr or $countBadCr or $countBad){$rtnVal=1}elsif ($countFailed and not ($count or $totWr)and not $rtnVal){$rtnVal=2}Cleanup();}close STAYOPEN if$stayOpen >= 2;Exit$rtnValApp;sub GetImageInfo($$) {my ($et,$orig)=@_;my (@foundTags,@found2,$info,$info2,$et2,$file,$file2,$ind,$g8);if (defined$windowTitle){if ($progressCount >= $progressNext){my$prog=$progressMax ? \"$progressCount/$progressMax\" : '0/0';my$title=$windowTitle;my ($num,$denom)=split '/',$prog;my$frac=$num / ($denom || 1);my$n=$title =~ s/%(\\d+)b/%b/ ? $1 : 20;my$bar=int($frac * $n + 0.5);my%lkup=(b=>('I' x $bar).('.' x ($n - $bar)),f=>$orig,p=>int(100 * $frac + 0.5),r=>$prog,'%'=>'%',);$title =~ s/%([%bfpr])/$lkup{$1}/eg;SetWindowTitle($title);if (defined$progressMax){undef$progressNext}else {$progressNext += $progressIncr}}++$progressCount unless defined$progressMax}unless (length$orig or $outOpt){Warn qq(Error: Zero-length file name - \"\"\\n);++$countBad;return}if (@srcFmt){my ($fmt,$first);for$fmt (@srcFmt){$file=$fmt eq '@' ? $orig : FilenameSPrintf($fmt,$orig);$et->Exists($file)and undef($first),last;$verbose and print$vout \"Source file $file does not exist\\n\";$first=$file unless defined$first}$file=$first if defined$first;my ($d,$f)=Image::ExifTool::SplitFileName($orig);$et->Options(UserParam=>\"OriginalDirectory#=$d\");$et->Options(UserParam=>\"OriginalFileName#=$f\")}else {$file=$orig}for$g8 (sort keys%altFile){my$altName=$orig;$altName =~ s/\\$/\\$\\$/g;$altName=FilenameSPrintf($altFile{$g8},$altName);$et->SetAlternateFile($g8,$altName)}my$pipe=$file;if ($doUnzip){if ($file =~ /\\.(gz|bz2)$/i){my$type=lc $1;if ($file =~ /[^-_.'A-Za-z0-9\\/\\\\]/){Warn \"Error: Insecure zip file name. Skipped\\n\";EFile($file);++$countBad;return}if ($type eq 'gz'){$pipe=qq{gzip -dc \"$file\" |}}else {$pipe=qq{bzip2 -dc \"$file\" |}}$$et{TRUST_PIPE}=1}}if (@condition){unless ($file eq '-' or $et->Exists($file)){Warn \"Error: File not found - $file\\n\";EFile($file);FileNotFound($file);++$countBad;return}my$result;unless ($failCondition){undef$evalWarning;local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};my (%info,$condition);my$opts={Duplicates=>1,RequestTags=>\\@requestTags,Verbose=>0,HtmlDump=>0 };$$opts{FastScan}=$fastCondition if defined$fastCondition;@foundTags=('*',@tags)if@tags;$info=$et->ImageInfo(Infile($pipe,$isWriting),\\@foundTags,$opts);for$condition (@condition){my$cond=$et->InsertTagValues($condition,\\@foundTags,\\%info);{package Image::ExifTool;my$self=$et;$result=eval$cond;$@ and $evalWarning=$@}if ($evalWarning){undef$result;if ($verbose){chomp$evalWarning;$evalWarning =~ s/ at \\(eval .*//s;Warn \"Condition: $evalWarning - $file\\n\"}}last unless$result}undef@foundTags if$fastCondition}unless ($result){Progress($vout,\"-------- $file (failed condition)\")if$verbose;EFile($file,2);++$countFailed;return}if ($isWriting or $verbose or defined$fastCondition or defined$diff){undef$info;--$$et{FILE_SEQUENCE}}}elsif ($file =~ s/^(\\@JSON:)(.*)/$1/){my$dat=$2;$info=$et->ImageInfo(\\$dat,\\@foundTags);if ($geoOnly){/^Geolocation/ or delete $$info{$_}foreach keys %$info;$file=' '}}if (defined$deleteOrig){Progress($vout,\"======== $file\")if defined$verbose;++$count;my$original=\"${file}_original\";$et->Exists($original)or return;if ($deleteOrig){$verbose and print$vout \"Scheduled for deletion: $original\\n\";push@delFiles,$original}elsif ($et->Rename($original,$file)){$verbose and print$vout \"Restored from $original\\n\";EFile($file,3);++$countGoodWr}else {Warn \"Error renaming $original\\n\";EFile($file);++$countBad}return}++$seqFileNum;my ($dir)=Image::ExifTool::SplitFileName($orig);$seqFileDir=$seqFileDir{$dir}=($seqFileDir{$dir}|| 0)+ 1;my$lineCount=0;my ($fp,$outfile,$append);if ($textOut and ($verbose or $et->Options('PrintCSV'))and not ($tagOut or defined$diff or $plot)){($fp,$outfile,$append)=OpenOutputFile($orig);$fp or EFile($file),++$countBad,return;$tmpText=$outfile unless$append;$et->Options(TextOut=>$fp)}if ($isWriting){Progress($vout,\"======== $file\")if defined$verbose;SetImageInfo($et,$file,$orig);$info=$et->GetInfo('Warning','Error');PrintErrors($et,$info,$file);if (defined$outfile){undef$tmpText;close($fp);$et->Options(TextOut=>$vout);if ($info->{Error}){$et->Unlink($outfile)}elsif ($append){$appended{$outfile}=1 unless$created{$outfile}}else {$created{$outfile}=1}}return}unless ($file eq '-' or $et->Exists($file)or $info){Warn \"Error: File not found - $file\\n\";FileNotFound($file);defined$outfile and close($fp),undef($tmpText),$et->Unlink($outfile);EFile($file);++$countBad;return}my$o;unless ($binaryOutput or $textOut or %printFmt or $html > 1 or $csv or $plot){if ($html){require Image::ExifTool::HTML;my$f=Image::ExifTool::HTML::EscapeHTML($file);print \"<!-- $f -->\\n\"}elsif (not ($json or $xml or defined$diff)){$o=\\*STDOUT if ($multiFile and not $quiet)or $progress}}$o=\\*STDERR if$progress and not $o;Progress($o,\"======== $file\")if$o;if ($info){if (@tags and not %printFmt){@foundTags=@tags;$info=$et->GetInfo(\\@foundTags)}}else {my$oldDups=$et->Options('Duplicates');if (%printFmt){$et->Options(Duplicates=>1);$et->Options(RequestTags=>\\@requestTags);if ($printFmt{SetTags}){$$et{TAGS_FROM_FILE}=1;$et->Options(MakerNotes=>1);$et->Options(Struct=>2);$et->Options(List=>1);$et->Options(CoordFormat=>'%d %d %.8f')unless$et->Options('CoordFormat')}}else {@foundTags=@tags}if (defined$diff){$file2=FilenameSPrintf($diff,$orig);if ($file eq $file2){Warn \"Error: Diffing file with itself - $file2\\n\";EFile($file);++$countBad;return}if ($et->Exists($file2)){$showGroup=1 unless defined$showGroup;$allGroup=1 unless defined$allGroup;$et->Options(Duplicates=>1,Sort=>\"Group$showGroup\",Verbose=>0);$et2=Image::ExifTool->new;$et2->Options(%{$$et{OPTIONS}});$et2->Options(ListSep=>$$et{OPTIONS}{ListSep});$et2->Options(ListSplit=>$$et{OPTIONS}{ListSplit});@found2=@foundTags;$info2=$et2->ImageInfo($file2,\\@found2)}else {$info2={Error=>\"Diff file not found\" }}if ($$info2{Error}){Warn \"Error: $$info2{Error} - $file2\\n\";EFile($file);++$countBad;return}}$info=$et->ImageInfo(Infile($pipe),\\@foundTags);$et->Options(Duplicates=>$oldDups)}if ($fp){if (defined$outfile){$et->Options(TextOut=>\\*STDOUT);undef$tmpText;if ($info->{Error}){close($fp);$et->Unlink($outfile)}else {++$lineCount}}if ($info->{Error}){Warn \"Error: $$info{Error} - $file\\n\";EFile($file);++$countBad;return}}if ($binaryOutput or not %$info){my$errs=$et->GetInfo('Warning','Error');PrintErrors($et,$errs,$file)and EFile($file),$rtnVal=1}elsif ($et->GetValue('Error')or ($$et{Validate}and $et->GetValue('Warning'))){$rtnVal=1}unless (defined$outfile or $tagOut){($fp,$outfile,$append)=OpenOutputFile($orig);$fp or EFile($file),++$countBad,return;$tmpText=$outfile if defined$outfile and not $append}if (defined$diff){my (%done,%done2,$wasDiff,@diffs,@groupTags2);my$v=$verbose || 0;print$fp \"======== diff < $file > $file2\\n\";my ($g2,$same)=(0,0);for (;;){my ($g,$tag2,$i,$key,@dupl,$val2,$t2,$equal,%used);my$tag=shift@foundTags;if (defined$tag){$done{$tag}=1;$g=$et->GetGroup($tag,$showGroup)}else {for (;;){$tag2=shift@found2;defined$tag2 or $g='',last;$done2{$tag2}or $g=$et2->GetGroup($tag2,$showGroup),last}}if ($g ne $g2){for$t2 (@groupTags2){next if$done2{$t2};my$val2=$et2->GetValue($t2);next unless defined$val2;my$name=$outFormat < 1 ? $et2->GetDescription($t2): GetTagName($t2);my$len=LengthUTF8($name);my$pad=$outFormat < 2 ? ' ' x ($len < 32 ? 32 - $len : 0): '';if ($allGroup){my$grp=\"[$g2]\";$grp .= ' ' x (15 - length($grp))if length($grp)< 15 and $outFormat < 2;push@diffs,sprintf \"> %s %s%s: %s\\n\",$grp,$name,$pad,Printable($val2)}else {push@diffs,sprintf \"> %s%s: %s\\n\",$name,$pad,Printable($val2)}$done2{$t2}=1}my$str='';$v and ($same or $v > 1)and $str=\"  ($same same tag\" .($same==1 ? '' : 's').')';if (not $allGroup){print$fp \"---- $g2 ----$str\\n\" if$g2 and ($str or @diffs)}elsif ($str and $g2){printf$fp \"   %-13s%s\\n\",$g2,$str}@diffs and print($fp @diffs),$wasDiff=1,@diffs=();last unless$g;($g2,$same)=($g,0);@groupTags2=();push@groupTags2,$tag2 if defined$tag2;for$t2 (@found2){$done2{$t2}or $g ne $et2->GetGroup($t2,$showGroup)or push@groupTags2,$t2}}next unless defined$tag;my$val=$et->GetValue($tag);next unless defined$val;my$name=GetTagName($tag);my$desc=$outFormat < 1 ? $et->GetDescription($tag): $name;my@tags2=grep /^$name( |$)/,@groupTags2;T2: foreach$t2 (@tags2){next if$done2{$t2};$tag2=$t2;$val2=$et2->GetValue($t2);next unless defined$val2;IsEqual($val,$val2)and $equal=1,last;if ($$et{DUPL_TAG}{$name}and not @dupl){for ($i=0,$key=$name;$i<=$$et{DUPL_TAG}{$name};++$i,$key=\"$name ($i)\"){push@dupl,$key unless$done{$key}or $g ne $et->GetGroup($key,$showGroup)}@dupl=sort {$$et{FILE_ORDER}{$a}<=> $$et{FILE_ORDER}{$b}}@dupl if@dupl > 1}for (@dupl){next if$used{$_};my$v=$et->GetValue($_);next unless defined($v)and IsEqual($v,$val2);$used{$_}=1;undef($tag2);undef($val2);next T2}last}if ($equal){++$same}else {my$len=LengthUTF8($desc);my$pad=$outFormat < 2 ? ' ' x ($len < 32 ? 32 - $len : 0): '';if ($allGroup){my$grp=\"[$g]\";$grp .= ' ' x (15 - length($grp))if length($grp)< 15 and $outFormat < 2;push@diffs,sprintf \"< %s %s%s: %s\\n\",$grp,$desc,$pad,Printable($val);if (defined$val2){$grp=' ' x length($grp),$desc=' ' x $len if$v < 3;push@diffs,sprintf \"> %s %s%s: %s\\n\",$grp,$desc,$pad,Printable($val2)}}else {push@diffs,sprintf \"< %s%s: %s\\n\",$desc,$pad,Printable($val);$desc=' ' x $len if$v < 3;push@diffs,sprintf \"> %s%s: %s\\n\",$desc,$pad,Printable($val2)if defined$val2}}$done2{$tag2}=1 if defined$tag2}print$fp \"(no metadata differences)\\n\" unless$wasDiff;if (defined$outfile){$created{$outfile}=1;close($fp);undef$tmpText}++$count;return}$comma=$outComma{$outfile}if$append and ($textOverwrite & 0x02);if (%printFmt){my ($type,$doc,$grp,$lastDoc,$cache);$fileTrailer='';if ($et->Options('ExtractEmbedded')){$lastDoc=$$et{DOC_COUNT}and $cache={}}else {$lastDoc=0}for ($doc=0;$doc<=$lastDoc;++$doc){my ($skipBody,$opt);for$type (qw(HEAD SECT IF BODY ENDS TAIL)){my$prf=$printFmt{$type}or next;if ($type eq 'HEAD' and defined$outfile){next if$wroteHEAD{$outfile};$wroteHEAD{$outfile}=1}next if$type eq 'BODY' and $skipBody;if ($type eq 'IF' or ($doc > 1 and not $$et{OPTIONS}{IgnoreMinorErrors})){$opt='Silent'}else {$opt='Warn'}if ($lastDoc){if ($doc){next if$type eq 'HEAD' or $type eq 'TAIL';$grp=\"Doc$doc\"}else {$grp='Main'}}my@lines;for (@$prf){my$line=$et->InsertTagValues($_,\\@foundTags,$opt,$grp,$cache);if ($type eq 'IF'){$skipBody=1 unless defined$line}elsif (defined$line){push@lines,$line}}$lineCount += scalar@lines;if ($type eq 'SECT'){my$thisHeader=join '',@lines;if ($sectHeader and $sectHeader ne $thisHeader){print$fp $sectTrailer if$sectTrailer;undef$sectHeader}$sectTrailer='';print$fp $sectHeader=$thisHeader unless$sectHeader}elsif ($type eq 'ENDS'){$sectTrailer .= join '',@lines if defined$sectHeader}elsif ($type eq 'TAIL'){$fileTrailer .= join '',@lines}elsif (@lines){print$fp @lines}}}delete$printFmt{HEAD}unless defined$outfile;my$errs=$et->GetInfo('Warning','Error');PrintErrors($et,$errs,$file)and EFile($file)}elsif ($plot){my$tagExtra=$$et{TAG_EXTRA};my ($tag,%docNum);for$tag (keys %$info){next unless $$tagExtra{$tag}and $$tagExtra{$tag}{G3};$docNum{$tag}=$1 if $$tagExtra{$tag}{G3}=~ /(\\d+)/}$$plot{DocNum}=\\%docNum;$$plot{EE}=1 if$et->Options('ExtractEmbedded');$plot->AddPoints($info,\\@foundTags)}elsif (not $disableOutput){my ($tag,$line,%noDups,%csvInfo,$bra,$ket,$sep,$quote);if ($fp){if ($fileHeader){print$fp $fileHeader unless defined$outfile and ($created{$outfile}or $appended{$outfile});undef$fileHeader unless$textOut}if ($html){print$fp \"<table>\\n\"}elsif ($xml){my$f=$file;CleanXML(\\$f);print$fp \"\\n<rdf:Description rdf:about='${f}'\";print$fp \"\\n  xmlns:et='http://ns.exiftool.org/1.0/'\";print$fp \" et:toolkit='Image::ExifTool $Image::ExifTool::VERSION'\";my (%groups,@groups,$grp0,$grp1);for$tag (@foundTags){($grp0,$grp1)=$et->GetGroup($tag);unless ($grp1){next unless defined$forcePrint;$grp0=$grp1='Unknown'}AddGroups($$info{$tag},$grp0,\\%groups,\\@groups)if ref $$info{$tag};next if$groups{$grp1};$groups{$grp1}=$grp0;push@groups,$grp1}for$grp1 (@groups){my$grp=$groups{$grp1};unless ($grp eq $grp1 and $grp =~ /^(ExifTool|File|Composite|Unknown)$/){$grp .= \"/$grp1\"}print$fp \"\\n  xmlns:$grp1='http://ns.exiftool.org/$grp/1.0/'\"}print$fp '>' if$outFormat < 1;$ind=$outFormat >= 0 ? ' ' : '   '}elsif ($json){($bra,$ket,$sep)=$json==1 ? ('{','}',':'): ('Array(',')',' =>');$quote=1 if $$et{OPTIONS}{StructFormat}and $$et{OPTIONS}{StructFormat}eq 'JSONQ';print$fp \",\\n\" if$comma;print$fp qq($bra\\n  \"SourceFile\"$sep ),EscapeJSON(MyConvertFileName($et,$file),1);$comma=1;$ind=(defined$showGroup and not $allGroup)? '    ' : '  '}elsif ($csv){my$file2=MyConvertFileName($et,$file);$database{$file2}=\\%csvInfo;push@csvFiles,$file2}}my$noDups=($json or ($xml and $outFormat > 0));my$printConv=$et->Options('PrintConv');my$lastGroup='';my$i=-1;TAG: foreach$tag (@foundTags){++$i;my$tagName=GetTagName($tag);my ($group,$valList);my$val=$$info{$tag};$isBinary=(ref$val eq 'SCALAR' and defined$binaryOutput);if (ref$val){if (defined$binaryOutput and not $binaryOutput and $$et{TAG_INFO}{$tag}{Protected}){my$lcTag=lc$tag;$lcTag =~ s/ .*//;next unless $$et{REQ_TAG_LOOKUP}{$lcTag}or ($$et{OPTIONS}{RequestAll}|| 0)> 2}$val=ConvertBinary($val);next unless defined$val;if ($structOpt and ref$val){$val=Image::ExifTool::XMP::SerializeStruct($et,$val)unless$xml or $json}elsif (ref$val eq 'ARRAY'){if (defined$listItem){$val=$$val[$listItem]}elsif ($binaryOutput){if ($tagOut){$valList=$val;$val=shift @$valList}else {$val=join defined$binSep ? $binSep : \"\\n\",@$val}}elsif ($joinLists){$val=join$listSep,@$val}}}if (not defined$val){next if$binaryOutput;if (defined$forcePrint){$val=$forcePrint}elsif (not $csv){next}}if (defined$showGroup){$group=$et->GetGroup($tag,$showGroup);next if$noDups and $tag =~ /^(.*?) ?\\(/ and defined $$info{$1}and $group eq $et->GetGroup($1,$showGroup);if (not $group and ($xml or $json or $csv)){if ($showGroup !~ /\\b4\\b/){$group='Unknown'}elsif ($json and not $allGroup){$group='Copy0'}}if ($fp and not ($allGroup or $csv)){if ($lastGroup ne $group){if ($html){my$cols=1;++$cols if$outFormat==0 or $outFormat==1;++$cols if$showTagID;print$fp \"<tr><td colspan=$cols bgcolor='#dddddd'>$group</td></tr>\\n\"}elsif ($json){print$fp \"\\n  $ket\" if$lastGroup;print$fp ',' if$lastGroup or $comma;print$fp qq(\\n  \"$group\"$sep $bra);undef$comma;undef%noDups}else {print$fp \"---- $group ----\\n\"}$lastGroup=$group}undef$group}}elsif ($noDups){next if$tag =~ /^(.*?) ?\\(/ and defined $$info{$1}}++$lineCount;for (;;){if ($tagOut){my$ext=SuggestedExtension($et,\\$val,$tagName);if (%wext and ($wext{$ext}|| $wext{'*'}|| -1)< 0){if ($verbose and $verbose > 1){print$vout \"Not writing $ext output file for $tagName\\n\"}next TAG}my@groups=$et->GetGroup($tag);defined$outfile and close($fp),undef($tmpText);my$org=$et->GetValue('OriginalRawFileName')|| $et->GetValue('OriginalFileName');($fp,$outfile,$append)=OpenOutputFile($orig,$tagName,\\@groups,$ext,$org);$fp or ++$countBad,next TAG;$tmpText=$outfile unless$append}if ($binaryOutput){print$fp $val;print$fp $binTerm if defined$binTerm;if ($tagOut){if ($append){$appended{$outfile}=1 unless$created{$outfile}}else {$created{$outfile}=1}close($fp);undef$tmpText;$verbose and print$vout \"Wrote $tagName to $outfile\\n\";undef$outfile;undef$fp;next TAG unless$valList and @$valList;$val=shift @$valList;next}next TAG}last}if ($csv){my$tn=$tagName;$tn .= '#' if$tag =~ /#/;my$gt=$group ? \"$group:$tn\" : $tn;my$lcTag=lc$gt;next if defined$csvInfo{$lcTag}and $tag =~ /\\(/;$csvInfo{$lcTag}=$val;if (defined$csvTags{$lcTag}){$csvTags{$lcTag}=$gt if defined $$info{$tag};next}if ($group and defined$csvTags[$i]and $csvTags[$i]=~ /^(.*):$tn$/i){next if$group eq 'Unknown';if ($1 eq 'unknown'){delete$csvTags{$csvTags[$i]};$csvTags{$lcTag}=defined($val)? $gt : '';$csvTags[$i]=$lcTag;next}}$csvTags{$lcTag}=defined($val)? $gt : '';if (@csvFiles==1){push@csvTags,$lcTag}elsif (@csvTags){undef@csvTags}next}my$desc=$outFormat > 0 ? $tagName : $et->GetDescription($tag);if ($xml){my$tok=\"$group:$tagName\";if ($outFormat > 0){if ($structOpt and ref$val){$val=Image::ExifTool::XMP::SerializeStruct($et,$val)}if ($escapeHTML){$val =~ tr/\\0-\\x08\\x0b\\x0c\\x0e-\\x1f/./;Image::ExifTool::XMP::FixUTF8(\\$val)unless$altEnc;$val=Image::ExifTool::HTML::EscapeHTML($val,$altEnc)}else {CleanXML(\\$val)}unless ($noDups{$tok}){$isCRLF and $val =~ s/\\x0d\\x0a/\\x0a/g;print$fp \"\\n $tok='${val}'\";$noDups{$tok}=1}next}my ($xtra,$valNum,$descClose);if ($showTagID){my ($id,$lang)=$et->GetTagID($tag);if ($id =~ /^\\d+$/){$id=sprintf(\"0x%.4x\",$id)if$showTagID eq 'H'}else {$id=Image::ExifTool::XMP::FullEscapeXML($id)}$xtra=\" et:id='${id}'\";$xtra .= \" xml:lang='${lang}'\" if$lang}else {$xtra=''}if ($tabFormat){my$table=$et->GetTableName($tag);my$index=$et->GetTagIndex($tag);$xtra .= \" et:table='${table}'\";$xtra .= \" et:index='${index}'\" if defined$index}my$lastVal=$val;for ($valNum=0;$valNum<2;++$valNum){$val=FormatXML($val,$ind,$group);$isCRLF and $val =~ s/\\x0d\\x0a/\\x0a/g;if ($outFormat >= 0){print$fp \"\\n <$tok$xtra$val</$tok>\";last}elsif ($valNum==0){CleanXML(\\$desc);if ($xtra){print$fp \"\\n <$tok>\";print$fp \"\\n  <rdf:Description$xtra>\";$descClose=\"\\n  </rdf:Description>\"}else {print$fp \"\\n <$tok rdf:parseType='Resource'>\";$descClose=''}print$fp \"\\n   <et:desc>$desc</et:desc>\";if ($printConv){print$fp \"\\n   <et:prt$val</et:prt>\";$val=$et->GetValue($tag,'ValueConv');$val='' unless defined$val;next unless IsEqual($val,$lastVal);print$fp \"$descClose\\n </$tok>\";last}}print$fp \"\\n   <et:val$val</et:val>\";print$fp \"$descClose\\n </$tok>\";last}next}elsif ($json){my$tok=$allGroup ? \"$group:$tagName\" : $tagName;next if$noDups{$tok};$noDups{$tok}=1;print$fp ',' if$comma;print$fp qq(\\n$ind\"$tok\"$sep );if ($showTagID or $outFormat < 0){$val={val=>$val };if ($showTagID){my ($id,$lang)=$et->GetTagID($tag);$id=sprintf('0x%.4x',$id)if$showTagID eq 'H' and $id =~ /^\\d+$/;$$val{lang}=$lang if$lang;$$val{id}=$id}if ($tabFormat){$$val{table}=$et->GetTableName($tag);my$index=$et->GetTagIndex($tag);$$val{index}=$index if defined$index}if ($outFormat < 0){$$val{desc}=$desc;if ($printConv){my$num=$et->GetValue($tag,'ValueConv');$$val{num}=$num if defined$num and not IsEqual($num,$$val{val})}my$ex=$$et{TAG_EXTRA}{$tag};$$val{'fmt'}=$$ex{G6}if defined $$ex{G6};if (defined $$ex{BinVal}){my$max=($$et{OPTIONS}{LimitLongValues}- 5)/ 3;if ($max >= 0 and length($$ex{BinVal})> int($max)){$max=int$max;$$val{'hex'}=join ' ',unpack(\"(H2)$max\",$$ex{BinVal}),'[...]'}else {$$val{'hex'}=join ' ',unpack '(H2)*',$$ex{BinVal}}}}}FormatJSON($fp,$val,$ind,$quote);$comma=1;next}my$id;if ($showTagID){$id=$et->GetTagID($tag);if ($id =~ /^(\\d+)(\\.\\d+)?$/){$id=sprintf(\"0x%.4x\",$1)if$showTagID eq 'H'}else {$id='-'}}if ($escapeC){$val =~ s/([\\0-\\x1f\\\\\\x7f])/$escC{$1} || sprintf('\\x%.2x', ord $1)/eg}else {$val =~ tr/\\x01-\\x1f\\x7f/./;$val =~ s/\\x00//g;$val =~ s/\\s+$//}if ($html){print$fp \"<tr>\";print$fp \"<td>$group</td>\" if defined$group;print$fp \"<td>$id</td>\" if$showTagID;print$fp \"<td>$desc</td>\" if$outFormat <= 1;print$fp \"<td>$val</td></tr>\\n\"}else {my$buff='';if ($tabFormat){$buff=\"$group\\t\" if defined$group;$buff .= \"$id\\t\" if$showTagID;if ($outFormat <= 1){$buff .= \"$desc\\t$val\\n\"}elsif (defined$line){$line .= \"\\t$val\"}else {$line=$val}}elsif ($outFormat < 0){$buff=\"[$group] \" if defined$group;$buff .= \"$id \" if$showTagID;$buff .= \"$desc\\n      $val\\n\"}elsif ($outFormat==0 or $outFormat==1){my$wid;my$len=0;if (defined$group){$buff=sprintf(\"%-15s \",\"[$group]\");$len=16}if ($showTagID){$wid=($showTagID eq 'D')? 5 : 6;$len += $wid + 1;($wid=$len - length($buff)- 1)< 1 and $wid=1;$buff .= sprintf \"%${wid}s \",$id}$wid=32 - (length($buff)- $len);my$padLen=$wid - LengthUTF8($desc);$padLen=0 if$padLen < 0;$buff .= $desc .(' ' x $padLen).\": $val\\n\"}elsif ($outFormat==2){$buff=\"[$group] \" if defined$group;$buff .= \"$id \" if$showTagID;$buff .= \"$tagName: $val\\n\"}elsif ($argFormat){$buff='-';$buff .= \"$group:\" if defined$group;$tagName .= '#' if$tag =~ /#/;$buff .= \"$tagName=$val\\n\"}else {$buff=\"$group \" if defined$group;$buff .= \"$id \" if$showTagID;$buff .= \"$val\\n\"}print$fp $buff}if ($tagOut){if ($append){$appended{$outfile}=1 unless$created{$outfile}}else {$created{$outfile}=1}close($fp);undef$tmpText;$verbose and print$vout \"Wrote $tagName to $outfile\\n\";undef$outfile;undef$fp}}if ($fp){if ($html){print$fp \"</table>\\n\"}elsif ($xml){print$fp $outFormat < 1 ? \"\\n</rdf:Description>\\n\" : \"/>\\n\"}elsif ($json){print$fp \"\\n  $ket\" if$lastGroup;print$fp \"\\n$ket\";$comma=1}elsif ($tabFormat and $outFormat > 1){print$fp \"$line\\n\" if defined$line}}}if (defined$outfile){if ($textOverwrite & 0x02){$outComma{$outfile}=$comma;$outTrailer{$outfile}='';$outTrailer{$outfile}.= $sectTrailer and $sectTrailer='' if$sectTrailer;$outTrailer{$outfile}.= $fileTrailer if$fileTrailer}else {print$fp $sectTrailer and $sectTrailer='' if$sectTrailer;print$fp $fileTrailer if$fileTrailer}close($fp);undef$tmpText;if ($lineCount){if ($append){$appended{$outfile}=1 unless$created{$outfile}}else {$created{$outfile}=1}}else {$et->Unlink($outfile)unless$append}undef$comma}++$count}sub SetImageInfo($$$) {my ($et,$file,$orig)=@_;my ($outfile,$restored,$isTemporary,$isStdout,$outType,$tagsFromSrc);my ($hardLink,$symLink,$testName,$sameFile);my$infile=$file;if (defined$tmpFile){$et->Unlink($tmpFile);undef$tmpFile}delete $$et{VALUE}{Error};delete $$et{VALUE}{Warning};if (defined$outOpt){if ($outOpt =~ /^-(\\.\\w+)?$/){$outType=GetFileType($outOpt)if $1;$outfile='-';$isStdout=1}else {$outfile=FilenameSPrintf($outOpt,$orig);if ($outfile eq ''){Warn \"Error: Can't create file with zero-length name from $orig\\n\";EFile($infile);++$countBadCr;return 0}}if (not $isStdout and (($et->IsDirectory($outfile)and not $listDir)or $outfile =~ /\\/$/)){$outfile .= '/' unless$outfile =~ /\\/$/;my$name=$file;$name =~ s/^.*\\///s;$outfile .= $name}else {my$srcType=GetFileType($file)|| '';$outType or $outType=GetFileType($outfile);if ($outType and ($srcType ne $outType or $outType eq 'ICC')and $file ne '-'){unless (CanCreate($outType)){my$what=$srcType ? 'other types' : 'scratch';WarnOnce \"Error: Can't create $outType files from $what\\n\";EFile($infile);++$countBadCr;return 0}if ($file ne ''){$et->RestoreNewValues()unless$restored;$restored=1;my@setTags=@tags;for (@exclude){push@setTags,\"-$_\"}my%forceCopy=(ICC=>'ICC_Profile',VRD=>'CanonVRD',DR4=>'CanonDR4',);push@setTags,$forceCopy{$outType}if$forceCopy{$outType};if (not %setTags or (@setTags and not $setTags{'@'})){return 0 unless DoSetFromFile($et,$file,\\@setTags)}elsif (@setTags){push@setTags,@{$setTags{'@'}};$tagsFromSrc=\\@setTags}$file=''}}}unless ($isStdout){$outfile=NextUnusedFilename($outfile);if ($et->Exists($outfile,1)and not $doSetFileName){Warn \"Error: '${outfile}' already exists - $infile\\n\";EFile($infile);++$countBadWr;return 0}}}elsif ($file eq '-'){$isStdout=1}if (@dynamicFiles){$et->RestoreNewValues()unless$restored;my ($dyFile,%setTagsIndex);for$dyFile (@dynamicFiles){if (not ref$dyFile){my ($fromFile,$setTags);if ($dyFile eq '@'){$fromFile=$orig;$setTags=$tagsFromSrc || $setTags{$dyFile}}else {$fromFile=FilenameSPrintf($dyFile,$orig);defined$fromFile or EFile($infile),++$countBadWr,return 0;$setTags=$setTags{$dyFile}}if ($setTagsList{$dyFile}){my$i=$setTagsIndex{$dyFile}|| 0;$setTagsIndex{$dyFile}=$i + 1;$setTags=$setTagsList{$dyFile}[$i]if$setTagsList{$dyFile}[$i]}return 0 unless DoSetFromFile($et,$fromFile,$setTags)}elsif (ref$dyFile eq 'ARRAY'){my$fname=FilenameSPrintf($$dyFile[1],$orig);my ($buff,$rtn,$wrn);my$opts=$$dyFile[2];if (defined$fname and SlurpFile($fname,\\$buff)){$verbose and print$vout \"Reading $$dyFile[0] from $fname\\n\";($rtn,$wrn)=$et->SetNewValue($$dyFile[0],$buff,%$opts);$wrn and Warn \"$wrn\\n\"}$rtn or $et->SetNewValue($$dyFile[0],undef,Replace=>2,ProtectSaved=>$$opts{ProtectSaved});next}elsif (ref$dyFile eq 'SCALAR'){my ($f,$found,$csvTag,$tryTag,$tg);undef$evalWarning;local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};my$old=$et->Options('Charset');$et->Options(Charset=>'UTF8')if$csv eq 'JSON';for$f ('*',MyConvertFileName($et,$file)){my$csvInfo=$database{$f};unless ($csvInfo){next if$f eq '*';my$absPath=AbsPath($f);next unless defined$absPath and $csvInfo=$database{$absPath}}$found=1;if ($verbose){print$vout \"Setting new values from $csv database\\n\";print$vout 'Including tags: ',join(' ',@tags),\"\\n\" if@tags;print$vout 'Excluding tags: ',join(' ',@exclude),\"\\n\" if@exclude}my@tryTags=(@exclude,@tags);for (@tryTags){tr/-0-9a-zA-Z_:#?*//dc;s/(^|:)(all:)+/$1/ig;s/(^|:)all(#?)$/$1*$2/i;tr/?/./;s/\\*/.*/g}for$csvTag (OrderedKeys($csvInfo)){next if$csvTag =~ /^([-_0-9A-Z]+:)*(SourceFile|Directory|FileName)$/i;if (@tryTags){my ($i,$tryGrp,$matched);TryMatch: for ($i=0;$i<@tryTags;++$i){$tryTag=$tryTags[$i];if ($tryTag =~ /:/){next unless$csvTag =~ /:/;my@csvGrps=split /:/,$csvTag;my@tryGrps=split /:/,$tryTag;my$tryName=pop@tryGrps;next unless pop(@csvGrps)=~ /^$tryName$/i;for$tryGrp (@tryGrps){next TryMatch unless grep /^$tryGrp$/i,@csvGrps}$matched=1;last}$csvTag =~ /^([-_0-9A-Z]+:)*$tryTag$/i and $matched=1,last}next if$matched ? $i < @exclude : @tags}my ($rtn,$wrn)=$et->SetNewValue($csvTag,$$csvInfo{$csvTag},Protected=>1,AddValue=>$csvAdd,ProtectSaved=>$csvSaveCount);$wrn and Warn \"$wrn\\n\" if$verbose}}$et->Options(Charset=>$old)if$csv eq 'JSON';unless ($found){Warn(\"No SourceFile '${file}' in imported $csv database\\n\");my$absPath=AbsPath($file);Warn(\"(full path: '${absPath}')\\n\")if defined$absPath and $absPath ne $file;return 0}}}}if ($isStdout){$outfile=\\*STDOUT;unless ($binaryStdout){binmode(STDOUT);$binaryStdout=1}}else {$hardLink=$et->GetNewValues('HardLink');$symLink=$et->GetNewValues('SymLink');$testName=$et->GetNewValues('TestName');$hardLink=FilenameSPrintf($hardLink,$orig)if defined$hardLink;$symLink=FilenameSPrintf($symLink,$orig)if defined$symLink;my$newFileName=$et->GetNewValues('FileName');my$newDir=$et->GetNewValues('Directory');if (defined$newFileName and not length$newFileName){Warning($et,\"New file name is empty - $infile\");undef$newFileName}if (defined$testName){my$err;$err=\"You shouldn't write FileName or Directory with TestFile\" if defined$newFileName or defined$newDir;$err=\"The -o option shouldn't be used with TestFile\" if defined$outfile;$err and Warn(\"Error: $err - $infile\\n\"),EFile($infile),++$countBadWr,return 0;$testName=FilenameSPrintf($testName,$orig);$testName=Image::ExifTool::GetNewFileName($file,$testName)if$file ne ''}if (defined$newFileName or defined$newDir or ($doSetFileName and defined$outfile)){if ($newFileName){$newFileName=FilenameSPrintf($newFileName,$orig);if (defined$outfile){$outfile=Image::ExifTool::GetNewFileName($file,$outfile)if$file ne '';$outfile=Image::ExifTool::GetNewFileName($outfile,$newFileName)}elsif ($file ne ''){$outfile=Image::ExifTool::GetNewFileName($file,$newFileName)}}if ($newDir){$newDir=FilenameSPrintf($newDir,$orig);$outfile=Image::ExifTool::GetNewFileName(defined$outfile ? $outfile : $file,$newDir)}$outfile=NextUnusedFilename($outfile,$infile);if ($et->Exists($outfile,1)){if ($infile eq $outfile){undef$outfile}elsif ($et->IsSameFile($infile,$outfile)){$sameFile=$outfile}else {Warn \"Error: '${outfile}' already exists - $infile\\n\";EFile($infile);++$countBadWr;return 0}}}if (defined$outfile){defined$verbose and print$vout \"'${infile}' --> '${outfile}'\\n\";CreateDirectory($outfile);$tmpFile=$outfile if defined$outOpt}unless (defined$tmpFile){my ($numSet,$numPseudo)=$et->CountNewValues();if ($numSet!=$numPseudo and $et->IsDirectory($file)){print$vout \"Can't write real tags to a directory - $infile\\n\" if defined$verbose;$numSet=$numPseudo}if ($et->Exists($file)){unless ($numSet){print$vout \"Nothing changed in $file\\n\" if defined$verbose;EFile($infile,1);++$countSameWr;return 1}}elsif (CanCreate($file)){if ($numSet==$numPseudo){Warn(\"Error: Nothing to write - $file\\n\");EFile($infile,1);++$countBadWr;return 0}unless (defined$outfile){$outfile=$file;$file=''}}else {Warn \"Error: File not found - $file\\n\";EFile($infile);FileNotFound($file);++$countBadWr;return 0}if ($numSet==$numPseudo){my ($r0,$r1,$r2,$r3)=(0,0,0,0);if (defined$outfile){$r0=$et->SetFileName($file,$outfile);$file=$$et{NewName}if$r0 > 0}unless ($r0 < 0){$r1=$et->SetFileModifyDate($file,undef,'FileCreateDate');$r2=$et->SetFileModifyDate($file);$r3=$et->SetSystemTags($file)}if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0){EFile($infile,3);++$countGoodWr}elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0){EFile($infile);++$countBadWr;return 0}else {EFile($infile,1);++$countSameWr}if (defined$hardLink or defined$symLink or defined$testName){DoHardLink($et,$file,$hardLink,$symLink,$testName)}return 1}if (not defined$outfile or defined$sameFile){$outfile=\"${file}_exiftool_tmp\";if ($et->Exists($outfile)){Warn(\"Error: Temporary file already exists: $outfile\\n\");EFile($infile);++$countBadWr;return 0}$isTemporary=1}$tmpFile=$outfile}}my$success=$et->WriteInfo(Infile($file),$outfile,$outType);if ($success and (defined$hardLink or defined$symLink or defined$testName)){my$src=defined$outfile ? $outfile : $file;DoHardLink($et,$src,$hardLink,$symLink,$testName)}my ($aTime,$mTime,$cTime,$doPreserve);$doPreserve=$preserveTime unless$file eq '';if ($doPreserve and $success){($aTime,$mTime,$cTime)=$et->GetFileTime($file);undef$cTime if $$et{WRITTEN}{FileCreateDate};if ($$et{WRITTEN}{FileModifyDate}or $doPreserve==2){if (defined$cTime){undef$aTime;undef$mTime}else {undef$doPreserve}}}if ($success==1){if (defined$tmpFile){if ($et->Exists($file)){$et->SetFileTime($tmpFile,$aTime,$mTime,$cTime)if$doPreserve;if ($isTemporary){$et->CopyFileAttrs($file,$outfile);my$original=\"${file}_original\";if (not $overwriteOrig and not $et->Exists($original)){if (not $et->Rename($file,$original)or $et->Exists($file)){Error \"Error renaming $file\\n\";return 0}}my$dstFile=defined$sameFile ? $sameFile : $file;if ($overwriteOrig > 1){my ($err,$buff);my$newFile=$tmpFile;$et->Open(\\*NEW_FILE,$newFile)or Error(\"Error opening $newFile\\n\"),return 0;binmode(NEW_FILE);$critical=1;undef$tmpFile;if ($et->Open(\\*ORIG_FILE,$file,'+<')){binmode(ORIG_FILE);while (read(NEW_FILE,$buff,65536)){print ORIG_FILE$buff or $err=1}close(NEW_FILE);eval {truncate(ORIG_FILE,tell(ORIG_FILE))}or $err=1;close(ORIG_FILE)or $err=1;if ($err){Warn \"Couldn't overwrite in place - $file\\n\";unless ($et->Rename($newFile,$file)or ($et->Unlink($file)and $et->Rename($newFile,$file))){Error(\"Error renaming $newFile to $file\\n\");undef$critical;SigInt()if$interrupted;return 0}}else {$et->SetFileModifyDate($file,$cTime,'FileCreateDate',1);$et->SetFileModifyDate($file,$mTime,'FileModifyDate',1);$et->Unlink($newFile);if ($doPreserve){$et->SetFileTime($file,$aTime,$mTime,$cTime);$preserveTime{$file}=[$aTime,$mTime,$cTime ]}}EFile($infile,3);++$countGoodWr}else {close(NEW_FILE);Warn \"Error opening $file for writing\\n\";EFile($infile);$et->Unlink($newFile);++$countBadWr}undef$critical;SigInt()if$interrupted}elsif ($et->Rename($tmpFile,$dstFile)){EFile($infile,3);++$countGoodWr}else {my$newFile=$tmpFile;undef$tmpFile;if (not $et->Unlink($file)){Warn \"Error renaming temporary file to $dstFile\\n\";EFile($infile);$et->Unlink($newFile);++$countBadWr}elsif (not $et->Rename($newFile,$dstFile)){Warn \"Error renaming temporary file to $dstFile\\n\";EFile($infile);++$countBadWr}else {EFile($infile,3);++$countGoodWr}}}elsif ($overwriteOrig){EFile($infile,3);$et->Unlink($file)or Warn \"Error erasing original $file\\n\";++$countGoodWr}else {EFile($infile,4);++$countGoodCr}}else {EFile($infile,4);++$countGoodCr}}else {EFile($infile,3);++$countGoodWr}}elsif ($success){EFile($infile,1);if ($isTemporary){$et->Unlink($tmpFile);++$countSameWr}else {$et->SetFileTime($outfile,$aTime,$mTime,$cTime)if$doPreserve;if ($overwriteOrig){$et->Unlink($file)or Warn \"Error erasing original $file\\n\"}++$countCopyWr}print$vout \"Nothing changed in $file\\n\" if defined$verbose}else {EFile($infile);$et->Unlink($tmpFile)if defined$tmpFile;++$countBadWr}undef$tmpFile;return$success}sub DoHardLink($$$$$) {my ($et,$src,$hardLink,$symLink,$testName)=@_;if (defined$hardLink){$hardLink=NextUnusedFilename($hardLink);if ($et->SetFileName($src,$hardLink,'Link')> 0){$countLink{Hard}=($countLink{Hard}|| 0)+ 1}else {$countLink{BadHard}=($countLink{BadHard}|| 0)+ 1}}if (defined$symLink){$symLink=NextUnusedFilename($symLink);if ($et->SetFileName($src,$symLink,'SymLink')> 0){$countLink{Sym}=($countLink{Sym}|| 0)+ 1}else {$countLink{BadSym}=($countLink{BadSym}|| 0)+ 1}}if (defined$testName){$testName=NextUnusedFilename($testName,$src);if ($usedFileName{$testName}){$et->Warn(\"File '${testName}' would exist\")}elsif ($et->SetFileName($src,$testName,'Test',$usedFileName{$testName})==1){$usedFileName{$testName}=1;$usedFileName{$src}=0}}}sub CleanXML($) {my$strPt=shift;$$strPt =~ tr/\\0-\\x08\\x0b\\x0c\\x0e-\\x1f/./;Image::ExifTool::XMP::FixUTF8($strPt)unless$altEnc;$$strPt=Image::ExifTool::XMP::EscapeXML($$strPt)}sub EncodeXML($) {my$strPt=shift;if ($$strPt =~ /[\\0-\\x08\\x0b\\x0c\\x0e-\\x1f]/ or (not $altEnc and Image::ExifTool::IsUTF8($strPt)< 0)){$$strPt=Image::ExifTool::XMP::EncodeBase64($$strPt);return 'http://www.w3.org/2001/XMLSchema#base64Binary'}elsif ($escapeHTML){$$strPt=Image::ExifTool::HTML::EscapeHTML($$strPt,$altEnc)}else {$$strPt=Image::ExifTool::XMP::EscapeXML($$strPt)}return ''}sub FormatXML($$$) {local $_;my ($val,$ind,$grp)=@_;my$gt='>';if (ref$val eq 'ARRAY'){my$val2=\"\\n$ind <rdf:Bag>\";for (@$val){$val2 .= \"\\n$ind  <rdf:li\" .FormatXML($_,\"$ind  \",$grp).\"</rdf:li>\"}$val=\"$val2\\n$ind </rdf:Bag>\\n$ind\"}elsif (ref$val eq 'HASH'){$gt=\" rdf:parseType='Resource'>\";my$val2='';for (OrderedKeys($val)){my ($ns,$tg)=($grp,$_);if (/^(.*?):(.*)/){if ($grp eq 'JSON'){$tg =~ tr/:/_/}else {($ns,$tg)=($1,$2)}}my$name;for$name ($ns,$tg){$name =~ tr/-_A-Za-z0-9.//dc;$name='_' .$name if$name !~ /^[_A-Za-z]/}my$tok=$ns .':' .$tg;$val2 .= \"\\n$ind <$tok\" .FormatXML($$val{$_},\"$ind \",$grp).\"</$tok>\"}$val=\"$val2\\n$ind\"}else {my$enc=EncodeXML(\\$val);$gt=\" rdf:datatype='${enc}'>\\n\" if$enc}return$gt .$val}sub EscapeJSON($;$) {my ($str,$quote)=@_;unless ($quote){return lc($str)if$str =~ /^(true|false)$/i and $json < 2;return$str if$str =~ /^-?(\\d|[1-9]\\d{1,14})(\\.\\d{1,16})?(e[-+]?\\d{1,3})?$/i}if ($json < 2 and defined$binaryOutput and Image::ExifTool::IsUTF8(\\$str)< 0){return '\"base64:' .Image::ExifTool::XMP::EncodeBase64($str,1).'\"'}$str =~ s/([\"\\t\\n\\r\\\\])/\\\\$jsonChar{$1}/sg;if ($json < 2){$str =~ tr/\\0//d;$str =~ s/([\\0-\\x1f\\x7f])/sprintf(\"\\\\u%.4X\",ord $1)/sge;Image::ExifTool::XMP::FixUTF8(\\$str)unless$altEnc}else {$str =~ s/\\0+$// unless$isBinary;$str =~ s/\\$/\\\\\\$/sg;$str =~ s/([\\0-\\x1f\\x7f])/sprintf(\"\\\\x%.2X\",ord $1)/sge}return '\"' .$str .'\"'}sub FormatJSON($$$;$) {local $_;my ($fp,$val,$ind,$quote)=@_;my$comma;if (not ref$val){print$fp EscapeJSON($val,$quote)}elsif (ref$val eq 'ARRAY'){if ($joinLists and not ref $$val[0]){print$fp EscapeJSON(join($listSep,@$val),$quote)}else {my ($bra,$ket)=$json==1 ? ('[',']'): ('Array(',')');print$fp $bra;for (@$val){print$fp ',' if$comma;FormatJSON($fp,$_,$ind,$quote);$comma=1,}print$fp $ket,}}elsif (ref$val eq 'HASH'){my ($bra,$ket,$sep)=$json==1 ? ('{','}',':'): ('Array(',')',' =>');print$fp $bra;for (OrderedKeys($val)){print$fp ',' if$comma;my$key=EscapeJSON($_,1);print$fp qq(\\n$ind  $key$sep );if ($showTagID and $_ eq 'id' and $showTagID eq 'H' and $$val{$_}=~ /^\\d+\\.\\d+$/){print$fp qq{\"$$val{$_}\"}}else {FormatJSON($fp,$$val{$_},\"$ind  \",$quote)}$comma=1,}print$fp \"\\n$ind$ket\",}else {print$fp '\"<err>\"'}}sub FormatCSV($) {my$val=shift;if ($setCharset and ($val =~ /[^\\x09\\x0a\\x0d\\x20-\\x7e\\x80-\\xff]/ or ($setCharset eq 'UTF8' and Image::ExifTool::IsUTF8(\\$val)< 0))){$val='base64:' .Image::ExifTool::XMP::EncodeBase64($val,1)}$val=qq{\"$val\"} if$val =~ s/\"/\"\"/g or $val =~ /(^\\s+|\\s+$)/ or $val =~ /[\\n\\r]|\\Q$csvDelim/;return$val}sub PrintCSV(;$) {my$fp=shift || \\*STDOUT;my ($file,$lcTag,@tags);@csvTags or @csvTags=sort keys%csvTags;for$lcTag (@csvTags){push@tags,FormatCSV($csvTags{$lcTag})if$csvTags{$lcTag}}print$fp join($csvDelim,'SourceFile',@tags),\"\\n\";my$empty=defined($forcePrint)? $forcePrint : '';for$file (@csvFiles){my@vals=(FormatCSV($file));my$csvInfo=$database{$file};for$lcTag (@csvTags){next unless$csvTags{$lcTag};my$val=$$csvInfo{$lcTag};defined$val or push(@vals,$empty),next;push@vals,FormatCSV($val)}print$fp join($csvDelim,@vals),\"\\n\"}}sub AddGroups($$$$) {my ($val,$grp,$groupHash,$groupList)=@_;my ($key,$val2);if (ref$val eq 'HASH'){for$key (sort keys %$val){if ($key =~ /^(.*?):/ and not $$groupHash{$1}and $grp ne 'JSON'){$$groupHash{$1}=$grp;push @$groupList,$1}AddGroups($$val{$key},$grp,$groupHash,$groupList)if ref $$val{$key}}}elsif (ref$val eq 'ARRAY'){for$val2 (@$val){AddGroups($val2,$grp,$groupHash,$groupList)if ref$val2}}}sub ConvertBinary($) {my$obj=shift;my ($key,$val);if (ref$obj eq 'HASH'){for$key (keys %$obj){next unless ref $$obj{$key};$$obj{$key}=ConvertBinary($$obj{$key});return undef unless defined $$obj{$key}}}elsif (ref$obj eq 'ARRAY'){for$val (@$obj){next unless ref$val;$val=ConvertBinary($val);return undef unless defined$val}}elsif (ref$obj eq 'SCALAR'){return undef if$noBinary;if (defined$binaryOutput){$obj=$$obj;if ($json==1 and ($obj =~ /[^\\x09\\x0a\\x0d\\x20-\\x7e\\x80-\\xf7]/ or Image::ExifTool::IsUTF8(\\$obj)< 0)){$obj='base64:' .Image::ExifTool::XMP::EncodeBase64($obj,1)}}else {my$bOpt=$html ? '' : ', use -b option to extract';if ($$obj =~ /^Binary data \\d+ bytes$/){$obj=\"($$obj$bOpt)\"}else {$obj='(Binary data ' .length($$obj).\" bytes$bOpt)\"}}}return$obj}sub IsEqual($$) {my ($a,$b)=@_;return 1 if$a eq $b or ref$a eq 'SCALAR';if (ref$a eq 'HASH' and ref$b eq 'HASH'){return 0 if scalar(keys %$a)!=scalar(keys %$b);my$key;for$key (keys %$a){return 0 unless IsEqual($$a{$key},$$b{$key})}}else {return 0 if ref$a ne 'ARRAY' or ref$b ne 'ARRAY' or @$a!=@$b;my$i;for ($i=0;$i<scalar(@$a);++$i){return 0 unless IsEqual($$a[$i],$$b[$i])}}return 1}sub Printable($) {my$val=shift;if (ref$val){if ($structOpt){require Image::ExifTool::XMP;$val=Image::ExifTool::XMP::SerializeStruct($mt,$val)}elsif (ref$val eq 'ARRAY'){$val=join($listSep,@$val)}elsif (ref$val eq 'SCALAR'){$val='(Binary data '.length($$val).' bytes)'}}if ($escapeC){$val =~ s/([\\0-\\x1f\\\\\\x7f])/$escC{$1} || sprintf('\\x%.2x', ord $1)/eg}else {$val =~ tr/\\x01-\\x1f\\x7f/./;$val =~ s/\\x00//g;$val =~ s/\\s+$//}return$val}sub LengthUTF8($) {my$str=shift;return length$str unless$fixLen;local$SIG{'__WARN__'}=sub {};if (not $$mt{OPTIONS}{EncodeHangs}and eval {require Encode}){$str=Encode::decode_utf8($str)}else {$str=pack('U0C*',unpack 'C*',$str)}my$len;if ($fixLen==1){$len=length$str}else {my$gcstr=eval {Unicode::GCString->new($str)};if ($gcstr){$len=$gcstr->columns}else {$len=length$str;delete$SIG{'__WARN__'};Warning($mt,'Unicode::GCString problem.  Columns may be misaligned');$fixLen=1}}return$len}sub AddSetTagsFile($;$) {my ($setFile,$opts)=@_;if ($setTags{$setFile}){$setTagsList{$setFile}or $setTagsList{$setFile}=[];push @{$setTagsList{$setFile}},$setTags{$setFile}}$setTags{$setFile}=[];push@newValues,{SaveCount=>++$saveCount },\"TagsFromFile=$setFile\";$opts or $opts={};$$opts{ProtectSaved}=$saveCount;push @{$setTags{$setFile}},$opts}sub Infile($;$) {my ($file,$bufferStdin)=@_;if ($file eq '-' and ($bufferStdin or $rafStdin)){if ($rafStdin){$rafStdin->Seek(0)}elsif (open RAF_STDIN,'-'){$rafStdin=File::RandomAccess->new(\\*RAF_STDIN);$rafStdin->BinMode()}return$rafStdin if$rafStdin}return$file}sub Warning($$) {my ($et,$str)=@_;my$noWarn=$et->Options('NoWarning');if (not defined$noWarn or not eval {$str =~ /$noWarn/}){Warn \"Warning: $str\\n\"}}sub DoSetFromFile($$$) {local $_;my ($et,$file,$setTags)=@_;$verbose and print$vout \"Setting new values from $file\\n\";my$info=$et->SetNewValuesFromFile(Infile($file,1),@$setTags);my$numSet=scalar(keys %$info);if ($$info{Error}){my@warns=grep /^(Error|Warning)\\b/,keys %$info;$numSet -= scalar(@warns);my$err=$$info{Error};delete $$info{$_}foreach@warns;my$noWarn=$et->Options('NoWarning');$$info{Warning}=$err unless defined$noWarn and eval {$err =~ /$noWarn/}}elsif ($$info{Warning}){my$warns=1;++$warns while $$info{\"Warning ($warns)\"};$numSet -= $warns}PrintErrors($et,$info,$file)and EFile($file),++$countBadWr,return 0;Warning($et,\"No writable tags set from $file\")unless$numSet;return 1}sub CleanFilename($) {$_[0]=~ tr/\\\\/\\// if Image::ExifTool::IsPC()}sub HasWildcards($) {my$path=shift;return 0 if $^O eq 'MSWin32' and $path =~ m{^[\\\\/]{2}\\?[\\\\/]};return$path =~ /[*?]/}sub CheckUTF8($$) {my ($file,$enc)=@_;my$isUTF8=0;if ($file =~ /[\\x80-\\xff]/){$isUTF8=Image::ExifTool::IsUTF8(\\$file);if ($isUTF8 < 0){if ($enc){Warn(\"Invalid filename encoding for $file\\n\")}elsif (not defined$enc){WarnOnce(qq{FileName encoding not specified.  Use \"-charset FileName=CHARSET\"\\n})}}}return$isUTF8}sub SetWindowTitle($) {my$title=shift;if ($curTitle ne $title){$curTitle=$title;if ($^O eq 'MSWin32'){$title =~ s/([&\\/\\?:|\"<>])/^$1/g;eval {system qq{title $title}}}else {printf STDERR \"\\033]0;%s\\007\",$title}}}sub ProcessFiles($;$) {my ($et,$list)=@_;my$enc=$et->Options('CharsetFileName');my$file;for$file (@files){$et->Options(CharsetFileName=>'UTF8')if$utf8FileName{$file};if (defined$progressMax){unless (defined$progressNext){$progressNext=$progressCount + $progressIncr;$progressNext -= $progressNext % $progressIncr;$progressNext=$progressMax if$progressNext > $progressMax}++$progressCount;if ($progress){if ($progressCount >= $progressNext){$progStr=\" [$progressCount/$progressMax]\"}else {undef$progStr}}}if ($et->IsDirectory($file)and not $listDir){$multiFile=$validFile=1;ScanDir($et,$file,$list)}elsif ($filterFlag and not AcceptFile($file)){if ($et->Exists($file)){$filtered=1;Progress($vout,\"-------- $file (wrong extension)\")if$verbose}else {Error \"Error: File not found - $file\\n\";FileNotFound($file)}}else {$validFile=1;if ($list){push(@$list,$file)}else {if (%endDir){my ($d,$f)=Image::ExifTool::SplitFileName($file);next if$endDir{$d}}GetImageInfo($et,$file);$end and Warn(\"End called - $file\\n\");if ($endDir){Warn(\"EndDir called - $file\\n\");my ($d,$f)=Image::ExifTool::SplitFileName($file);$endDir{$d}=1;undef$endDir}}}$et->Options(CharsetFileName=>$enc)if$utf8FileName{$file};last if$end}}sub ScanDir($$;$) {local $_;my ($et,$dir,$list)=@_;my (@fileList,$done,$file,$utf8Name,$winSurrogate,$endThisDir);my$enc=$et->Options('CharsetFileName');if ($enc){unless ($enc eq 'UTF8'){$dir=$et->Decode($dir,$enc,undef,'UTF8');$et->Options(CharsetFileName=>'UTF8')}$utf8Name=1}return if$ignore{$dir};if ($^O eq 'MSWin32' and not HasWildcards($dir)){undef$evalWarning;local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};;if (CheckUTF8($dir,$enc)>= 0){if (eval {require Win32::FindFile}){eval {@fileList=Win32::FindFile::ReadDir($dir);$_=$_->cFileName foreach@fileList};$@ and $evalWarning=$@;if ($evalWarning){chomp$evalWarning;$evalWarning =~ s/ at .*//s;Warning($et,\"[Win32::FindFile] $evalWarning - $dir\");$winSurrogate=1 if$evalWarning =~ /surrogate/}else {$et->Options(CharsetFileName=>'UTF8');$utf8Name=1;$done=1}}else {$done=0}}}unless ($done){unless (opendir(DIR_HANDLE,$dir)){Warn(\"Error opening directory $dir\\n\");return}@fileList=readdir(DIR_HANDLE);closedir(DIR_HANDLE);if (defined$done){for$file ($dir,@fileList){next unless$file =~ /[\\?\\x80-\\xff]/;WarnOnce(\"Install Win32::FindFile to support Windows Unicode file names in directories\\n\");last}}}$dir =~ /\\/$/ or $dir .= '/';for$file (@fileList){next if$file eq '.' or $file eq '..';my$path=\"$dir$file\";if ($et->IsDirectory($path)){next unless$recurse;next if$file =~ /^\\./ and $recurse==1;next if$ignore{$file}or ($ignore{SYMLINKS}and -l $path);ScanDir($et,$path,$list);last if$end;next}next if$endThisDir;next if$ignoreHidden and $file =~ /^\\./;my$accepted;if ($filterFlag){$accepted=AcceptFile($file)or next;$accepted &= 0x01}unless ($accepted){if ($scanWritable){if ($scanWritable eq '1'){next unless CanWrite($file)}else {my$type=GetFileType($file);next unless defined$type and $type eq $scanWritable}}elsif (not GetFileType($file)){next unless$doUnzip;next unless$file =~ /\\.(gz|bz2)$/i}}if ($winSurrogate and $isWriting and (not $overwriteOrig or $overwriteOrig!=2)and not $doSetFileName and $file =~ /~/){Warn(\"Not writing $path\\n\");WarnOnce(\"Use -overwrite_original_in_place to write files with Unicode surrogate characters\\n\");EFile($file);++$countBad;next}$utf8FileName{$path}=1 if$utf8Name;if ($list){push(@$list,$path)}else {GetImageInfo($et,$path);if ($end){Warn(\"End called - $file\\n\");last}if ($endDir){$path =~ s(/$)();Warn(\"EndDir called - $path\\n\");$endDir{$path}=1;$endThisDir=1;undef$endDir}}}++$countDir;$et->Options(CharsetFileName=>$enc)}sub FindFileWindows($$) {my ($et,$wildfile)=@_;my$enc=$et->Options('CharsetFileName');$wildfile=$et->Decode($wildfile,$enc,undef,'UTF8')if$enc and $enc ne 'UTF8';$wildfile =~ tr/\\\\/\\//;my ($dir,$wildname)=($wildfile =~ m{(.*[:/])(.*)})? ($1,$2): ('',$wildfile);if (HasWildcards($dir)){Warn \"Wildcards don't work in the directory specification\\n\";return ()}CheckUTF8($wildfile,$enc)>= 0 or return ();undef$evalWarning;local$SIG{'__WARN__'}=sub {$evalWarning=$_[0]};my@files;eval {my@names=Win32::FindFile::FindFile($wildfile)or return;@names=sort {uc($a)cmp uc($b)}@names;my ($rname,$nm);($rname=quotemeta$wildname)=~ s/\\\\\\?/./g;$rname =~ s/\\\\\\*/.*/g;for$nm (@names){$nm=$nm->cFileName;next unless$nm =~ /^$rname$/i;next if$nm eq '.' or $nm eq '..';my$file=\"$dir$nm\";push@files,$file;$utf8FileName{$file}=1}};$@ and $evalWarning=$@;if ($evalWarning){chomp$evalWarning;$evalWarning =~ s/ at .*//s;Warn \"Error: [Win32::FindFile] $evalWarning - $wildfile\\n\";undef@files;EFile($wildfile);++$countBad}return@files}sub FileNotFound($) {my$file=shift;if ($file =~ /^(DIR|FILE)$/){my$type={DIR=>'directory',FILE=>'file' }->{$file};Warn qq{You were meant to enter any valid $type name, not \"$file\" literally.\\n}}}sub PreserveTime() {local $_;$mt->SetFileTime($_,@{$preserveTime{$_}})foreach keys%preserveTime;undef%preserveTime}sub AbsPath($) {my$file=shift;my$path;if (defined$file){return undef if$file eq '*';if ($^O eq 'MSWin32' and $mt->Options('WindowsLongPath')){$path=$mt->WindowsLongPath($file)}elsif (eval {require Cwd}){local$SIG{'__WARN__'}=sub {};$path=eval {Cwd::abs_path($file)}}$path =~ tr/\\\\/\\// if $^O eq 'MSWin32' and defined$path}return$path}sub MyConvertFileName($$) {my ($et,$file)=@_;my$enc=$et->Options('CharsetFileName');$et->Options(CharsetFileName=>'UTF8')if$utf8FileName{$file};my$convFile=$et->ConvertFileName($file);$et->Options(CharsetFileName=>$enc)if$utf8FileName{$file};return$convFile}sub AddPrintFormat($) {my$expr=shift;my$type;if ($expr =~ /^#/){$expr =~ s/^#\\[(HEAD|SECT|IF|BODY|ENDS|TAIL)\\]// or return;$type=$1}else {$type='BODY'}$printFmt{$type}or $printFmt{$type}=[];push @{$printFmt{$type}},$expr;push@requestTags,$expr =~ /\\$\\{?((?:[-_0-9A-Z]+:)*[-_0-9A-Z?*]+)/ig;$printFmt{SetTags}=1 if$expr =~ /\\bSetTags\\b/}sub SuggestedExtension($$$) {my ($et,$valPt,$tag)=@_;my$ext;if (not $binaryOutput){$ext='txt'}elsif ($$valPt =~ /^\\xff\\xd8\\xff/){$ext='jpg'}elsif ($$valPt =~ /^(\\0\\0\\0\\x0cjP(  |\\x1a\\x1a)\\x0d\\x0a\\x87\\x0a|\\xff\\x4f\\xff\\x51\\0)/){$ext='jp2'}elsif ($$valPt =~ /^(\\x89P|\\x8aM|\\x8bJ)NG\\r\\n\\x1a\\n/){$ext='png'}elsif ($$valPt =~ /^GIF8[79]a/){$ext='gif'}elsif ($$valPt =~ /^<\\?xpacket/ or $tag eq 'XMP'){$ext='xmp'}elsif ($$valPt =~ /^<\\?xml/ or $tag eq 'XML'){$ext='xml'}elsif ($$valPt =~ /^RIFF....WAVE/s){$ext='wav'}elsif ($tag eq 'OriginalRawImage' and defined($ext=$et->GetValue('OriginalRawFileName'))){$ext =~ s/^.*\\.//s;$ext=$ext ? lc($ext): 'raw'}elsif ($tag eq 'EXIF'){$ext='exif'}elsif ($tag eq 'ICC_Profile'){$ext='icc'}elsif ($$valPt =~ /^(MM\\0\\x2a|II\\x2a\\0)/){$ext='tiff'}elsif ($$valPt =~ /^.{4}ftyp(3gp|mp4|f4v|qt  )/s){my%movType=('qt  '=>'mov');$ext=$movType{$1}|| $1}elsif ($$valPt !~ /^.{0,4096}\\0/s){$ext='txt'}elsif ($$valPt =~ /^BM.{15}\\0/s){$ext='bmp'}elsif ($$valPt =~ /^CANON OPTIONAL DATA\\0/){$ext='vrd'}elsif ($$valPt =~ /^IIII\\x04\\0\\x04\\0/){$ext='dr4'}elsif ($$valPt =~ /^(.{10}|.{522})(\\x11\\x01|\\x00\\x11)/s){$ext='pict'}elsif ($$valPt =~ /^\\xff\\x0a|\\0\\0\\0\\x0cJXL \\x0d\\x0a......ftypjxl/s){$ext='jxl'}elsif ($$valPt =~ /^.{4}jumb\\0.{3}jumdc2pa/s){$ext='c2pa'}elsif ($tag eq 'JUMBF'){$ext='jumbf'}else {$ext='dat'}return$ext}sub LoadPrintFormat($;$) {my ($arg,$noNL)=@_;if (not defined$arg){Error \"Must specify file or expression for -p option\\n\"}elsif ($arg !~ /\\n/ and -f $arg and $mt->Open(\\*FMT_FILE,$arg)){for (<FMT_FILE>){AddPrintFormat($_)}close(FMT_FILE)}else {$arg .= \"\\n\" unless$noNL;AddPrintFormat($arg)}}sub FilenameSPrintf($;$@) {my ($fmt,$file,@extra)=@_;local $_;return$fmt unless$fmt =~ /%[-+]?\\d*[.:]?\\d*[lu]?[dDfFeEtgso]/;return undef unless defined$file;CleanFilename($file);my%part;@part{qw(d f E)}=($file =~ /^(.*?)([^\\/]*?)(\\.[^.\\/]*)?$/);defined$part{f}or Warn(\"Error: Bad pattern match for file $file\\n\"),return undef;if ($part{E}){$part{e}=substr($part{E},1)}else {@part{qw(e E)}=('','')}$part{F}=$part{f}.$part{E};($part{D}=$part{d})=~ s{/+$}{};@part{qw(t g s o)}=@extra;my ($filename,$pos)=('',0);while ($fmt =~ /(%([-+]?)(\\d*)([.:]?)(\\d*)([lu]?)([dDfFeEtgso]))/g){$filename .= substr($fmt,$pos,pos($fmt)- $pos - length($1));$pos=pos($fmt);my ($sign,$wid,$dot,$skip,$mod,$code)=($2,$3,$4,$5 || 0,$6,$7);my (@path,$part,$len,$groups);if (lc$code eq 'd' and $dot and $dot eq ':'){@path=split '/',$part{$code};$len=scalar@path}else {if ($code eq 'g'){$groups=$part{g}|| []unless defined$groups;$fmt =~ /\\G(\\d?)/g;$part{g}=$$groups[$1 || 0];$pos=pos($fmt)}$part{$code}='' unless defined$part{$code};$len=length$part{$code}}next unless$skip < $len;$wid=$len - $skip if$wid eq '' or $wid + $skip > $len;$skip=$len - $wid - $skip if$sign eq '-';if (@path){$part=join('/',@path[$skip..($skip+$wid-1)]);$part .= '/' unless$code eq 'D'}else {$part=substr($part{$code},$skip,$wid)}$part=($mod eq 'u')? uc($part): lc($part)if$mod;$filename .= $part}$filename .= substr($fmt,$pos);$filename =~ s{(?!^)//}{/}g;return$filename}sub Num2Alpha($) {my$num=shift;my$alpha=chr(97 + ($num % 26));while ($num >= 26){$num=int($num / 26)- 1;$alpha=chr(97 + ($num % 26)).$alpha}return$alpha}sub NextUnusedFilename($;$) {my ($fmt,$okfile)=@_;return$fmt unless$fmt =~ /%[-+]?\\d*[.:]?\\d*[lun]?[cC]/;my%sep=('-'=>'-','+'=>'_');my ($copy,$alpha)=(0,'a');my$lastFile;for (;;){my ($filename,$pos)=('',0);while ($fmt =~ /(%([-+]?)(\\d*)([.:]?)(\\d*)([lun]?)([cC]))/g){$filename .= substr($fmt,$pos,pos($fmt)- $pos - length($1));$pos=pos($fmt);my ($sign,$wid,$dec,$wid2,$mod,$tok)=($2,$3 || 0,$4,$5 || 0,$6,$7);my$seq;if ($tok eq 'C'){$sign eq '-' ? ++$seqFileDir : ++$seqFileNum if$copy and $dec eq ':';$seq=$wid + ($sign eq '-' ? $seqFileDir : $seqFileNum)- 1;$wid=$wid2}else {next unless$dec or $copy;$wid=$wid2 if$wid < $wid2;$filename .= $sep{$sign}if$sign}if ($mod and $mod ne 'n'){my$a=$tok eq 'C' ? Num2Alpha($seq): $alpha;my$str=($wid and $wid > length$a)? 'a' x ($wid - length($a)): '';$str .= $a;$str=uc$str if$mod eq 'u';$filename .= $str}else {my$c=$tok eq 'C' ? $seq : $copy;my$num=$c + ($mod ? 1 : 0);$filename .= $wid ? sprintf(\"%.${wid}d\",$num): $num}}$filename .= substr($fmt,$pos);return$filename unless ($mt->Exists($filename,1)and not defined$usedFileName{$filename})or $usedFileName{$filename};if (defined$okfile){return$filename if$filename eq $okfile;my ($fn,$ok)=(AbsPath($filename),AbsPath($okfile));return$okfile if defined$fn and defined$ok and $fn eq $ok}return$filename if defined$lastFile and $lastFile eq $filename;$lastFile=$filename;++$copy;++$alpha}}sub CreateDirectory($) {my$file=shift;my$err=$mt->CreateDirectory($file);if (defined$err){$err and Error(\"$err\\n\"),return 0;if ($verbose){my$dir;($dir=$file)=~ s(/[^/]*$)();print$vout \"Created directory $dir\\n\"}++$countNewDir;return 1}return 0}sub OpenOutputFile($;@) {my ($file,@args)=@_;my ($fp,$outfile,$append);if ($textOut){$outfile=$file;CleanFilename($outfile);if ($textOut =~ /%[-+]?\\d*[.:]?\\d*[lun]?[dDfFeEtgsocC]/ or defined$tagOut){$outfile=FilenameSPrintf($textOut,$file,@args);return ()unless defined$outfile;$outfile=NextUnusedFilename($outfile);CreateDirectory($outfile)}else {$outfile =~ s/\\.[^.\\/]*$//;$outfile .= $textOut}my$mode='>';if ($mt->Exists($outfile,1)){unless ($textOverwrite){Warn \"Output file $outfile already exists for $file\\n\";return ()}if ($textOverwrite==2 or ($textOverwrite==3 and $created{$outfile})){$mode='>>';$append=1}}unless ($mt->Open(\\*OUTFILE,$outfile,$mode)){my$what=$mode eq '>' ? 'creating' : 'appending to';Error(\"Error $what $outfile\\n\");return ()}binmode(OUTFILE)if$binaryOutput;$fp=\\*OUTFILE}else {$fp=\\*STDOUT}return($fp,$outfile,$append)}sub AcceptFile($) {my$file=shift;my$ext=($file =~ /^.*\\.(.+)$/s)? uc($1): '';return$filterExt{$ext}if defined$filterExt{$ext};return$filterExt{'*'}if defined$filterExt{'*'};return 0 if$filterFlag & 0x02;return 2}sub SlurpFile($$) {my ($file,$buffPt)=@_;$mt->Open(\\*INFILE,$file)or Warn(\"Error opening file $file\\n\"),return 0;binmode(INFILE);undef $$buffPt;my$bsize=1024 * 1024;my$num=read(INFILE,$$buffPt,$bsize);unless (defined$num){close(INFILE);Warn(\"Error reading $file\\n\");return 0}my$bmax=64 * $bsize;while ($num==$bsize){$bsize *= 2 if$bsize < $bmax;my$buff;$num=read(INFILE,$buff,$bsize);last unless$num;$$buffPt .= $buff}close(INFILE);return 1}sub FilterArgfileLine($) {my$arg=shift;if ($arg =~ /^#/){return undef unless$arg =~ s/^#\\[CSTR\\]//;$arg =~ s/[\\x0d\\x0a]+$//s;$arg =~ s{\\\\(.)|([\"\\$\\@]|\\\\$)}{'\\\\'.($2 || $1)}sge;my%esc=(a=>\"\\a\",b=>\"\\b\",f=>\"\\f\",n=>\"\\n\",r=>\"\\r\",t=>\"\\t\",'\"'=>'\"','\\\\'=>'\\\\');$arg =~ s/\\\\(.)/$esc{$1}||'\\\\'.$1/egs}else {$arg =~ s/^\\s+//;$arg =~ s/[\\x0d\\x0a]+$//s;$arg =~ s/^(-[-_0-9A-Z:]+#?)\\s*([-+<]?=) ?/$1$2/i;return undef if$arg eq ''}return$arg}sub ReadStayOpen($) {my$args=shift;my (@newArgs,$processArgs,$result,$optArgs);my$lastOpt='';my$unparsed=length$stayOpenBuff;for (;;){if ($unparsed){$result=$unparsed;undef$unparsed}else {$result=sysread(STAYOPEN,$stayOpenBuff,65536,length($stayOpenBuff))}if ($result){my$pos=0;while ($stayOpenBuff =~ /\\n/g){my$len=pos($stayOpenBuff)- $pos;my$arg=substr($stayOpenBuff,$pos,$len);$pos += $len;$arg=FilterArgfileLine($arg);next unless defined$arg;push@newArgs,$arg;if ($optArgs){undef$optArgs;next unless$lastOpt eq '-stay_open' or $lastOpt eq '-@'}else {$lastOpt=lc$arg;$optArgs=$optArgs{$arg};unless (defined$optArgs){$optArgs=$optArgs{$lastOpt};$optArgs=$optArgs{\"$1#$2\"}if not defined$optArgs and $lastOpt =~ /^(.*?)\\d+(!?)$/}next unless$lastOpt =~ /^-execute\\d*$/}$processArgs=1;last}next unless$pos;$stayOpenBuff=substr($stayOpenBuff,$pos);if ($processArgs){unshift @$args,@newArgs;last}}elsif ($result==0){select(undef,undef,undef,0.01)}else {Warn \"Error reading from ARGFILE\\n\";close STAYOPEN;$stayOpen=0;last}}}sub EFile($$) {my$entry=shift;my$efile=$efile[shift || 0];if (defined$efile and length$entry and $entry ne '-'){my$err;CreateDirectory($efile);if ($mt->Open(\\*EFILE_FILE,$efile,'>>')){print EFILE_FILE$entry,\"\\n\" or Warn(\"Error writing to $efile\\n\"),$err=1;close EFILE_FILE}else {Warn(\"Error opening '${efile}' for append\\n\");$err=1}if ($err){defined $_ and $_ eq $efile and undef $_ foreach@efile}}}sub Progress($$) {my ($file,$msg)=@_;if (defined$progStr){print$file $msg,$progStr,\"\\n\";undef$progressNext if defined$progressMax}}sub PrintTagList($@) {my$msg=shift;print$msg,\":\\n\" unless$quiet;my$tag;if (($outFormat < 0 or $verbose)and $msg =~ /file extensions$/ and @_){for$tag (@_){printf(\"  %-11s %s\\n\",$tag,GetFileType($tag,1))}return}my ($len,$pad)=(0,$quiet ? '' : '  ');for$tag (@_){my$taglen=length($tag);if ($len + $taglen > 77){print \"\\n\";($len,$pad)=(0,$quiet ? '' : '  ')}print$pad,$tag;$len += $taglen + 1;$pad=' '}@_ or print$pad,'[empty list]';print \"\\n\"}sub PrintErrors($$$) {my ($et,$info,$file)=@_;my ($tag,$key);for$tag (qw(Warning Error)){next unless $$info{$tag};my@keys=($tag);push@keys,sort(grep /^$tag /,keys %$info)if$et->Options('Duplicates');for$key (@keys){Warn \"$tag: $info->{$key} - $file\\n\"}}return $$info{Error}}", "import exiftool from \"exiftool?raw\";\n\nexport default exiftool;", "function _class_call_check(instance, Constructor) {\n    if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexport { _class_call_check as _ };\n", "function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n\n        if (\"value\" in descriptor) descriptor.writable = true;\n\n        Object.defineProperty(target, descriptor.key, descriptor);\n    }\n}\nfunction _create_class(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n\n    return Constructor;\n}\nexport { _create_class as _ };\n", "function _define_property(obj, key, value) {\n    if (key in obj) {\n        Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });\n    } else obj[key] = value;\n\n    return obj;\n}\nexport { _define_property as _ };\n", "export class WASIAbi {\n    /**\n     * No error occurred. System call completed successfully.\n     */\n    static readonly WASI_ESUCCESS = 0;\n\n    /**\n     * Bad file descriptor.\n     */\n    static readonly WASI_ERRNO_BADF = 8;\n\n    /**\n     * Function not supported.\n     */\n    static readonly WASI_ENOSYS = 52;\n\n    /**\n     * The clock measuring real time. Time value zero corresponds with 1970-01-01T00:00:00Z.\n     */\n    static readonly WASI_CLOCK_REALTIME = 0;\n    /**\n     * The store-wide monotonic clock, which is defined as a clock measuring real time,\n     * whose value cannot be adjusted and which cannot have negative clock jumps.\n     * The epoch of this clock is undefined. The absolute time value of this clock therefore has no meaning.\n     */\n    static readonly WASI_CLOCK_MONOTONIC = 1;\n\n    /**\n     * The file descriptor or file refers to a directory.\n     */\n    static readonly WASI_ERRNO_ISDIR = 31;\n    /**\n     * Invalid argument.\n     */\n    static readonly WASI_ERRNO_INVAL = 28;\n    /**\n     * Not a directory or a symbolic link to a directory.\n     */\n    static readonly WASI_ERRNO_NOTDIR = 54;\n    /**\n     * No such file or directory.\n     */\n    static readonly WASI_ERRNO_NOENT = 44;\n    /**\n     * File exists.\n     */\n    static readonly WASI_ERRNO_EXIST = 20;\n    /**\n     * I/O error.\n     */\n    static readonly WASI_ERRNO_IO = 29;\n\n    /**\n     * The file descriptor or file refers to a character device inode.\n     */\n    static readonly WASI_FILETYPE_CHARACTER_DEVICE = 2;\n    /**\n     * The file descriptor or file refers to a directory inode.\n     */\n    static readonly WASI_FILETYPE_DIRECTORY = 3;\n    /**\n     * The file descriptor or file refers to a regular file inode.\n     */\n    static readonly WASI_FILETYPE_REGULAR_FILE = 4;\n\n    static readonly IMPORT_FUNCTIONS = [\n        \"args_get\",\n        \"args_sizes_get\",\n\n        \"clock_res_get\",\n        \"clock_time_get\",\n\n        \"environ_get\",\n        \"environ_sizes_get\",\n\n        \"fd_advise\",\n        \"fd_allocate\",\n        \"fd_close\",\n        \"fd_datasync\",\n        \"fd_fdstat_get\",\n        \"fd_fdstat_set_flags\",\n        \"fd_fdstat_set_rights\",\n        \"fd_filestat_get\",\n        \"fd_filestat_set_size\",\n        \"fd_filestat_set_times\",\n        \"fd_pread\",\n        \"fd_prestat_dir_name\",\n        \"fd_prestat_get\",\n        \"fd_pwrite\",\n        \"fd_read\",\n        \"fd_readdir\",\n        \"fd_renumber\",\n        \"fd_seek\",\n        \"fd_sync\",\n        \"fd_tell\",\n        \"fd_write\",\n\n        \"path_create_directory\",\n        \"path_filestat_get\",\n        \"path_filestat_set_times\",\n        \"path_link\",\n        \"path_open\",\n        \"path_readlink\",\n        \"path_remove_directory\",\n        \"path_rename\",\n        \"path_symlink\",\n        \"path_unlink_file\",\n\n        \"poll_oneoff\",\n\n        \"proc_exit\",\n        \"proc_raise\",\n\n        \"random_get\",\n\n        \"sched_yield\",\n\n        \"sock_accept\",\n        \"sock_recv\",\n        \"sock_send\",\n        \"sock_shutdown\",\n    ];\n\n    private encoder: TextEncoder;\n    private decoder: TextDecoder;\n\n    constructor() {\n        this.encoder = new TextEncoder();\n        this.decoder = new TextDecoder();\n    }\n\n    writeString(memory: DataView, value: string, offset: number): number {\n        const bytes = this.encoder.encode(value);\n        const buffer = new Uint8Array(memory.buffer, offset, bytes.length);\n        buffer.set(bytes);\n        return bytes.length;\n    }\n\n    readString(memory: DataView, ptr: number, len: number): string {\n        const buffer = new Uint8Array(memory.buffer, ptr, len);\n        return this.decoder.decode(buffer);\n    }\n\n    byteLength(value: string): number {\n        return this.encoder.encode(value).length;\n    }\n\n    private static readonly iovec_t = {\n        size: 8,\n        bufferOffset: 0,\n        lengthOffset: 4,\n    };\n\n    iovViews(memory: DataView, iovs: number, iovsLen: number): Uint8Array[] {\n        const iovsBuffers: Uint8Array[] = [];\n        let iovsOffset = iovs;\n\n        for (let i = 0; i < iovsLen; i++) {\n            const offset = memory.getUint32(\n                iovsOffset + WASIAbi.iovec_t.bufferOffset,\n                true\n            );\n            const len = memory.getUint32(\n                iovsOffset + WASIAbi.iovec_t.lengthOffset,\n                true\n            );\n\n            iovsBuffers.push(new Uint8Array(memory.buffer, offset, len));\n            iovsOffset += WASIAbi.iovec_t.size;\n        }\n        return iovsBuffers;\n    }\n\n    writeFilestat(memory: DataView, ptr: number, filetype: number): void {\n        memory.setBigUint64(ptr, /* dev */ BigInt(0), true);\n        memory.setBigUint64(ptr + 8, /* ino */ BigInt(0), true);\n        memory.setUint8(ptr + 16, filetype);\n        memory.setUint32(ptr + 24, /* nlink */ 0, true);\n        memory.setBigUint64(ptr + 32, /* size */ BigInt(0), true);\n        memory.setBigUint64(ptr + 40, /* atim */ BigInt(0), true);\n        memory.setBigUint64(ptr + 48, /* mtim */ BigInt(0), true);\n    }\n\n    writeFdstat(\n        memory: DataView,\n        ptr: number,\n        filetype: number,\n        flags: number\n    ): void {\n        memory.setUint8(ptr, filetype);\n        memory.setUint16(ptr + 2, flags, true);\n        memory.setBigUint64(ptr + 8, /* rights_base */ BigInt(0), true);\n        memory.setBigUint64(ptr + 16, /* rights_inheriting */ BigInt(0), true);\n    }\n}\n\n/**\n * An exception that is thrown when the process exits.\n **/\nexport class WASIProcExit {\n    constructor(public readonly code: number) { }\n\n    /** @deprecated Use 'code' instead.\n     *  Has been renamed to have loose compatibility\n     *  with other implementations **/\n    get exitCode() {\n        return this.code;\n    }\n}", "import { WASIAbi } from \"../abi\";\nimport type { WASIFeatureProvider, WASIOptions } from \"../options\";\n\ninterface FdEntry {\n  writev(iovs: Uint8Array[]): number;\n  readv(iovs: Uint8Array[]): number;\n  close(): void;\n}\n\nclass WritableTextProxy implements FdEntry {\n  private decoder = new TextDecoder(\"utf-8\");\n  constructor(\n    private readonly handler: (lines: string | Uint8Array) => void,\n    private readonly outputBuffers: boolean\n  ) {}\n\n  writev(iovs: Uint8Array[]): number {\n    const totalBufferSize = iovs.reduce((acc, iov) => acc + iov.byteLength, 0);\n    let offset = 0;\n    const concatBuffer = new Uint8Array(totalBufferSize);\n    for (const buffer of iovs) {\n      concatBuffer.set(buffer, offset);\n      offset += buffer.byteLength;\n    }\n\n    if (this.outputBuffers) {\n      this.handler(concatBuffer);\n    } else {\n      const lines = this.decoder.decode(concatBuffer);\n      this.handler(lines);\n    }\n\n    return concatBuffer.length;\n  }\n  readv(_iovs: Uint8Array[]): number {\n    return 0;\n  }\n  close(): void {}\n}\n\nexport class ReadableTextProxy implements FdEntry {\n  private encoder = new TextEncoder();\n  private pending: Uint8Array | null = null;\n  constructor(private readonly consume: () => string | Uint8Array) {}\n\n  writev(_iovs: Uint8Array[]): number {\n    return 0;\n  }\n  consumePending(pending: Uint8Array, requestLength: number): Uint8Array {\n    if (pending.byteLength < requestLength) {\n      this.pending = null;\n      return pending;\n    }\n      const result = pending.slice(0, requestLength);\n      this.pending = pending.slice(requestLength);\n      return result;\n  }\n  readv(iovs: Uint8Array[]): number {\n    let read = 0;\n    for (const buffer of iovs) {\n      let remaining = buffer.byteLength;\n      if (this.pending) {\n        const consumed = this.consumePending(this.pending, remaining);\n        buffer.set(consumed, 0);\n        remaining -= consumed.byteLength;\n        read += consumed.byteLength;\n      }\n      while (remaining > 0) {\n        const newData = this.consume();\n        let bytes: Uint8Array;\n\n        if (newData instanceof Uint8Array) {\n          bytes = newData;\n        } else {\n          bytes = this.encoder.encode(newData);\n        }\n\n        if (bytes.length === 0) {\n          return read;\n        }\n        if (bytes.length > remaining) {\n          buffer.set(bytes.slice(0, remaining), buffer.byteLength - remaining);\n          this.pending = bytes.slice(remaining);\n          read += remaining;\n          remaining = 0;\n        } else {\n          buffer.set(bytes, buffer.byteLength - remaining);\n          read += bytes.length;\n          remaining -= bytes.length;\n        }\n      }\n    }\n    return read;\n  }\n  close(): void {}\n}\n\nexport type StdIoOptions = {\n  stdin?: () => string | Uint8Array;\n  stdout?: (lines: string | Uint8Array) => void;\n  stderr?: (lines: string | Uint8Array) => void;\n  outputBuffers?: boolean;\n};\n\nfunction bindStdio(\n  useOptions: StdIoOptions = {}\n): (ReadableTextProxy | WritableTextProxy)[] {\n  const outputBuffers = useOptions.outputBuffers || false;\n  return [\n    new ReadableTextProxy(\n      useOptions.stdin ||\n        (() => {\n          return \"\";\n        })\n    ),\n    new WritableTextProxy(useOptions.stdout || console.log, outputBuffers),\n    new WritableTextProxy(useOptions.stderr || console.error, outputBuffers),\n  ];\n}\n\n/**\n * Create a feature provider that provides fd related features only for standard output and standard error\n * It uses JavaScript's `console` APIs as backend by default.\n *\n * ```js\n * const wasi = new WASI({\n *   features: [useStdio()],\n * });\n * ```\n *\n * To use a custom backend, you can pass stdout and stderr handlers.\n *\n * ```js\n * const wasi = new WASI({\n *   features: [\n *     useStdio({\n *       stdout: (lines) => document.write(lines),\n *       stderr: (lines) => document.write(lines),\n *     })\n *   ],\n * });\n * ```\n *\n * This provides `fd_write`, `fd_prestat_get` and `fd_prestat_dir_name` implementations to make libc work with minimal effort.\n */\nexport function useStdio(useOptions: StdIoOptions = {}): WASIFeatureProvider {\n  return (options, abi, memoryView) => {\n    const fdTable = bindStdio(useOptions);\n    return {\n      fd_fdstat_get: (fd: number, buf: number) => {\n        const fdEntry = fdTable[fd];\n        if (!fdEntry) return WASIAbi.WASI_ERRNO_BADF;\n        const view = memoryView();\n        abi.writeFdstat(view, buf, WASIAbi.WASI_FILETYPE_CHARACTER_DEVICE, 0);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n      fd_filestat_get: (fd: number, buf: number) => {\n        const fdEntry = fdTable[fd];\n        if (!fdEntry) return WASIAbi.WASI_ERRNO_BADF;\n        const view = memoryView();\n        abi.writeFilestat(view, buf, WASIAbi.WASI_FILETYPE_CHARACTER_DEVICE);\n      },\n      fd_prestat_get: (fd: number, buf: number) => {\n        return WASIAbi.WASI_ERRNO_BADF;\n      },\n      fd_prestat_dir_name: (fd: number, buf: number) => {\n        return WASIAbi.WASI_ERRNO_BADF;\n      },\n      fd_write: (\n        fd: number,\n        iovs: number,\n        iovsLen: number,\n        nwritten: number\n      ) => {\n        const fdEntry = fdTable[fd];\n        if (!fdEntry) return WASIAbi.WASI_ERRNO_BADF;\n        const view = memoryView();\n        const iovsBuffers = abi.iovViews(view, iovs, iovsLen);\n        const writtenValue = fdEntry.writev(iovsBuffers);\n        view.setUint32(nwritten, writtenValue, true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n      fd_read: (fd: number, iovs: number, iovsLen: number, nread: number) => {\n        const fdEntry = fdTable[fd];\n        if (!fdEntry) return WASIAbi.WASI_ERRNO_BADF;\n        const view = memoryView();\n        const iovsBuffers = abi.iovViews(view, iovs, iovsLen);\n        const readValue = fdEntry.readv(iovsBuffers);\n        view.setUint32(nread, readValue, true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n    };\n  };\n}\n\ntype FileDescriptor = number;\n\n/**\n * Represents a node in the file system that is a directory.\n */\ninterface DirectoryNode {\n  readonly type: \"dir\";\n  entries: Record<string, FSNode>;\n}\n\n/**\n * Represents a node in the file system that is a file.\n */\ninterface FileNode {\n  readonly type: \"file\";\n  content: Uint8Array | Blob;\n}\n\ntype CharacterDeviceNode =\n  | { readonly type: \"character\"; kind: \"stdio\"; entry: FdEntry }\n  | { readonly type: \"character\"; kind: \"devnull\" };\n\n/**\n * Union type representing any node in the file system.\n */\ntype FSNode = DirectoryNode | FileNode | CharacterDeviceNode;\n\n/**\n * Represents an open file in the file system.\n */\ninterface OpenFile {\n  node: FSNode;\n  position: number;\n  path: string;\n  isPreopen?: boolean;\n  preopenPath?: string;\n  fd: FileDescriptor;\n}\n\n/**\n * Type for file content that can be added to the file system.\n */\ntype FileContent = string | Uint8Array | Blob;\n\n/**\n * In-memory implementation of a file system.\n */\nexport class MemoryFileSystem {\n  private root: DirectoryNode;\n  private preopenPaths: string[] = [];\n\n  /**\n   * Creates a new memory file system.\n   * @param preopens Optional list of directories to pre-open\n   */\n  constructor(preopens?: { [guestPath: string]: string } | undefined) {\n    this.root = { type: \"dir\", entries: {} };\n\n    // Setup essential directories and special files\n    this.ensureDir(\"/dev\");\n    this.setNode(\"/dev/null\", { type: \"character\", kind: \"devnull\" });\n\n    // Setup preopened directories\n    if (preopens) {\n      for (const guestPath of Object.keys(preopens)) {\n        // there are no 'host' paths in a memory file system, so we just use the guest path.\n        this.ensureDir(guestPath);\n        this.preopenPaths.push(guestPath);\n      }\n    } else {\n      this.preopenPaths.push(\"/\");\n    }\n  }\n\n  removeFile(path: string) {\n    const normalizedPath = this.normalizePath(path);\n    const parts = normalizedPath.split(\"/\").filter((p) => p.length > 0);\n    const fileName = parts.pop();\n    const dirPath = `/${parts.join(\"/\")}`;\n    const dir = this.ensureDir(dirPath);\n    if (fileName) {\n      delete dir.entries[fileName];\n    }\n  }\n\n  addFile(path: string, content: FileContent): void {\n    if (typeof content === \"string\") {\n      const data = new TextEncoder().encode(content);\n      this.createFile(path, data);\n      return;\n    }\n      this.createFile(path, content);\n  }\n\n  /**\n   * Creates a file with the specified content.\n   * @param path Path where the file should be created\n   * @param content Binary content of the file\n   * @returns The created file node\n   */\n  createFile(path: string, content: Uint8Array | Blob): FileNode {\n    const fileNode: FileNode = { type: \"file\", content };\n    this.setNode(path, fileNode);\n    return fileNode;\n  }\n\n  /**\n   * Sets a node at the specified path.\n   * @param path Path where the node should be set\n   * @param node The node to set\n   */\n  setNode(path: string, node: FSNode): void {\n    const normalizedPath = this.normalizePath(path);\n    const parts = normalizedPath.split(\"/\").filter((p) => p.length > 0);\n\n    if (parts.length === 0) {\n      if (node.type !== \"dir\") {\n        throw new Error(\"Root must be a directory\");\n      }\n      this.root = node;\n      return;\n    }\n\n    const fileName = parts.pop();\n    const dirPath = `/${parts.join(\"/\")}`;\n    const dir = this.ensureDir(dirPath);\n    if (fileName) {\n      dir.entries[fileName] = node;\n    }\n  }\n\n  /**\n   * Gets the /dev/null special device.\n   * @returns The /dev/null node\n   */\n  getDevNull(): FSNode {\n    const node = this.lookup(\"/dev/null\");\n    if (!node) throw new Error(\"/dev/null not found\");\n    return node;\n  }\n\n  /**\n   * Gets the list of pre-opened paths.\n   * @returns Array of pre-opened paths\n   */\n  getPreopenPaths(): string[] {\n    return [...this.preopenPaths];\n  }\n\n  /**\n   * Looks up a node at the specified path.\n   * @param path Path to look up\n   * @returns The node at the path, or null if not found\n   */\n  lookup(path: string): FSNode | null {\n    const normalizedPath = this.normalizePath(path);\n    if (normalizedPath === \"/\") return this.root;\n\n    const parts = normalizedPath.split(\"/\").filter((p) => p.length > 0);\n    let current: FSNode = this.root;\n\n    for (const part of parts) {\n      if (current.type !== \"dir\") return null;\n      current = current.entries[part];\n      if (!current) return null;\n    }\n\n    return current;\n  }\n\n  /**\n   * Resolves a relative path from a directory.\n   * @param dir Starting directory\n   * @param relativePath Relative path to resolve\n   * @returns The resolved node, or null if not found\n   */\n  resolve(dir: DirectoryNode, relativePath: string): FSNode | null {\n    const normalizedPath = this.normalizePath(relativePath);\n    const parts = normalizedPath.split(\"/\").filter((p) => p.length > 0);\n    let current: FSNode = dir;\n\n    for (const part of parts) {\n      if (part === \".\") continue;\n      if (part === \"..\") {\n        current = this.root; // jump to root\n        continue;\n      }\n      if (current.type !== \"dir\") return null;\n      current = current.entries[part];\n      if (!current) return null;\n    }\n\n    return current;\n  }\n\n  /**\n   * Ensures a directory exists at the specified path, creating it if necessary.\n   * @param path Path to the directory\n   * @returns The directory node\n   */\n  ensureDir(path: string): DirectoryNode {\n    const normalizedPath = this.normalizePath(path);\n    const parts = normalizedPath.split(\"/\").filter((p) => p.length > 0);\n    let current: DirectoryNode = this.root;\n\n    for (const part of parts) {\n      if (!current.entries[part]) {\n        current.entries[part] = { type: \"dir\", entries: {} };\n      }\n\n      const next = current.entries[part];\n      if (next.type !== \"dir\") {\n        throw new Error(`\"${part}\" is not a directory`);\n      }\n\n      current = next;\n    }\n\n    return current;\n  }\n\n  /**\n   * Creates a file in a directory.\n   * @param dir Parent directory\n   * @param relativePath Path relative to the directory\n   * @returns The created file node\n   */\n  createFileIn(dir: DirectoryNode, relativePath: string): FileNode {\n    const normalizedPath = this.normalizePath(relativePath);\n    const parts = normalizedPath.split(\"/\").filter((p) => p.length > 0);\n\n    if (parts.length === 0) {\n      throw new Error(\"Cannot create a file with an empty name\");\n    }\n\n    const fileName = parts.pop();\n    if (!fileName) {\n      throw new Error(\"Cannot create a file with an empty name\");\n    }\n    let current = dir;\n\n    for (const part of parts) {\n      if (!current.entries[part]) {\n        current.entries[part] = { type: \"dir\", entries: {} };\n      }\n\n      const next = current.entries[part];\n      if (next.type !== \"dir\") {\n        throw new Error(`\"${part}\" is not a directory`);\n      }\n\n      current = next;\n    }\n\n    const fileNode: FileNode = { type: \"file\", content: new Uint8Array(0) };\n    current.entries[fileName] = fileNode;\n    return fileNode;\n  }\n\n  /**\n   * Normalizes a path by removing duplicate slashes and trailing slashes.\n   * @param path Path to normalize\n   * @returns Normalized path\n   */\n  private normalizePath(path: string): string {\n    // Handle empty path\n    if (!path) return \"/\";\n\n    // Ensure path starts with a slash\n    const withLeadingSlash = path.startsWith(\"/\") ? path : `/${path}`;\n\n    // Remove duplicate slashes and normalize\n    const normalized = withLeadingSlash.replace(/\\/+/g, \"/\");\n\n    // Remove trailing slash unless it's the root path\n    return normalized === \"/\" ? normalized : normalized.replace(/\\/+$/, \"\");\n  }\n}\n\n/**\n * Creates a feature provider that implements a complete in-memory file system.\n *\n * This provides implementations for all file descriptor and path-related WASI\n * functions, including `fd_read`, `fd_write`, `fd_seek`, `fd_tell`, `fd_close`,\n * `path_open`, and more to support a full featured file system environment.\n *\n * ```js\n * const wasi = new WASI({\n *   features: [useMemoryFS()],\n * });\n * ```\n *\n * You can provide a pre-configured file system instance:\n *\n * ```js\n * const fs = new MemoryFileSystem();\n * fs.addFile(\"/hello.txt\", \"Hello, world!\");\n *\n * const wasi = new WASI({\n *   features: [useMemoryFS({ withFileSystem: fs })],\n * });\n * ```\n *\n * You can also combine it with standard IO:\n *\n * ```js\n * const wasi = new WASI({\n *   features: [\n *     useMemoryFS({\n *       withStdIo: {\n *         stdout: (lines) => document.write(lines),\n *         stderr: (lines) => document.write(lines),\n *       }\n *     })\n *   ],\n * });\n * ```\n *\n * @param useOptions - Configuration options for the memory file system\n * @param useOptions.withFileSystem - Optional pre-configured file system instance\n * @param useOptions.withStdIo - Optional standard I/O configuration\n * @returns A WASI feature provider implementing file system functionality\n */\nexport function useMemoryFS(\n  useOptions: {\n    withFileSystem?: MemoryFileSystem;\n    withStdIo?: StdIoOptions;\n  } = {}\n): WASIFeatureProvider {\n  return (\n    wasiOptions: WASIOptions,\n    abi: WASIAbi,\n    memoryView: () => DataView\n  ) => {\n    const fileSystem =\n      useOptions.withFileSystem || new MemoryFileSystem(wasiOptions.preopens);\n    const files: { [fd: FileDescriptor]: OpenFile } = {};\n\n    bindStdio(useOptions.withStdIo || {}).forEach((entry, fd) => {\n      files[fd] = {\n        node: { type: \"character\", kind: \"stdio\", entry },\n        position: 0,\n        isPreopen: false,\n        path: `/dev/fd/${fd}`,\n        fd,\n      };\n    });\n\n    let nextFd = 3;\n    for (const preopenPath of fileSystem.getPreopenPaths()) {\n      const node = fileSystem.lookup(preopenPath);\n      if (node && node.type === \"dir\") {\n        files[nextFd] = {\n          node,\n          position: 0,\n          isPreopen: true,\n          preopenPath,\n          path: preopenPath,\n          fd: nextFd,\n        };\n        nextFd++;\n      }\n    }\n\n    function getFileFromPath(guestPath: string): OpenFile | null {\n      for (const fd in files) {\n        const file = files[fd];\n        if (file.path === guestPath) return file;\n      }\n      return null;\n    }\n\n    function getFileFromFD(fileDescriptor: FileDescriptor): OpenFile | null {\n      const file = files[fileDescriptor];\n      return file || null;\n    }\n\n    function getFileSize(file: FileNode): number {\n      if (file.content instanceof Blob) {\n        return file.content.size;\n      }\n        return file.content.byteLength;\n    }\n\n    return {\n      fd_read: async (\n        fd: number,\n        iovs: number,\n        iovsLen: number,\n        nread: number\n      ) => {\n        const view = memoryView();\n\n        const iovViews = abi.iovViews(view, iovs, iovsLen);\n        const file = getFileFromFD(fd);\n        if (!file) {\n          return WASIAbi.WASI_ERRNO_BADF;\n        }\n\n        if (file.node.type === \"character\" && file.node.kind === \"stdio\") {\n          const bytesRead = file.node.entry.readv(iovViews);\n          view.setUint32(nread, bytesRead, true);\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        if (file.node.type === \"dir\") {\n          return WASIAbi.WASI_ERRNO_ISDIR;\n        }\n\n        if (file.node.type === \"character\" && file.node.kind === \"devnull\") {\n          view.setUint32(nread, 0, true);\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        const fileNode = file.node;\n        const data = fileNode.content;\n        const available = getFileSize(fileNode) - file.position;\n        let totalRead = 0;\n        if (available <= 0) {\n          view.setUint32(nread, 0, true);\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        if (fileNode.content instanceof Blob) {\n          const blob = fileNode.content;\n          for (const buf of iovViews) {\n            if (file.position >= blob.size) break;\n            const bytesToRead = Math.min(\n              buf.byteLength,\n              blob.size - file.position\n            );\n            if (bytesToRead <= 0) break;\n            const chunk = await blob\n              .slice(file.position, file.position + bytesToRead)\n              .arrayBuffer();\n            buf.set(new Uint8Array(chunk));\n            totalRead += chunk.byteLength;\n            file.position += chunk.byteLength;\n          }\n        } else if (ArrayBuffer.isView(data)) {\n          for (const buf of iovViews) {\n            if (file.position >= data.byteLength) break;\n            const bytesToRead = Math.min(\n              buf.byteLength,\n              data.byteLength - file.position\n            );\n            if (bytesToRead <= 0) break;\n            buf.set(data.slice(file.position, file.position + bytesToRead));\n            totalRead += bytesToRead;\n            file.position += bytesToRead;\n          }\n        }\n        view.setUint32(nread, totalRead, true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_write: (\n        fd: number,\n        iovs: number,\n        iovsLen: number,\n        nwritten: number\n      ) => {\n        const view = memoryView();\n        const iovViews = abi.iovViews(view, iovs, iovsLen);\n        const file = getFileFromFD(fd);\n        if (!file) return WASIAbi.WASI_ERRNO_BADF;\n        let totalWritten = 0;\n\n        if (file.node.type === \"character\" && file.node.kind === \"stdio\") {\n          const bytesWritten = file.node.entry.writev(iovViews);\n          view.setUint32(nwritten, bytesWritten, true);\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        if (file.node.type === \"dir\") return WASIAbi.WASI_ERRNO_ISDIR;\n\n        if (file.node.type === \"character\" && file.node.kind === \"devnull\") {\n          const total = iovViews.reduce((acc, buf) => acc + buf.byteLength, 0);\n          view.setUint32(nwritten, total, true);\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        if (file.node.content instanceof Blob) {\n          return WASIAbi.WASI_ERRNO_INVAL;\n        }\n\n        let pos = file.position;\n        const dataToWrite = iovViews.reduce(\n          (acc, buf) => acc + buf.byteLength,\n          0\n        );\n        const requiredLength = pos + dataToWrite;\n        let newContent: Uint8Array;\n\n        if (requiredLength > getFileSize(file.node)) {\n          newContent = new Uint8Array(requiredLength);\n          newContent.set(file.node.content, 0);\n        } else {\n          newContent = file.node.content;\n        }\n\n        for (const buf of iovViews) {\n          newContent.set(buf, pos);\n          pos += buf.byteLength;\n          totalWritten += buf.byteLength;\n        }\n\n        file.node.content = newContent;\n        file.position = pos;\n        view.setUint32(nwritten, totalWritten, true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_close: (fd: number) => {\n        const file = getFileFromFD(fd);\n        if (!file) return WASIAbi.WASI_ERRNO_BADF;\n\n        if (file.node.type === \"character\" && file.node.kind === \"stdio\") {\n          file.node.entry.close();\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        delete files[fd];\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_seek: (\n        fd: number,\n        offset: bigint,\n        whence: number,\n        newOffset: number\n      ) => {\n        const view = memoryView();\n        if (fd < 3) return WASIAbi.WASI_ERRNO_BADF;\n\n        const file = getFileFromFD(fd);\n        if (!file || file.node.type !== \"file\") return WASIAbi.WASI_ERRNO_BADF;\n\n        let pos = file.position;\n        const fileLength = getFileSize(file.node);\n\n        switch (whence) {\n          case 0:\n            pos = Number(offset);\n            break;\n          case 1:\n            pos = pos + Number(offset);\n            break;\n          case 2:\n            pos = fileLength + Number(offset);\n            break;\n          default:\n            return WASIAbi.WASI_ERRNO_INVAL;\n        }\n\n        if (pos < 0) pos = 0;\n        file.position = pos;\n        view.setUint32(newOffset, pos, true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_tell: (fd: number, offset_ptr: number) => {\n        const view = memoryView();\n        if (fd < 3) return WASIAbi.WASI_ERRNO_BADF;\n\n        const file = getFileFromFD(fd);\n        if (!file) return WASIAbi.WASI_ERRNO_BADF;\n\n        view.setBigUint64(offset_ptr, BigInt(file.position), true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_fdstat_get: (fd: number, buf: number) => {\n        const view = memoryView();\n        const file = getFileFromFD(fd);\n        if (!file) return WASIAbi.WASI_ERRNO_BADF;\n\n        let filetype: number;\n        switch (file.node.type) {\n          case \"character\":\n            filetype = WASIAbi.WASI_FILETYPE_CHARACTER_DEVICE;\n            break;\n          case \"dir\":\n            filetype = WASIAbi.WASI_FILETYPE_DIRECTORY;\n            break;\n          case \"file\":\n            filetype = WASIAbi.WASI_FILETYPE_REGULAR_FILE;\n            break;\n        }\n\n        abi.writeFdstat(view, buf, filetype, 0);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_filestat_get: (fd: number, buf: number) => {\n        const view = memoryView();\n        const entry = getFileFromFD(fd);\n        if (!entry) return WASIAbi.WASI_ERRNO_BADF;\n\n        let filetype: number;\n        let size = 0;\n        switch (entry.node.type) {\n          case \"character\":\n            filetype = WASIAbi.WASI_FILETYPE_CHARACTER_DEVICE;\n            break;\n          case \"dir\":\n            filetype = WASIAbi.WASI_FILETYPE_DIRECTORY;\n            break;\n          case \"file\":\n            filetype = WASIAbi.WASI_FILETYPE_REGULAR_FILE;\n            size = getFileSize(entry.node);\n            break;\n        }\n\n        abi.writeFilestat(view, buf, filetype);\n        view.setBigUint64(buf + 32, BigInt(size), true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_prestat_get: (fd: number, buf: number) => {\n        const view = memoryView();\n        if (fd < 3) return WASIAbi.WASI_ERRNO_BADF;\n\n        const file = getFileFromFD(fd);\n        if (!file || !file.isPreopen) return WASIAbi.WASI_ERRNO_BADF;\n\n        view.setUint8(buf, 0);\n        const pathStr = file.preopenPath || \"\";\n        view.setUint32(buf + 4, pathStr.length, true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_prestat_dir_name: (fd: number, pathPtr: number, pathLen: number) => {\n        if (fd < 3) return WASIAbi.WASI_ERRNO_BADF;\n\n        const file = getFileFromFD(fd);\n        if (!file || !file.isPreopen) return WASIAbi.WASI_ERRNO_BADF;\n\n        const pathStr = file.preopenPath || \"\";\n        if (pathStr.length !== pathLen) return WASIAbi.WASI_ERRNO_INVAL;\n\n        const view = memoryView();\n        for (let i = 0; i < pathStr.length; i++) {\n          view.setUint8(pathPtr + i, pathStr.charCodeAt(i));\n        }\n\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      fd_open: (\n        dirfd: number,\n        pathPtr: number,\n        pathLen: number,\n        oflags: number,\n        _fs_rights_base: bigint,\n        _fs_rights_inheriting: bigint,\n        _fdflags: number,\n        opened_fd: number\n      ) => {\n        const view = memoryView();\n\n        if (dirfd < 3) return WASIAbi.WASI_ERRNO_NOTDIR;\n\n        const dirEntry = getFileFromFD(dirfd);\n        if (!dirEntry || dirEntry.node.type !== \"dir\")\n          return WASIAbi.WASI_ERRNO_NOTDIR;\n\n        const path = abi.readString(view, pathPtr, pathLen);\n\n        const guestPath =\n          (dirEntry.path.endsWith(\"/\") ? dirEntry.path : `${dirEntry.path}/`) +\n          path;\n\n        const existing = getFileFromPath(guestPath);\n        if (existing) {\n          view.setUint32(opened_fd, existing.fd, true);\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        let target = fileSystem.resolve(dirEntry.node, path);\n        const O_CREAT = 1 << 0;\n        const O_EXCL = 1 << 1;\n        const O_TRUNC = 1 << 2;\n\n        if (target) {\n          if (oflags & O_EXCL) return WASIAbi.WASI_ERRNO_EXIST;\n          if (oflags & O_TRUNC) {\n            if (target.type !== \"file\") return WASIAbi.WASI_ERRNO_INVAL;\n            target.content = new Uint8Array(0);\n          }\n        } else {\n          if (!(oflags & O_CREAT)) return WASIAbi.WASI_ERRNO_NOENT;\n          target = fileSystem.createFileIn(dirEntry.node, path);\n        }\n\n        files[nextFd] = {\n          node: target,\n          position: 0,\n          isPreopen: false,\n          path: guestPath,\n          fd: nextFd,\n        };\n\n        view.setUint32(opened_fd, nextFd, true);\n        nextFd++;\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      path_open: (\n        dirfd: number,\n        _dirflags: number,\n        pathPtr: number,\n        pathLen: number,\n        oflags: number,\n        _fs_rights_base: bigint,\n        _fs_rights_inheriting: bigint,\n        _fdflags: number,\n        opened_fd: number\n      ) => {\n        const view = memoryView();\n\n        if (dirfd < 3) return WASIAbi.WASI_ERRNO_NOTDIR;\n\n        const dirEntry = getFileFromFD(dirfd);\n        if (!dirEntry || dirEntry.node.type !== \"dir\")\n          return WASIAbi.WASI_ERRNO_NOTDIR;\n\n        const path = abi.readString(view, pathPtr, pathLen);\n\n        const guestPath =\n          (dirEntry.path.endsWith(\"/\") ? dirEntry.path : `${dirEntry.path}/`) +\n          path;\n\n        const existing = getFileFromPath(guestPath);\n        if (existing) {\n          view.setUint32(opened_fd, existing.fd, true);\n          return WASIAbi.WASI_ESUCCESS;\n        }\n\n        let target = fileSystem.resolve(dirEntry.node as DirectoryNode, path);\n        const O_CREAT = 1 << 0;\n        const O_EXCL = 1 << 1;\n        const O_TRUNC = 1 << 2;\n\n        if (target) {\n          if (oflags & O_EXCL) return WASIAbi.WASI_ERRNO_EXIST;\n          if (oflags & O_TRUNC) {\n            if (target.type !== \"file\") return WASIAbi.WASI_ERRNO_INVAL;\n            (target as FileNode).content = new Uint8Array(0);\n          }\n        } else {\n          if (!(oflags & O_CREAT)) return WASIAbi.WASI_ERRNO_NOENT;\n          target = fileSystem.createFileIn(\n            dirEntry.node as DirectoryNode,\n            path\n          );\n        }\n\n        files[nextFd] = {\n          node: target,\n          position: 0,\n          isPreopen: false,\n          path: guestPath,\n          fd: nextFd,\n        };\n\n        view.setUint32(opened_fd, nextFd, true);\n        nextFd++;\n        return WASIAbi.WASI_ESUCCESS;\n      },\n\n      path_filestat_get: (\n        fd: number,\n        flags: number,\n        pathPtr: number,\n        pathLen: number,\n        buf: number\n      ) => {\n        const view = memoryView();\n\n        // Get the base FD entry; it must be a directory.\n        const file = getFileFromFD(fd);\n        if (!file) return WASIAbi.WASI_ERRNO_BADF;\n        if (file.node.type !== \"dir\") {\n          return WASIAbi.WASI_ERRNO_NOTDIR;\n        }\n\n        const guestRelPath = abi.readString(view, pathPtr, pathLen);\n\n        // Compute the full guest path.\n        const basePath = file.path;\n        const fullGuestPath = basePath.endsWith(\"/\")\n          ? basePath + guestRelPath\n          : `${basePath}/${guestRelPath}`;\n\n        // Lookup the node in the MemoryFS.\n        const node = fileSystem.lookup(fullGuestPath);\n        if (!node) return WASIAbi.WASI_ERRNO_NOENT;\n        if (node.type === \"character\" && node.kind === \"stdio\") {\n          return WASIAbi.WASI_ERRNO_INVAL;\n        }\n\n        // Determine file type and size.\n        let filetype: number;\n        let size = 0;\n        if (node.type === \"dir\") {\n          filetype = WASIAbi.WASI_FILETYPE_DIRECTORY;\n        } else if (node.type === \"character\" && node.kind === \"devnull\") {\n          filetype = WASIAbi.WASI_FILETYPE_CHARACTER_DEVICE;\n        } else {\n          filetype = WASIAbi.WASI_FILETYPE_REGULAR_FILE;\n          size = getFileSize(node);\n        }\n\n        abi.writeFilestat(view, buf, filetype);\n        view.setBigUint64(buf + 32, BigInt(size), true);\n        return WASIAbi.WASI_ESUCCESS;\n      },\n    };\n  };\n}\n\nexport function useFS(useOptions: { fs: unknown }): WASIFeatureProvider {\n  return (options: WASIOptions, abi: WASIAbi, memoryView: () => DataView) => {\n    // TODO: implement fd_* syscalls using `useOptions.fs`\n    return {};\n  };\n}\n", "import { _ as _define_property } from \"./_define_property.js\";\n\nfunction _object_spread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n        var source = arguments[i] != null ? arguments[i] : {};\n        var ownKeys = Object.keys(source);\n\n        if (typeof Object.getOwnPropertySymbols === \"function\") {\n            ownKeys = ownKeys.concat(\n                Object.getOwnPropertySymbols(source).filter(function(sym) {\n                    return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n                })\n            );\n        }\n\n        ownKeys.forEach(function(key) {\n            _define_property(target, key, source[key]);\n        });\n    }\n\n    return target;\n}\nexport { _object_spread as _ };\n", "import { WASIAbi } from \"../abi\";\nimport type { WASIOptions } from \"../options\";\n\n/**\n * A feature provider that provides `args_get` and `args_sizes_get`\n */\nexport function useArgs(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {\n    const args = options.args || [];\n    return {\n        args_get: (argv: number, argvBuf: number) => {\n            let offsetOffset = argv;\n            let bufferOffset = argvBuf;\n            const view = memoryView();\n            for (const arg of args) {\n                view.setUint32(offsetOffset, bufferOffset, true);\n                offsetOffset += 4;\n                bufferOffset += abi.writeString(view, `${arg}\\0`, bufferOffset);\n            }\n            return WASIAbi.WASI_ESUCCESS;\n        },\n        args_sizes_get: (argc: number, argvBufSize: number) => {\n            const view = memoryView();\n            view.setUint32(argc, args.length, true);\n            const bufferSize = args.reduce((acc, arg) => acc + abi.byteLength(arg) + 1, 0);\n            view.setUint32(argvBufSize, bufferSize, true);\n            return WASIAbi.WASI_ESUCCESS;\n        },\n    };\n}", "import { WASIAbi } from \"../abi\";\nimport type { WASIOptions } from \"../options\";\n\n/**\n * A feature provider that provides `clock_res_get` and `clock_time_get` by JavaScript's Date.\n */\nexport function useClock(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {\n    return {\n        clock_res_get: (clockId: number, resolution: number) => {\n            let resolutionValue: number;\n            switch (clockId) {\n                case WASIAbi.WASI_CLOCK_MONOTONIC: {\n                    // https://developer.mozilla.org/en-US/docs/Web/API/Performance/now\n                    resolutionValue = 5000;\n                    break;\n                }\n                case WASIAbi.WASI_CLOCK_REALTIME: {\n                    resolutionValue = 1000;\n                    break;\n                }\n                default: return WASIAbi.WASI_ENOSYS;\n            }\n            const view = memoryView();\n            // 64-bit integer, but only the lower 32 bits are used.\n            view.setUint32(resolution, resolutionValue, true);\n            return WASIAbi.WASI_ESUCCESS;\n        },\n        clock_time_get: (clockId: number, precision: number, time: number) => {\n            let nowMs = 0;\n            switch (clockId) {\n                case WASIAbi.WASI_CLOCK_MONOTONIC: {\n                    nowMs = performance.now();\n                    break;\n                }\n                case WASIAbi.WASI_CLOCK_REALTIME: {\n                    nowMs = Date.now();\n                    break;\n                }\n                default: return WASIAbi.WASI_ENOSYS;\n            }\n            const view = memoryView();\n            if (BigInt) {\n                const msToNs = (ms: number) => {\n                    const msInt = Math.trunc(ms);\n                    const decimal = BigInt(Math.round((ms - msInt) * 1_000_000));\n                    const ns = BigInt(msInt) * BigInt(1_000_000);\n                    return ns + decimal;\n                };\n                const now = BigInt(msToNs(nowMs));\n                view.setBigUint64(time, now, true);\n            } else {\n                // Fallback to two 32-bit numbers losing precision\n                const now = Date.now() * 1_000_000;\n                view.setUint32(time, now & 0x0000ffff, true);\n                view.setUint32(time + 4, now & 0xffff0000, true);\n            }\n            return WASIAbi.WASI_ESUCCESS;\n        },\n    };\n}", "import { WASIAbi } from \"../abi\";\nimport type { WASIOptions } from \"../options\";\n\n/**\n * A feature provider that provides `environ_get` and `environ_sizes_get`\n */\nexport function useEnviron(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {\n    return {\n        environ_get: (environ: number, environBuf: number) => {\n            let offsetOffset = environ;\n            let bufferOffset = environBuf;\n            const view = memoryView();\n            for (const key in options.env) {\n                const value = options.env[key];\n                view.setUint32(offsetOffset, bufferOffset, true);\n                offsetOffset += 4;\n                bufferOffset += abi.writeString(view, `${key}=${value}\\0`, bufferOffset);\n            }\n            return WASIAbi.WASI_ESUCCESS;\n        },\n        environ_sizes_get: (environ: number, environBufSize: number) => {\n            const view = memoryView();\n            view.setUint32(environ, Object.keys(options.env || {}).length, true);\n            view.setUint32(\n                environBufSize,\n                Object.entries(options.env || {}).reduce(\n                    (acc, [key, value]) => {\n                        return acc + abi.byteLength(key) /* = */ + 1 + abi.byteLength(value) /* \\0 */ + 1;\n                    },\n                    0\n                ),\n                true\n            );\n            return WASIAbi.WASI_ESUCCESS;\n        }\n    };\n}", "import { WASIAbi, WASIProcExit } from \"../abi\";\nimport type { WASIOptions } from \"../options\";\n\n/**\n * A feature provider that provides `proc_exit` and `proc_raise` by JavaScript's exception.\n */\nexport function useProc(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {\n    return {\n        proc_exit: (code: number) => {\n            throw new WASIProcExit(code);\n        },\n        proc_raise: (signal: number) => {\n            // TODO: Implement\n            return WASIAbi.WASI_ESUCCESS;\n        },\n    };\n}", "import { WASIAbi } from \"../abi\";\nimport { WASIFeatureProvider, type WASIOptions } from \"../options\";\n\n/**\n * Create a feature provider that provides `random_get` with `crypto` APIs as backend by default.\n */\nexport function useRandom(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {\n    return {\n        random_get: (bufferOffset: number, length: number) => {\n            const view = memoryView();\n            const buffer = new Uint8Array(view.buffer, bufferOffset, length);\n            crypto.getRandomValues(buffer);\n            return WASIAbi.WASI_ESUCCESS;\n        },\n    };\n}", "import { WASIAbi, WASIProcExit } from \"./abi\";\nexport { WASIProcExit } from \"./abi\";\nimport type { WASIOptions } from \"./options\";\n\nexport * from \"./features/args\";\nexport * from \"./features/clock\";\nexport * from \"./features/environ\";\nexport { useFS, useStdio, useMemoryFS } from \"./features/fd\";\nexport * from \"./features/proc\";\nexport * from \"./features/random\";\n\nexport class WASI {\n    /**\n     * `wasiImport` is an object that implements the WASI system call API. This object\n     * should be passed as the `wasi_snapshot_preview1` import during the instantiation\n     * of a [`WebAssembly.Instance`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance).\n     */\n    readonly wasiImport: WebAssembly.ModuleImports;\n    private instance: WebAssembly.Instance | null = null;\n    private isStarted = false;\n    private abi: WASIAbi;\n\n    constructor(options?: WASIOptions) {\n        this.wasiImport = {};\n        this.abi = new WASIAbi();\n        if (options?.features) {\n            const importProviders: Record<string, string> = {};\n            for (const useFeature of options.features) {\n                const featureName = useFeature.name || 'Unknown feature';\n                const imports = useFeature(options, this.abi, this.view.bind(this));\n                for (const key in imports) {\n                    if (key in this.wasiImport) {\n                        const previousProvider = importProviders[key] || 'Unknown feature';\n                        throw new Error(`Import conflict: Function '${key}' is already provided by '${previousProvider}' and is being redefined by '${featureName}'`);\n                    }\n                    importProviders[key] = featureName;\n                }\n                this.wasiImport = { ...this.wasiImport, ...imports };\n            }\n        }\n        // Provide default implementations for missing functions just returning ENOSYS.\n        for (const key of WASIAbi.IMPORT_FUNCTIONS) {\n            if (!(key in this.wasiImport)) {\n                this.wasiImport[key] = () => { return WASIAbi.WASI_ENOSYS; };\n            }\n        }\n    }\n\n    private view(): DataView {\n        if (!this.instance) {\n            throw new Error('wasi.start() or wasi.initialize() has not been called');\n        }\n        if (!this.instance.exports.memory) {\n            throw new Error('instance.exports.memory is undefined');\n        }\n        if (!(this.instance.exports.memory instanceof WebAssembly.Memory)) {\n            throw new Error('instance.exports.memory is not a WebAssembly.Memory');\n        }\n        return new DataView(this.instance.exports.memory.buffer);\n    }\n\n    /**\n     * Attempt to begin execution of `instance` as a WASI command by invoking its`_start()` export. If `instance` does not contain a `_start()` export, or if`instance` contains an `_initialize()`\n     * export, then an exception is thrown.\n     *\n     * `start()` requires that `instance` exports a [`WebAssembly.Memory`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory) named`memory`. If\n     * `instance` does not have a `memory` export an exception is thrown.\n     *\n     * If `start()` is called more than once, an exception is thrown.\n     */\n    async start(instance: WebAssembly.Instance): Promise<number> {\n        if (this.isStarted) {\n            throw new Error('wasi.start() or wasi.initialize() has already been called');\n        }\n        this.isStarted = true;\n        this.instance = instance;\n        if (!this.instance.exports._start) {\n            throw new Error('instance.exports._start is undefined');\n        }\n        if (typeof this.instance.exports._start !== 'function') {\n            throw new Error('instance.exports._start is not a function');\n        }\n        try {\n            await this.instance.exports._start();\n            return WASIAbi.WASI_ESUCCESS;\n        } catch (e) {\n            if (e instanceof WASIProcExit) {\n                return e.code;\n            }\n            throw e;\n        }\n    }\n}", "function _get_prototype_of(o) {\n    _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {\n        return o.__proto__ || Object.getPrototypeOf(o);\n    };\n\n    return _get_prototype_of(o);\n}\nexport { _get_prototype_of as _ };\n", "function _is_native_reflect_construct() {\n    // Since Reflect.construct can't be properly polyfilled, some\n    // implementations (e.g. core-js@2) don't set the correct internal slots.\n    // Those polyfills don't allow us to subclass built-ins, so we need to\n    // use our fallback implementation.\n    try {\n        // If the internal slots aren't set, this throws an error similar to\n        //   TypeError: this is not a Boolean object.\n        var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n    } catch (_) {}\n    return (_is_native_reflect_construct = function() {\n        return !!result;\n    })();\n}\n\nexport { _is_native_reflect_construct as _ };\n", "function _assert_this_initialized(self) {\n    if (self === void 0) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n\n    return self;\n}\nexport { _assert_this_initialized as _ };\n", "import { _ as _assert_this_initialized } from \"./_assert_this_initialized.js\";\nimport { _ as _type_of } from \"./_type_of.js\";\n\nfunction _possible_constructor_return(self, call) {\n    if (call && (_type_of(call) === \"object\" || typeof call === \"function\")) return call;\n\n    return _assert_this_initialized(self);\n}\nexport { _possible_constructor_return as _ };\n", "import { _ as _get_prototype_of } from \"./_get_prototype_of.js\";\nimport { _ as _is_native_reflect_construct } from \"./_is_native_reflect_construct.js\";\nimport { _ as _possible_constructor_return } from \"./_possible_constructor_return.js\";\n\nfunction _call_super(_this, derived, args) {\n    // Super\n    derived = _get_prototype_of(derived);\n    return _possible_constructor_return(\n        _this,\n        _is_native_reflect_construct()\n            // NOTE: This doesn't work if this.__proto__.constructor has been modified.\n            ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor)\n            : derived.apply(_this, args)\n    );\n}\n\nexport { _call_super as _ };\n", "import { _ as _get_prototype_of } from \"./_get_prototype_of.js\";\n\nfunction _super_prop_base(object, property) {\n    while (!Object.prototype.hasOwnProperty.call(object, property)) {\n        object = _get_prototype_of(object);\n        if (object === null) break;\n    }\n\n    return object;\n}\nexport { _super_prop_base as _ };\n", "import { _ as _super_prop_base } from \"./_super_prop_base.js\";\n\nfunction _get(target, property, receiver) {\n    if (typeof Reflect !== \"undefined\" && Reflect.get) _get = Reflect.get;\n    else {\n        _get = function get(target, property, receiver) {\n            var base = _super_prop_base(target, property);\n\n            if (!base) return;\n\n            var desc = Object.getOwnPropertyDescriptor(base, property);\n\n            if (desc.get) return desc.get.call(receiver || target);\n\n            return desc.value;\n        };\n    }\n\n    return _get(target, property, receiver || target);\n}\nexport { _get as _ };\n", "function _set_prototype_of(o, p) {\n    _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n        o.__proto__ = p;\n\n        return o;\n    };\n\n    return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n", "import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n    if (typeof superClass !== \"function\" && superClass !== null) {\n        throw new TypeError(\"Super expression must either be null or a function\");\n    }\n\n    subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n    if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n", "/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Put `__asyncify_data` somewhere at the start.\n// This address is pretty hand-wavy and we might want to make it configurable in future.\n// See https://github.com/WebAssembly/binaryen/blob/6371cf63687c3f638b599e086ca668c04a26cbbb/src/passes/Asyncify.cpp#L106-L113\n// for structure details.\nconst DATA_ADDR: number = 16;\n// Place actual data right after the descriptor (which is 2 * sizeof(i32) = 8 bytes).\nconst DATA_START: number = DATA_ADDR + 8;\n// End data at 1024 bytes. This is where the unused area by Clang ends and real stack / data begins.\n// Because this might differ between languages and parameters passed to wasm-ld, ideally we would\n// use `__stack_pointer` here, but, sadly, it's not exposed via exports yet.\nconst DATA_END: number = 1024;\n\nconst WRAPPED_EXPORTS: WeakMap<any, any> = new WeakMap();\n\nenum State {\n  None = 0,\n  Unwinding = 1,\n  Rewinding = 2,\n}\n\ninterface AsyncifyExports extends WebAssembly.Exports {\n  asyncify_get_state: () => number;\n  asyncify_start_unwind: (addr: number) => void;\n  asyncify_stop_unwind: () => void;\n  asyncify_start_rewind: (addr: number) => void;\n  asyncify_stop_rewind: () => void;\n  memory: WebAssembly.Memory;\n}\n\ntype ImportFn = (...args: any[]) => any;\ntype ModuleImports = Record<string, any>;\ntype Imports = Record<string, ModuleImports>;\n\nfunction isPromise(obj: any): obj is Promise<any> {\n  return (\n    !!obj &&\n    (typeof obj === \"object\" || typeof obj === \"function\") &&\n    typeof obj.then === \"function\"\n  );\n}\n\nfunction proxyGet<T extends object>(obj: T, transform: (value: any) => any): T {\n  return new Proxy(obj, {\n    get: (obj, name: string | symbol) =>\n      transform(obj[name as keyof typeof obj]),\n  });\n}\n\nclass Asyncify {\n  private value: any = undefined;\n  private exports: AsyncifyExports | null = null;\n\n  getState(): number {\n    if (!this.exports) throw new Error(\"Exports not initialized\");\n    return this.exports.asyncify_get_state();\n  }\n\n  assertNoneState(): void {\n    let state = this.getState();\n    if (state !== State.None) {\n      throw new Error(`Invalid async state ${state}, expected 0.`);\n    }\n  }\n\n  wrapImportFn(fn: ImportFn): ImportFn {\n    return (...args: any[]) => {\n      if (this.getState() === State.Rewinding) {\n        if (!this.exports) throw new Error(\"Exports not initialized\");\n        this.exports.asyncify_stop_rewind();\n        return this.value;\n      }\n      this.assertNoneState();\n      let value = fn(...args);\n      if (!isPromise(value)) {\n        return value;\n      }\n      if (!this.exports) throw new Error(\"Exports not initialized\");\n      this.exports.asyncify_start_unwind(DATA_ADDR);\n      this.value = value;\n    };\n  }\n\n  wrapModuleImports(module: ModuleImports): ModuleImports {\n    return proxyGet(module, (value) => {\n      if (typeof value === \"function\") {\n        return this.wrapImportFn(value);\n      }\n      return value;\n    });\n  }\n\n  wrapImports(imports?: Imports): Imports | undefined {\n    if (imports === undefined) return;\n\n    return proxyGet(imports, (moduleImports = Object.create(null)) =>\n      this.wrapModuleImports(moduleImports)\n    );\n  }\n\n  wrapExportFn(fn: Function): Function {\n    let newExport = WRAPPED_EXPORTS.get(fn);\n\n    if (newExport !== undefined) {\n      return newExport;\n    }\n\n    newExport = async (...args: any[]) => {\n      this.assertNoneState();\n\n      let result = fn(...args);\n\n      while (this.getState() === State.Unwinding) {\n        if (!this.exports) throw new Error(\"Exports not initialized\");\n        this.exports.asyncify_stop_unwind();\n        this.value = await this.value;\n        this.assertNoneState();\n        this.exports.asyncify_start_rewind(DATA_ADDR);\n        result = fn(...args);\n      }\n\n      this.assertNoneState();\n\n      return result;\n    };\n\n    WRAPPED_EXPORTS.set(fn, newExport);\n\n    return newExport;\n  }\n\n  wrapExports(exports: WebAssembly.Exports): WebAssembly.Exports {\n    let newExports = Object.create(null);\n\n    for (let exportName in exports) {\n      let value = exports[exportName];\n      if (typeof value === \"function\" && !exportName.startsWith(\"asyncify_\")) {\n        value = this.wrapExportFn(value);\n      }\n      Object.defineProperty(newExports, exportName, {\n        enumerable: true,\n        value,\n      });\n    }\n\n    WRAPPED_EXPORTS.set(exports, newExports);\n\n    return newExports;\n  }\n\n  init(instance: WebAssembly.Instance, imports?: Imports): void {\n    const exports = instance.exports as AsyncifyExports;\n\n    const memory =\n      exports.memory || (imports?.env && (imports.env as any).memory);\n\n    if (!memory) {\n      throw new Error(\"Memory not found in exports or imports.env\");\n    }\n\n    new Int32Array(memory.buffer, DATA_ADDR).set([DATA_START, DATA_END]);\n\n    this.exports = this.wrapExports(exports) as AsyncifyExports;\n\n    Object.setPrototypeOf(instance, Instance.prototype);\n  }\n}\n\nexport class Instance extends WebAssembly.Instance {\n  constructor(module: WebAssembly.Module, imports?: Imports) {\n    let state = new Asyncify();\n    super(module, state.wrapImports(imports));\n    state.init(this, imports);\n  }\n\n  get exports(): WebAssembly.Exports {\n    return WRAPPED_EXPORTS.get(super.exports);\n  }\n}\n\nObject.defineProperty(Instance.prototype, \"exports\", { enumerable: true });\n\nexport async function instantiateStreaming(\n  source: Response | Promise<Response>,\n  imports?: Imports\n): Promise<WebAssembly.WebAssemblyInstantiatedSource> {\n  let state = new Asyncify();\n  let result = await WebAssembly.instantiateStreaming(\n    source,\n    state.wrapImports(imports)\n  );\n  state.init(result.instance, imports);\n  return result;\n}\n", "/**\n * A lightweight StringBuilder\n */\nexport class StringBuilder {\n  private parts: string[];\n\n  /**\n   * Creates a new StringBuilder instance\n   * @param initialValue Optional initial string value\n   */\n  constructor(initialValue = \"\") {\n    this.parts = initialValue ? [initialValue] : [];\n  }\n\n  /**\n   * Appends a string to the builder\n   * @param str The string to append\n   * @returns The StringBuilder instance for chaining\n   */\n  append(str: string): StringBuilder {\n    this.parts.push(str);\n    return this;\n  }\n\n  /**\n   * Appends a string followed by a newline character\n   * @param str The string to append\n   * @returns The StringBuilder instance for chaining\n   */\n  appendLine(str = \"\"): StringBuilder {\n    this.parts.push(`${str}\\n`);\n    return this;\n  }\n\n  /**\n   * Returns the current length of the string\n   */\n  get length(): number {\n    return this.toString().length;\n  }\n\n  /**\n   * Converts the StringBuilder to a string\n   * @returns The built string\n   */\n  toString(): string {\n    return this.parts.join(\"\");\n  }\n\n  /**\n   * Checks if a string contains or ends with line breaks\n   * @param str The string to check\n   * @returns True if the string contains any line breaks\n   */\n  static isMultiline(str: string): boolean {\n    // Count all line breaks in the string\n    let lineBreakCount = 0;\n\n    for (let i = 0; i < str.length; i++) {\n      // Check for \\n (Line Feed)\n      if (str[i] === \"\\n\") {\n        lineBreakCount++;\n      }\n      // Check for \\r (Carriage Return) not followed by \\n (to avoid double counting \\r\\n)\n      else if (\n        str[i] === \"\\r\" &&\n        (i === str.length - 1 || str[i + 1] !== \"\\n\")\n      ) {\n        lineBreakCount++;\n      }\n    }\n\n    return lineBreakCount > 0;\n  }\n}\n", "import exiftool from \"./ex\";\nimport { MemoryFileSystem, useMemoryFS } from \"./wasi/features/fd\";\nimport {\n  useArgs,\n  useClock,\n  useEnviron,\n  useProc,\n  useRandom,\n  WASI,\n} from \"./wasi\";\nimport { instantiateStreaming } from \"./wasi/asyncify\";\nimport type { WASIOptions } from \"./wasi/options\";\nimport { StringBuilder } from \"./sb\";\n\nconst cdn = \"https://perl.objex.ai/zeroperl-1.0.1.wasm\";\ntype FetchLike = (...args: unknown[]) => Promise<Response>;\n\nexport type ExifTags = Record<\n  string,\n  string | number | boolean | (string | number | boolean)[]\n>;\n\n/**\n * Configuration options for parsing file metadata with ExifTool\n * @template TransformReturn The type of the transformed output data\n */\nexport interface ExifToolOptions<TransformReturn = unknown> {\n  /**\n   * Additional command-line arguments to pass to ExifTool\n   *\n   * @example\n   * // Extract specific tags\n   * args: [\"-Author\", \"-CreateDate\"]\n   *\n   * @example\n   * // Output as JSON\n   * args: [\"-json\", \"-n\"]\n   *\n   * @see https://exiftool.org/exiftool_pod.html for all available options\n   */\n  args?: string[];\n\n  /**\n   * Custom fetch implementation for loading the WASM module\n   *\n   * Only needed for environments with custom fetch polyfills\n   */\n  fetch?: FetchLike;\n\n  /**\n   * Transform the raw ExifTool output into a different format\n   *\n   * @example\n   * // Parse output as JSON\n   * transform: (data) => JSON.parse(data)\n   */\n  transform?: (data: string) => TransformReturn;\n\n  /**\n   * The ExifTool_config\n   */\n  config?: Binaryfile | File;\n}\n\nconst textDecoder = new TextDecoder();\n\n/**\n * Represents a binary file for metadata extraction\n */\ntype Binaryfile = {\n  /** Filename with extension (e.g., \"image.jpg\") */\n  name: string;\n  /** The binary content of the file */\n  data: Uint8Array | Blob;\n};\n\n/**\n * Result of an ExifTool metadata extraction operation\n * @template TOutput The type of the output data after transformation\n */\ntype ExifToolOutput<TOutput> =\n  | {\n      /** True when metadata was successfully extracted */\n      success: true;\n      /** The extracted metadata, transformed if a transform function was provided */\n      data: TOutput;\n      /** Any warnings or info messages from ExifTool */\n      error: string;\n      /** Always 0 for success */\n      exitCode: 0;\n    }\n  | {\n      /** False when metadata extraction failed */\n      success: false;\n      /** No data available on failure */\n      data: undefined;\n      /** Error message explaining why the operation failed */\n      error: string;\n      /** Non-zero exit code indicating the type of failure */\n      exitCode: number | undefined;\n    };\n\n/**\n * Extract metadata from a file using ExifTool\n *\n * @template TReturn Type of the returned data after transformation (defaults to string)\n * @param file File to extract metadata from\n * @param options Configuration options\n * @returns Promise resolving to the extraction result\n *\n * @example\n * // Basic usage with browser File object\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async () => {\n *   const file = input.files[0];\n *   const result = await parseMetadata(file);\n *   if (result.success) {\n *     console.log(result.data); // Raw ExifTool output as string\n *   }\n * });\n *\n * @example\n * // Extract specific tags and transform to JSON\n * const result = await parseMetadata(file, {\n *   args: [\"-json\"],\n *   transform: (data) => JSON.parse(data)\n * });\n * if (result.success) {\n *   console.log(result.data); // Typed access to specific metadata\n * }\n */\nexport async function parseMetadata<TReturn = string>(\n  file: Binaryfile | File,\n  options: ExifToolOptions<TReturn> = {}\n): Promise<ExifToolOutput<TReturn>> {\n  const fileSystem = new MemoryFileSystem({\n    \"/\": \"\",\n  });\n\n  fileSystem.addFile(\"/exiftool\", exiftool);\n  if (file instanceof File) {\n    fileSystem.addFile(`/${file.name}`, file);\n  } else {\n    fileSystem.addFile(`/${file.name}`, file.data);\n  }\n  if (options.config) {\n    if (options.config instanceof File) {\n      fileSystem.addFile(`/${options.config.name}`, options.config);\n    } else {\n      fileSystem.addFile(`/${options.config.name}`, options.config.data);\n    }\n    options.args = options.args || [];\n    options.args.push(`-config=${options.config.name}`);\n  }\n  const stdout = new StringBuilder();\n  const stderr = new StringBuilder();\n  const args = [\"zeroperl\", \"exiftool\"].concat(options.args || []);\n  args.push(`/${file.name}`);\n  const wasiOptions: WASIOptions = {\n    env: {\n      LC_ALL: \"C\",\n      PERL_UNICODE: \"SAD\",\n    },\n    args: args,\n    features: [\n      useEnviron,\n      useArgs,\n      useRandom,\n      useClock,\n      useProc,\n      useMemoryFS({\n        withFileSystem: fileSystem,\n        withStdIo: {\n          stdout: (str) => {\n            let data: string;\n            if (ArrayBuffer.isView(str)) {\n              data = textDecoder.decode(str);\n            } else {\n              data = str;\n            }\n            if (StringBuilder.isMultiline(data)) {\n              stdout.append(data);\n            } else {\n              stdout.appendLine(data);\n            }\n          },\n          stderr: (str) => {\n            let data: string;\n            if (ArrayBuffer.isView(str)) {\n              data = textDecoder.decode(str);\n            } else {\n              data = str;\n            }\n            if (StringBuilder.isMultiline(data)) {\n              stderr.append(data);\n            } else {\n              stderr.appendLine(data);\n            }\n          },\n        },\n      }),\n    ],\n  };\n  const wasi = new WASI(wasiOptions);\n  const f = options.fetch ?? fetch;\n  const { instance } = await instantiateStreaming(f(cdn), {\n    wasi_snapshot_preview1: wasi.wasiImport,\n  });\n  const exitCode = await wasi.start(instance);\n  if (exitCode !== 0) {\n    return {\n      success: false,\n      data: undefined,\n      error: stderr.toString(),\n      exitCode,\n    };\n  }\n  let data: TReturn;\n  if (options.transform) {\n    data = options.transform(stdout.toString());\n  } else {\n    data = stdout.toString() as unknown as TReturn;\n  }\n  return {\n    success: true,\n    data: data,\n    error: stderr.toString(),\n    exitCode,\n  };\n}\n\nfunction transformTags(tags: ExifTags): string[] {\n  return Object.entries(tags).flatMap(([name, value]) =>\n    Array.isArray(value)\n      ? value.map((value) => `-${name}=${value}`)\n      : [`-${name}=${value}`]\n  );\n}\n\n/**\n * Write metadata to a file using ExifTool\n *\n * This function modifies an existing file by writing new metadata tags or updating existing ones.\n * The operation runs entirely in the browser using WebAssembly without requiring server uploads.\n *\n * @template TReturn Type of the returned data after transformation (defaults to Uint8Array)\n * @param file File to write metadata to (Browser File object or Binaryfile)\n * @param tags Object containing metadata tags to write, where keys are tag names and values are tag values\n * @param options Configuration options for the write operation\n * @returns Promise resolving to the write operation result containing the modified file data\n *\n * @example\n * // Basic usage with browser File object\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async () => {\n *   const file = input.files[0];\n *   const result = await writeMetadata(file, {\n *     'Author': 'John Doe',\n *     'Title': 'My Photo',\n *     'Keywords': 'nature,photography'\n *   });\n *\n *   if (result.success) {\n *     // result.data contains the modified file as Uint8Array\n *     const modifiedBlob = new Blob([result.data]);\n *     // Save or use the modified file\n *   }\n * });\n *\n * @example\n * // Writing multiple tag types\n * const result = await writeMetadata(file, {\n *   'Author': 'Jane Smith',\n *   'Rating': 5,\n *   'Keywords': ['landscape', 'sunset', 'beach'],\n *   'GPS:GPSLatitude': 40.7128,\n *   'GPS:GPSLongitude': -74.0060,\n *   'EXIF:Copyright': '© 2025 Jane Smith'\n * });\n *\n * @example\n * // Using with custom ExifTool config\n * const result = await writeMetadata(file, tags, {\n *   config: configFile,\n *   args: ['-overwrite_original', '-P']\n * });\n *\n * @example\n * // Handle errors properly\n * try {\n *   const result = await writeMetadata(file, tags);\n *   if (result.success) {\n *     console.log('Metadata written successfully');\n *     downloadFile(result.data, `modified_${file.name}`);\n *   } else {\n *     console.error('Write failed:', result.error);\n *   }\n * } catch (error) {\n *   console.error('Operation failed:', error);\n * }\n *\n * @remarks\n * - The function creates a temporary output file internally and returns its contents\n * - Original file is not modified in place; a new file with metadata is generated\n * - Supports all ExifTool-compatible metadata formats (EXIF, IPTC, XMP, etc.)\n * - Tag names should follow ExifTool conventions (e.g., 'EXIF:Artist', 'XMP:Creator')\n * - Array values in tags are automatically converted to multiple ExifTool arguments\n * - The returned Uint8Array can be converted to a Blob for download or further processing\n *\n * @see {@link https://exiftool.org/TagNames/index.html} for complete tag reference\n * @see {@link parseMetadata} for reading metadata from files\n *\n * @since 1.0.4\n */\nexport async function writeMetadata(\n  file: Binaryfile | File,\n  tags: ExifTags,\n  options: ExifToolOptions = {}\n): Promise<ExifToolOutput<ArrayBuffer>> {\n  const fileSystem = new MemoryFileSystem({\n    \"/\": \"\",\n  });\n\n  const args = options.args || [];\n\n  fileSystem.addFile(\"/exiftool\", exiftool);\n  if (file instanceof File) {\n    fileSystem.addFile(`/${file.name}`, file);\n  } else {\n    fileSystem.addFile(`/${file.name}`, file.data);\n  }\n\n  if (options.config) {\n    if (options.config instanceof File) {\n      fileSystem.addFile(`/${options.config.name}`, options.config);\n    } else {\n      fileSystem.addFile(`/${options.config.name}`, options.config.data);\n    }\n    args.push(`-config=${options.config.name}`);\n  }\n\n  args.push(...transformTags(tags));\n  const tempFile = `/${crypto.randomUUID().replace(/-/g, \"\")}.tmp`;\n\n  const exiftoolArgs = [\"zeroperl\", \"exiftool\"];\n  exiftoolArgs.push(...args);\n  exiftoolArgs.push(\"-o\", tempFile);\n  exiftoolArgs.push(`/${file.name}`);\n\n  const stdout = new StringBuilder();\n  const stderr = new StringBuilder();\n\n  const wasiOptions: WASIOptions = {\n    env: {\n      LC_ALL: \"C\",\n      PERL_UNICODE: \"SAD\",\n    },\n    args: exiftoolArgs,\n    features: [\n      useEnviron,\n      useArgs,\n      useRandom,\n      useClock,\n      useProc,\n      useMemoryFS({\n        withFileSystem: fileSystem,\n        withStdIo: {\n          stdout: (str) => {\n            let data: string;\n            if (ArrayBuffer.isView(str)) {\n              data = textDecoder.decode(str);\n            } else {\n              data = str;\n            }\n            if (StringBuilder.isMultiline(data)) {\n              stdout.append(data);\n            } else {\n              stdout.appendLine(data);\n            }\n          },\n          stderr: (str) => {\n            let data: string;\n            if (ArrayBuffer.isView(str)) {\n              data = textDecoder.decode(str);\n            } else {\n              data = str;\n            }\n            if (StringBuilder.isMultiline(data)) {\n              stderr.append(data);\n            } else {\n              stderr.appendLine(data);\n            }\n          },\n        },\n      }),\n    ],\n  };\n\n  const wasi = new WASI(wasiOptions);\n  const f = options.fetch ?? fetch;\n  const { instance } = await instantiateStreaming(f(cdn), {\n    wasi_snapshot_preview1: wasi.wasiImport,\n  });\n\n  const exitCode = await wasi.start(instance);\n\n  if (exitCode !== 0) {\n    return {\n      success: false,\n      data: undefined,\n      error: stderr.toString(),\n      exitCode,\n    };\n  }\n\n  const node = fileSystem.lookup(tempFile);\n  if (!node || node.type !== \"file\") {\n    return {\n      success: false,\n      data: undefined,\n      error: `Temporary output file not found: ${tempFile}`,\n      exitCode,\n    };\n  }\n\n  const outputData =\n    node.content instanceof Blob\n      ? await node.content.arrayBuffer()\n      : (node.content.buffer as ArrayBuffer);\n  return {\n    success: true,\n    data: outputData,\n    error: stderr.toString(),\n    exitCode,\n  };\n}\n"],
  "mappings": "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",
  "names": ["asyncGeneratorStep", "gen", "resolve", "reject", "_next", "_throw", "key", "arg", "info", "value", "error", "done", "Promise", "then", "_async_to_generator", "fn", "self", "args", "arguments", "apply", "err", "undefined", "_instanceof", "left", "right", "Symbol", "hasInstance", "_instanceof1", "_array_with_holes", "arr", "Array", "isArray", "_iterable_to_array_limit", "arr", "i", "_i", "Symbol", "iterator", "_arr", "_n", "_d", "_s", "_e", "call", "next", "done", "push", "value", "length", "err", "_non_iterable_rest", "TypeError", "_array_like_to_array", "arr", "len", "length", "i", "arr2", "Array", "_unsupported_iterable_to_array", "o", "minLen", "_array_like_to_array", "n", "Object", "prototype", "toString", "call", "slice", "name", "Array", "from", "test", "_sliced_to_array", "arr", "i", "_array_with_holes", "_iterable_to_array_limit", "_unsupported_iterable_to_array", "_non_iterable_rest", "_array_without_holes", "arr", "Array", "isArray", "_array_like_to_array", "_iterable_to_array", "iter", "Symbol", "iterator", "Array", "from", "_non_iterable_spread", "TypeError", "_to_consumable_array", "arr", "_array_without_holes", "_iterable_to_array", "_unsupported_iterable_to_array", "_non_iterable_spread", "_type_of", "obj", "Symbol", "__generator", "thisArg", "body", "_", "label", "sent", "t", "trys", "ops", "f", "y", "g", "Object", "create", "Iterator", "prototype", "next", "verb", "Symbol", "iterator", "n", "v", "step", "op", "TypeError", "call", "done", "value", "pop", "length", "push", "e", "exiftool_raw_default", "ex_default", "exiftool", "_class_call_check", "instance", "Constructor", "_instanceof1", "TypeError", "_defineProperties", "target", "props", "i", "length", "descriptor", "enumerable", "configurable", "writable", "Object", "defineProperty", "key", "_create_class", "Constructor", "protoProps", "staticProps", "prototype", "_define_property", "obj", "key", "value", "Object", "defineProperty", "enumerable", "configurable", "writable", "WASIAbi", "_define_property", "encoder", "decoder", "TextEncoder", "TextDecoder", "writeString", "memory", "value", "offset", "bytes", "encode", "buffer", "Uint8Array", "length", "set", "readString", "ptr", "len", "decode", "byteLength", "iovViews", "iovs", "iovsLen", "iovsBuffers", "iovsOffset", "i", "getUint32", "iovec_t", "bufferOffset", "lengthOffset", "push", "size", "writeFilestat", "filetype", "setBigUint64", "BigInt", "setUint8", "setUint32", "writeFdstat", "flags", "setUint16", "WASI_ESUCCESS", "WASI_ERRNO_BADF", "WASI_ENOSYS", "WASI_CLOCK_REALTIME", "WASI_CLOCK_MONOTONIC", "WASI_ERRNO_ISDIR", "WASI_ERRNO_INVAL", "WASI_ERRNO_NOTDIR", "WASI_ERRNO_NOENT", "WASI_ERRNO_EXIST", "WASI_ERRNO_IO", "WASI_FILETYPE_CHARACTER_DEVICE", "WASI_FILETYPE_DIRECTORY", "WASI_FILETYPE_REGULAR_FILE", "IMPORT_FUNCTIONS", "WASIProcExit", "code", "exitCode", "WritableTextProxy", "handler", "outputBuffers", "_define_property", "decoder", "TextDecoder", "writev", "iovs", "totalBufferSize", "reduce", "acc", "iov", "byteLength", "offset", "concatBuffer", "Uint8Array", "_iteratorNormalCompletion", "_didIteratorError", "_iteratorError", "_iterator", "_step", "buffer", "set", "err", "lines", "decode", "length", "readv", "_iovs", "close", "ReadableTextProxy", "consume", "encoder", "pending", "TextEncoder", "consumePending", "requestLength", "result", "slice", "read", "remaining", "consumed", "newData", "bytes", "_instanceof1", "encode", "bindStdio", "useOptions", "stdin", "stdout", "console", "log", "stderr", "error", "MemoryFileSystem", "preopens", "_define_property", "root", "preopenPaths", "type", "entries", "ensureDir", "setNode", "kind", "_iteratorNormalCompletion", "_didIteratorError", "_iteratorError", "_iterator", "Object", "keys", "_step", "guestPath", "push", "err", "removeFile", "path", "normalizedPath", "normalizePath", "parts", "split", "filter", "p", "length", "fileName", "pop", "dirPath", "join", "dir", "addFile", "content", "data", "TextEncoder", "encode", "createFile", "fileNode", "node", "Error", "getDevNull", "lookup", "getPreopenPaths", "_to_consumable_array", "current", "part", "resolve", "relativePath", "next", "createFileIn", "Uint8Array", "withLeadingSlash", "startsWith", "normalized", "replace", "useMemoryFS", "useOptions", "wasiOptions", "abi", "memoryView", "getFileFromPath", "fd", "files", "file", "getFileFromFD", "fileDescriptor", "getFileSize", "_instanceof1", "Blob", "size", "byteLength", "fileSystem", "withFileSystem", "bindStdio", "withStdIo", "forEach", "entry", "position", "isPreopen", "nextFd", "preopenPath", "fd_read", "iovs", "iovsLen", "nread", "view", "iovViews", "bytesRead", "available", "totalRead", "blob", "buf", "bytesToRead", "chunk", "_iteratorNormalCompletion1", "_didIteratorError1", "_iteratorError1", "_iterator1", "_step1", "WASIAbi", "WASI_ERRNO_BADF", "readv", "setUint32", "WASI_ESUCCESS", "WASI_ERRNO_ISDIR", "Math", "min", "slice", "arrayBuffer", "_state", "set", "ArrayBuffer", "isView", "fd_write", "nwritten", "totalWritten", "bytesWritten", "writev", "total", "reduce", "acc", "WASI_ERRNO_INVAL", "pos", "dataToWrite", "requiredLength", "newContent", "fd_close", "close", "fd_seek", "offset", "whence", "newOffset", "fileLength", "Number", "fd_tell", "offset_ptr", "setBigUint64", "BigInt", "fd_fdstat_get", "filetype", "WASI_FILETYPE_CHARACTER_DEVICE", "WASI_FILETYPE_DIRECTORY", "WASI_FILETYPE_REGULAR_FILE", "writeFdstat", "fd_filestat_get", "writeFilestat", "fd_prestat_get", "setUint8", "pathStr", "fd_prestat_dir_name", "pathPtr", "pathLen", "i", "charCodeAt", "fd_open", "dirfd", "oflags", "_fs_rights_base", "_fs_rights_inheriting", "_fdflags", "opened_fd", "WASI_ERRNO_NOTDIR", "dirEntry", "readString", "endsWith", "existing", "target", "O_CREAT", "O_EXCL", "O_TRUNC", "WASI_ERRNO_EXIST", "WASI_ERRNO_NOENT", "path_open", "_dirflags", "path_filestat_get", "flags", "guestRelPath", "basePath", "fullGuestPath", "_object_spread", "target", "i", "arguments", "length", "source", "ownKeys", "Object", "keys", "getOwnPropertySymbols", "concat", "filter", "sym", "getOwnPropertyDescriptor", "enumerable", "forEach", "key", "_define_property", "useArgs", "options", "abi", "memoryView", "args", "args_get", "argv", "argvBuf", "offsetOffset", "bufferOffset", "view", "_iteratorNormalCompletion", "_didIteratorError", "_iteratorError", "_iterator", "_step", "arg", "setUint32", "writeString", "err", "WASIAbi", "WASI_ESUCCESS", "args_sizes_get", "argc", "argvBufSize", "length", "bufferSize", "reduce", "acc", "byteLength", "useClock", "options", "abi", "memoryView", "clock_res_get", "clockId", "resolution", "resolutionValue", "WASIAbi", "WASI_CLOCK_MONOTONIC", "WASI_CLOCK_REALTIME", "WASI_ENOSYS", "view", "setUint32", "WASI_ESUCCESS", "clock_time_get", "precision", "time", "nowMs", "performance", "now", "Date", "BigInt", "msToNs", "ms", "msInt", "Math", "trunc", "decimal", "round", "ns", "setBigUint64", "useEnviron", "options", "abi", "memoryView", "environ_get", "environ", "environBuf", "offsetOffset", "bufferOffset", "view", "key", "env", "value", "setUint32", "writeString", "WASIAbi", "WASI_ESUCCESS", "environ_sizes_get", "environBufSize", "Object", "keys", "length", "entries", "reduce", "acc", "byteLength", "useProc", "options", "abi", "memoryView", "proc_exit", "code", "WASIProcExit", "proc_raise", "signal", "WASIAbi", "WASI_ESUCCESS", "useRandom", "options", "abi", "memoryView", "random_get", "bufferOffset", "length", "view", "buffer", "Uint8Array", "crypto", "getRandomValues", "WASIAbi", "WASI_ESUCCESS", "WASI", "options", "_define_property", "wasiImport", "instance", "isStarted", "abi", "WASIAbi", "features", "importProviders", "_iteratorNormalCompletion", "_didIteratorError", "_iteratorError", "_iterator", "_step", "useFeature", "featureName", "name", "imports", "view", "bind", "key", "previousProvider", "Error", "_object_spread", "err", "_iteratorNormalCompletion1", "_didIteratorError1", "_iteratorError1", "_iterator1", "IMPORT_FUNCTIONS", "_step1", "WASI_ENOSYS", "exports", "memory", "_instanceof1", "WebAssembly", "Memory", "DataView", "buffer", "start", "e", "_start", "_state", "WASI_ESUCCESS", "WASIProcExit", "code", "_get_prototype_of", "o", "Object", "setPrototypeOf", "getPrototypeOf", "__proto__", "_is_native_reflect_construct", "result", "Boolean", "prototype", "valueOf", "call", "Reflect", "construct", "_", "_assert_this_initialized", "self", "ReferenceError", "_possible_constructor_return", "self", "call", "_type_of", "_assert_this_initialized", "_call_super", "_this", "derived", "args", "_get_prototype_of", "_possible_constructor_return", "_is_native_reflect_construct", "Reflect", "construct", "apply", "_super_prop_base", "object", "property", "Object", "prototype", "hasOwnProperty", "call", "_get_prototype_of", "_get", "target", "property", "receiver", "Reflect", "get", "base", "_super_prop_base", "desc", "Object", "getOwnPropertyDescriptor", "call", "value", "_set_prototype_of", "o", "p", "Object", "setPrototypeOf", "__proto__", "_inherits", "subClass", "superClass", "TypeError", "prototype", "Object", "create", "value", "writable", "configurable", "_set_prototype_of", "DATA_ADDR", "DATA_START", "DATA_END", "WRAPPED_EXPORTS", "WeakMap", "isPromise", "obj", "_type_of", "then", "proxyGet", "transform", "Proxy", "get", "name", "Asyncify", "_define_property", "value", "undefined", "exports", "getState", "Error", "asyncify_get_state", "assertNoneState", "state", "wrapImportFn", "fn", "args", "_this", "asyncify_stop_rewind", "_to_consumable_array", "asyncify_start_unwind", "DATA_ADDR", "wrapModuleImports", "module", "wrapImports", "imports", "moduleImports", "Object", "create", "wrapExportFn", "newExport", "WRAPPED_EXPORTS", "result", "asyncify_stop_unwind", "_", "_state", "asyncify_start_rewind", "set", "wrapExports", "newExports", "exportName", "startsWith", "defineProperty", "enumerable", "init", "instance", "memory", "env", "Int32Array", "buffer", "DATA_START", "DATA_END", "setPrototypeOf", "Instance", "prototype", "_WebAssembly_Instance", "_call_super", "_get", "_get_prototype_of", "WebAssembly", "instantiateStreaming", "source", "StringBuilder", "initialValue", "_define_property", "parts", "append", "str", "push", "appendLine", "length", "toString", "join", "isMultiline", "lineBreakCount", "i", "cdn", "textDecoder", "TextDecoder", "parseMetadata", "file", "options", "fileSystem", "stdout", "stderr", "args", "wasiOptions", "wasi", "f", "instance", "exitCode", "data", "MemoryFileSystem", "addFile", "exiftool", "_instanceof1", "File", "name", "config", "push", "StringBuilder", "concat", "env", "LC_ALL", "PERL_UNICODE", "features", "useEnviron", "useArgs", "useRandom", "useClock", "useProc", "useMemoryFS", "withFileSystem", "withStdIo", "str", "ArrayBuffer", "isView", "decode", "isMultiline", "append", "appendLine", "WASI", "fetch", "instantiateStreaming", "wasi_snapshot_preview1", "wasiImport", "_state", "start", "success", "undefined", "error", "toString", "transform", "transformTags", "tags", "Object", "entries", "flatMap", "param", "value", "Array", "isArray", "map", "writeMetadata", "exiftoolArgs", "tempFile", "node", "outputData", "_to_consumable_array", "crypto", "randomUUID", "replace", "lookup", "type", "content", "Blob", "arrayBuffer", "buffer"]
}
