diff --git a/CHANGELOG.md b/CHANGELOG.md index df4c53f09..052c7e4cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,8 @@ All notable changes to this project will be documented in this file. - Error log window shows last 100 log entries (instead of first 100) - AS1/2 P-code double Push values have suffix ".0" to properly distinguish them - AS1/2 P-code float Push values have suffix "f" to properly distinguish them +- AS1/2: Export names are deobfuscated only when start with `__Packages.`, + if not, then classical escaping is performed (with quotes) ## [24.0.1] - 2025-06-27 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java index d3abe96c5..6925e8914 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java @@ -245,17 +245,15 @@ public class DoInitActionTag extends Tag implements CharacterIdTag, ASMSource { @Override public Map getNameProperties() { - String expName = swf == null ? "" : swf.getExportName(spriteId); + String exportName = swf == null ? "" : swf.getExportName(spriteId); Map ret = super.getNameProperties(); ret.put("sid", "" + spriteId); - if (expName == null || expName.isEmpty()) { + if (exportName == null || exportName.isEmpty()) { return ret; } - //String[] pathParts = expName.contains(".") ? expName.split("\\.") : new String[]{expName}; - //ret.put("exp", pathParts[pathParts.length - 1]); - ret.put("exp", expName); + ret.put("exp", Helper.escapeExportname(exportName, true)); return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java index 34205662c..cb0de5895 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ExportAssetsTag.java @@ -28,6 +28,7 @@ import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.flash.types.annotations.Table; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; +import com.jpexs.helpers.Helper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -58,7 +59,7 @@ public class ExportAssetsTag extends SymbolClassTypeTag { @SWFArray(value = "name", countField = "count") @Table(value = "assets", itemName = "asset") - @DottedIdentifier + @DottedIdentifier(exportName = true) public List names; /** @@ -164,7 +165,8 @@ public class ExportAssetsTag extends SymbolClassTypeTag { Map ret = super.getNameProperties(); if (names.size() == 1) { ret.put("chid", "" + tags.get(0)); - ret.put("ex", "" + DottedChain.parseNoSuffix(names.get(0)).toPrintableString(false)); + String exportName = names.get(0); + ret.put("exp", Helper.escapeExportname(exportName, true)); } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java index 7c3646c24..1110247bd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssets2Tag.java @@ -162,7 +162,12 @@ public class ImportAssets2Tag extends Tag implements ImportTag { Map ret = super.getNameProperties(); if (names.size() == 1) { ret.put("chid", "" + tags.get(0)); - ret.put("im", "" + DottedChain.parseNoSuffix(names.get(0)).toPrintableString(false)); + String importName = names.get(0); + if (importName.startsWith("__Packages.")) { + ret.put("imp", DottedChain.parseNoSuffix(importName).toPrintableString(false)); + } else { + ret.put("imp", "\"" + Helper.escapePCodeString(importName) + "\""); + } } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java index fd59babb6..b1d156ffb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/ImportAssetsTag.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.flash.types.annotations.Table; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; +import com.jpexs.helpers.Helper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -138,7 +139,13 @@ public class ImportAssetsTag extends Tag implements ImportTag { Map ret = super.getNameProperties(); if (names.size() == 1) { ret.put("chid", "" + tags.get(0)); - ret.put("im", "" + DottedChain.parseNoSuffix(names.get(0)).toPrintableString(false)); + + String importName = names.get(0); + if (importName.startsWith("__Packages.")) { + ret.put("imp", DottedChain.parseNoSuffix(importName).toPrintableString(false)); + } else { + ret.put("imp", "\"" + Helper.escapePCodeString(importName) + "\""); + } } return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java index 7dd12bed5..c934b95bb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java @@ -131,7 +131,7 @@ public class PlaceObject2Tag extends PlaceObjectTypeTag implements ASMSourceCont * If PlaceFlagHasName, Name of character */ @Conditional("placeFlagHasName") - @DottedIdentifier + @DottedIdentifier public String name; /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java index 508422334..0ca67b187 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/CharacterTag.java @@ -99,7 +99,7 @@ public abstract class CharacterTag extends Tag implements CharacterIdTag { ret.put("chid", "" + chid); } if (exportName != null) { - ret.put("exp", DottedChain.parseNoSuffix(exportName).toPrintableString(false)); + ret.put("exp", Helper.escapeExportname(exportName, true)); } if (!classNames.isEmpty()) { List escapedList = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java index ac90433cf..264217511 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/PlaceObjectTypeTag.java @@ -25,7 +25,9 @@ import com.jpexs.decompiler.flash.types.ColorTransform; import com.jpexs.decompiler.flash.types.MATRIX; import com.jpexs.decompiler.flash.types.RGBA; import com.jpexs.decompiler.flash.types.filters.FILTER; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; +import com.jpexs.helpers.Helper; import java.io.IOException; import java.util.HashMap; import java.util.List; @@ -336,7 +338,7 @@ public abstract class PlaceObjectTypeTag extends Tag implements CharacterIdTag, ret.put("chid", "" + charId); } if (exportName != null) { - ret.put("exp", exportName); + ret.put("exp", Helper.escapeExportname(exportName, true)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/RemoveTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/RemoveTag.java index 87a795e52..32562b205 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/RemoveTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/RemoveTag.java @@ -18,7 +18,9 @@ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; +import com.jpexs.helpers.Helper; import java.util.Map; /** @@ -48,7 +50,7 @@ public abstract class RemoveTag extends Tag implements DepthTag { ret.put("chid", "" + getCharacterId()); } if (exportName != null) { - ret.put("exp", exportName); + ret.put("exp", Helper.escapeExportname(exportName, true)); } ret.put("dpt", "" + getDepth()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/annotations/DottedIdentifier.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/annotations/DottedIdentifier.java index 88a065c68..0e26b2b15 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/annotations/DottedIdentifier.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/annotations/DottedIdentifier.java @@ -30,4 +30,5 @@ import java.lang.annotation.Target; @Target(ElementType.FIELD) public @interface DottedIdentifier { boolean as3() default false; + boolean exportName() default false; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java index 6400b6d85..b1b2f37ca 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/Helper.java @@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.ApplicationInfo; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.helpers.Freed; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.helpers.utf8.Utf8Helper; @@ -237,6 +238,31 @@ public class Helper { return sb.toString(); } + /** + * Escapes export name + * @param s Input string + * @param quote Add quotes when not starts __Packages. + * @return Escaped string + */ + public static String escapeExportname(String s, boolean quote) { + if (s.startsWith("__Packages.")) { + return DottedChain.parseNoSuffix(s).toPrintableString(false); + } + return (quote ? "\"" : "") + escapePCodeString(s) + (quote ? "\"" : ""); + } + + /** + * Unescape export name + * @param s Input string + * @return Unescaped string + */ + public static String unescapeExportname(String s) { + if (s.startsWith("__Packages.")) { + return DottedChain.parsePrintable(s).toRawString(); + } + return unescapePCodeString(s); + } + /** * Escapes string by adding backslashes * @@ -285,6 +311,58 @@ public class Helper { return ret.toString(); } + /** + * Unescapes PCode String + * @param s Input string + * @return Unescaped string + */ + public static String unescapePCodeString(String s) { + StringBuilder ret = new StringBuilder(s.length()); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == '\\') { + if (i + 1 < s.length() - 1) { + i++; + c = s.charAt(i); + if (c == 'n') { + ret.append("\n"); + } else if (c == 'r') { + ret.append("\r"); + } else if (c == 't') { + ret.append("\t"); + } else if (c == 'b') { + ret.append("\b"); + } else if (c == 'f') { + ret.append("\f"); + } else if (c == '\\') { + ret.append("\\"); + } else if (c == '"') { + ret.append("\""); + } else if (c == '\'') { + ret.append("'"); + } else if (c == 'x' && i + 2 < s.length() - 1) { + ret.append((char) Integer.parseInt(s.substring(i + 1, i + 3), 16)); + i += 2; + } else if (c == '{') { + int endPos = s.indexOf("}", i); + if (endPos != -1) { + int numRepeat = Integer.parseInt(s.substring(i + 1, endPos)); + i = endPos + 1; + c = s.charAt(i); + for (int j = 0; j < numRepeat; j++) { + ret.append(c); + } + } + } + } + } else { + ret.append(c); + } + } + + return ret.toString(); + } + /** * Escapes string by adding backslashes - limits to english characters - * other are unicode escaped. diff --git a/libsrc/ffdec_lib/testdata/as2/as2.swf b/libsrc/ffdec_lib/testdata/as2/as2.swf index 06dca9a55..0b85f614d 100644 Binary files a/libsrc/ffdec_lib/testdata/as2/as2.swf and b/libsrc/ffdec_lib/testdata/as2/as2.swf differ diff --git a/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml b/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml index 69dabfab7..069102500 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/DOMDocument.xml @@ -8,7 +8,7 @@ - + @@ -28,10 +28,10 @@ - + - + @@ -761,9 +761,9 @@ +!3156 7501[3091 7490 3054 7490!3054 7490[3050 7494 3050 7457!3050 7457[3050 7441 3159 7239!3159 7239[3270 7033 3327 6947!3327 6947[3353 6908 3412 6794!3412 6794[3470 6682 3500 6639!3500 6639[3602 6491 3649 6692!3649 6692|3713 6670!3713 + 6670[3760 6655 3782 6655!3782 6655[3942 6655 3985 6781!3985 6781[4007 6844 3996 6914!3996 6914[3996 6948 3999 6995!3999 6995[4000 7031 3993 7054!3993 7054[3976 7106 3860 7224!3860 7224[3847 7237 3741 7292!3741 7292[3638 7346 3616 7372 +!3616 7372[3594 7396 3511 7442!3511 7442[3435 7483 3427 7483!3427 7483[3409 7483 3407 7468!3407 7468[3405 7453 3386 7453!3386 7453[3361 7468 3330 7483!3330 7483[3270 7512 3235 7512!3235 7512[3220 7512 3156 7501"/> + - + @@ -1009,7 +1009,7 @@ - + @@ -3479,6 +3479,9 @@ switch(test) + + + @@ -3496,8 +3499,5 @@ switch(test) - - - \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/Tween 5.xml b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/Tween 5.xml index f2cf87b50..0ffd1c7e9 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/Tween 5.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/Tween 5.xml @@ -1,4 +1,4 @@ - + diff --git a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml index 32e670e1f..f59b98d61 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/LIBRARY/blue.xml @@ -1,4 +1,4 @@ - + @@ -36,8 +36,8 @@ trace("init_blue"); - + diff --git a/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml b/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml index fc9515dac..cc69783f7 100644 --- a/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml +++ b/libsrc/ffdec_lib/testdata/as2/as2/META-INF/metadata.xml @@ -5,8 +5,8 @@ xmlns:xmp="http://ns.adobe.com/xap/1.0/"> Adobe Flash CS4 Professional 2010-08-03T10:48:58+02:00 - 2025-07-13T10:54:33-07:00 - 2025-07-13T10:54:33-07:00 + 2025-07-21T09:57:55-07:00 + 2025-07-21T09:57:55-07:00 @@ -22,7 +22,7 @@ xmp.did:8DD71700DC9EDF1194ADAC9B23608190 xmp.did:F0EB4FF7CAC3ED11AC9DC078F41E1AA7 - xmp.iid:587E6B88F65FF0119C96D9FB8C6458ED + xmp.iid:5606F1423266F01194B1B97CA76F6B16 xmp.did:8DD71700DC9EDF1194ADAC9B23608190 @@ -494,6 +494,12 @@ 2010-08-03T10:48:58+02:00 Adobe Flash Professional CS6 - build 481 + + created + xmp.iid:5606F1423266F01194B1B97CA76F6B16 + 2010-08-03T10:48:58+02:00 + Adobe Flash Professional CS6 - build 481 + diff --git a/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache index 339afd1f2..70f06d085 100644 Binary files a/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache and b/libsrc/ffdec_lib/testdata/as2/as2/bin/SymDepend.cache differ diff --git a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java index e36566106..5c7b57f42 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.tags.DoInitActionTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.timeline.FrameScript; import com.jpexs.decompiler.flash.treeitems.TreeItem; +import com.jpexs.helpers.Helper; import com.jpexs.helpers.SerializableImage; import java.awt.Color; import java.awt.Dimension; @@ -256,7 +257,11 @@ public class FolderListPanel extends JPanel { String expName = tag.getSwf().getExportName(tag.getCharacterId()); if (expName != null && !expName.isEmpty()) { String[] pathParts = expName.contains(".") ? expName.split("\\.") : new String[]{expName}; - s = IdentifiersDeobfuscation.printIdentifier(false, pathParts[pathParts.length - 1]); + if (expName.startsWith("__Packages.")) { + s = IdentifiersDeobfuscation.printIdentifier(false, pathParts[pathParts.length - 1]); + } else { + s = Helper.escapeExportname(expName, false); + } } } if (s == null) { diff --git a/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java b/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java index 788ea67b3..23f23d0f4 100644 --- a/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java @@ -63,6 +63,7 @@ import com.jpexs.decompiler.flash.types.filters.CONVOLUTIONFILTER; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.ByteArrayRange; import com.jpexs.helpers.ConcreteClasses; +import com.jpexs.helpers.Helper; import com.jpexs.helpers.ReflectionTools; import java.awt.BorderLayout; import java.awt.Color; @@ -909,7 +910,11 @@ public class GenericTagTreePanel extends GenericTagPanel { DottedIdentifier di = field.getAnnotation(DottedIdentifier.class); if (val instanceof String && di != null) { - valStr += " = " + DottedChain.parseNoSuffix(val.toString()).toPrintableString(di.as3()); + if (di.exportName()) { + valStr += " = " + Helper.escapeExportname(val.toString(), true); + } else { + valStr += " = " + DottedChain.parseNoSuffix(val.toString()).toPrintableString(di.as3()); + } } else if (val instanceof byte[]) { valStr += " = " + ((byte[]) val).length + " byte"; } else if (val instanceof ByteArrayRange) { diff --git a/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java b/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java index 7fbafb9dc..28cc46b0e 100644 --- a/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java +++ b/src/com/jpexs/decompiler/flash/gui/generictageditors/StringEditor.java @@ -89,7 +89,11 @@ public class StringEditor extends JTextArea implements GenericTagEditor { String newValue = (String) ReflectionTools.getValue(obj, field, index); DottedIdentifier di = field.getAnnotation(DottedIdentifier.class); if (di != null) { - newValue = DottedChain.parseNoSuffix(newValue).toPrintableString(di.as3()); + if (di.exportName()) { + newValue = Helper.escapeExportname(newValue, false); + } else { + newValue = DottedChain.parseNoSuffix(newValue).toPrintableString(di.as3()); + } } setText(newValue); } catch (IllegalArgumentException | IllegalAccessException ex) { @@ -104,7 +108,11 @@ public class StringEditor extends JTextArea implements GenericTagEditor { String newValue = getText(); DottedIdentifier di = field.getAnnotation(DottedIdentifier.class); if (di != null) { - newValue = DottedChain.parsePrintable(newValue).toRawString(); + if (di.exportName()) { + newValue = Helper.unescapeExportname(newValue); + } else { + newValue = DottedChain.parsePrintable(newValue).toRawString(); + } } if (Objects.equals(oldValue, newValue)) { diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index 7a324c8a5..167afd850 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -90,6 +90,7 @@ import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; import com.jpexs.decompiler.flash.treeitems.Openable; import com.jpexs.decompiler.flash.treeitems.OpenableList; import com.jpexs.decompiler.flash.treeitems.TreeItem; +import com.jpexs.helpers.Helper; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; @@ -350,7 +351,11 @@ public class TagTree extends AbstractTagTree { String expName = tag.getSwf().getExportName(tag.getCharacterId()); if (expName != null && !expName.isEmpty()) { String[] pathParts = expName.contains(".") ? expName.split("\\.") : new String[]{expName}; - return IdentifiersDeobfuscation.printIdentifier(false, pathParts[pathParts.length - 1]); + if (expName.startsWith("__Packages.")) { + return IdentifiersDeobfuscation.printIdentifier(false, pathParts[pathParts.length - 1]); + } else { + return Helper.escapeExportname(expName, false); + } } } if (value != null) {