package com.l7tech.server.service.resolution;

import com.l7tech.gateway.common.audit.AuditFactory;
import com.l7tech.gateway.common.service.PublishedService;
import com.l7tech.gateway.common.transport.ResolutionConfiguration;
import com.l7tech.message.Message;
import com.l7tech.message.UriKnob;
import com.l7tech.objectmodel.Goid;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Level;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class UriResolver extends ServiceResolver<String> {
   protected static final String SUFFIX_EXACT_ONLY;
   protected final String PROP_EXACT_ONLY;
   private final boolean b;
   private final ArrayList<String> c;
   private final Map<UriResolver.URIResolutionParam, List<Goid>> d;
   private final Map<Goid, UriResolver.URIResolutionParam> e;
   private final Executor f;
   private TrieBasedResolver g;
   private final ReadWriteLock h;
   private static final UriResolver.URIResolutionParam i;
   private final AtomicBoolean j;
   private final AtomicBoolean k;
   private static final String[] m;

   public UriResolver(AuditFactory var1) {
      this(var1, true);
   }

   protected UriResolver(AuditFactory var1, boolean var2) {
      super(var1);
      this.PROP_EXACT_ONLY = this.PROP_BASE + m[5];
      this.c = new ArrayList<>();
      this.d = new HashMap<>();
      this.e = new HashMap<>();
      this.f = Executors.newSingleThreadExecutor();
      this.h = new ReentrantReadWriteLock(false);
      this.j = new AtomicBoolean(true);
      this.k = new AtomicBoolean(true);
      this.b = var2;
      this.a();
      this.g = this.b();
   }

   @Override
   public void configure(ResolutionConfiguration var1) {
      super.configure(var1);
      this.j.set(var1.isPathCaseSensitive());
      this.k.set(var1.isUseL7OriginalUrl());
   }

   @Override
   public boolean usesMessageContent() {
      return false;
   }

   private void a() {
      ConfigFactory.addListener(new i(this), new String[0]);
   }

   private Result a(String param1, Collection<PublishedService> param2, boolean param3) {
      // $VF: Couldn't be decompiled
      // Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 000: aload 0
      // 001: getfield com/l7tech/server/service/resolution/UriResolver.d Ljava/util/Map;
      // 004: new com/l7tech/server/service/resolution/UriResolver$URIResolutionParam
      // 007: dup
      // 008: aload 1
      // 009: invokespecial com/l7tech/server/service/resolution/UriResolver$URIResolutionParam.<init> (Ljava/lang/String;)V
      // 00c: invokeinterface java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object; 2
      // 011: checkcast java/util/List
      // 014: astore 4
      // 016: aload 4
      // 018: ifnull 076
      // 01b: aload 4
      // 01d: invokeinterface java/util/List.size ()I 1
      // 022: ifle 076
      // 025: goto 02c
      // 028: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 02b: athrow
      // 02c: aload 0
      // 02d: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 030: ifnull 055
      // 033: goto 03a
      // 036: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 039: athrow
      // 03a: aload 0
      // 03b: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 03e: getstatic com/l7tech/gateway/common/audit/MessageProcessingMessages.SR_HTTPURI_PERFECT Lcom/l7tech/gateway/common/audit/Messages$M;
      // 041: bipush 1
      // 042: anewarray 342
      // 045: dup
      // 046: bipush 0
      // 047: aload 1
      // 048: aastore
      // 049: invokeinterface com/l7tech/gateway/common/audit/Audit.logAndAudit (Lcom/l7tech/gateway/common/audit/AuditDetailMessage;[Ljava/lang/String;)V 3
      // 04e: goto 055
      // 051: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 054: athrow
      // 055: aload 0
      // 056: aload 2
      // 057: aload 4
      // 059: invokevirtual com/l7tech/server/service/resolution/UriResolver.b (Ljava/util/Collection;Ljava/util/List;)Ljava/util/Set;
      // 05c: astore 5
      // 05e: aload 5
      // 060: invokeinterface java/util/Set.size ()I 1
      // 065: ifle 076
      // 068: new com/l7tech/server/service/resolution/Result
      // 06b: dup
      // 06c: aload 5
      // 06e: invokespecial com/l7tech/server/service/resolution/Result.<init> (Ljava/util/Set;)V
      // 071: areturn
      // 072: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 075: athrow
      // 076: iload 3
      // 077: ifeq 082
      // 07a: getstatic com/l7tech/server/service/resolution/Result.NO_MATCH Lcom/l7tech/server/service/resolution/Result;
      // 07d: areturn
      // 07e: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 081: athrow
      // 082: aload 0
      // 083: aload 1
      // 084: invokevirtual com/l7tech/server/service/resolution/UriResolver.b (Ljava/lang/String;)Ljava/util/Set;
      // 087: astore 5
      // 089: bipush 0
      // 08a: istore 6
      // 08c: bipush 0
      // 08d: istore 7
      // 08f: new java/util/ArrayList
      // 092: dup
      // 093: invokespecial java/util/ArrayList.<init> ()V
      // 096: astore 8
      // 098: aload 5
      // 09a: invokeinterface java/util/Set.iterator ()Ljava/util/Iterator; 1
      // 09f: astore 9
      // 0a1: aload 9
      // 0a3: invokeinterface java/util/Iterator.hasNext ()Z 1
      // 0a8: ifeq 127
      // 0ab: aload 9
      // 0ad: invokeinterface java/util/Iterator.next ()Ljava/lang/Object; 1
      // 0b2: checkcast com/l7tech/server/service/resolution/UriResolver$URIResolutionParam
      // 0b5: astore 10
      // 0b7: aload 10
      // 0b9: getfield com/l7tech/server/service/resolution/UriResolver$URIResolutionParam.c Z
      // 0bc: ifeq 124
      // 0bf: aload 0
      // 0c0: aload 2
      // 0c1: aload 0
      // 0c2: getfield com/l7tech/server/service/resolution/UriResolver.d Ljava/util/Map;
      // 0c5: aload 10
      // 0c7: invokeinterface java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object; 2
      // 0cc: checkcast java/util/List
      // 0cf: invokevirtual com/l7tech/server/service/resolution/UriResolver.a (Ljava/util/Collection;Ljava/util/List;)Z
      // 0d2: ifeq 124
      // 0d5: goto 0dc
      // 0d8: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 0db: athrow
      // 0dc: aload 10
      // 0de: getfield com/l7tech/server/service/resolution/UriResolver$URIResolutionParam.d Z
      // 0e1: ifne 104
      // 0e4: goto 0eb
      // 0e7: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 0ea: athrow
      // 0eb: aload 10
      // 0ed: getfield com/l7tech/server/service/resolution/UriResolver$URIResolutionParam.b Ljava/lang/Object;
      // 0f0: checkcast java/util/regex/Pattern
      // 0f3: aload 1
      // 0f4: invokevirtual java/util/regex/Pattern.matcher (Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
      // 0f7: invokevirtual java/util/regex/Matcher.matches ()Z
      // 0fa: ifeq 124
      // 0fd: goto 104
      // 100: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 103: athrow
      // 104: aload 10
      // 106: getfield com/l7tech/server/service/resolution/UriResolver$URIResolutionParam.e Z
      // 109: ifeq 119
      // 10c: goto 113
      // 10f: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 112: athrow
      // 113: bipush 1
      // 114: istore 6
      // 116: goto 11c
      // 119: bipush 1
      // 11a: istore 7
      // 11c: aload 8
      // 11e: aload 10
      // 120: invokevirtual java/util/ArrayList.add (Ljava/lang/Object;)Z
      // 123: pop
      // 124: goto 0a1
      // 127: aload 8
      // 129: invokevirtual java/util/ArrayList.size ()I
      // 12c: ifgt 15c
      // 12f: aload 0
      // 130: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 133: ifnull 158
      // 136: goto 13d
      // 139: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 13c: athrow
      // 13d: aload 0
      // 13e: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 141: getstatic com/l7tech/gateway/common/audit/MessageProcessingMessages.SR_HTTPURI_WILD_NONE Lcom/l7tech/gateway/common/audit/Messages$M;
      // 144: bipush 1
      // 145: anewarray 342
      // 148: dup
      // 149: bipush 0
      // 14a: aload 1
      // 14b: aastore
      // 14c: invokeinterface com/l7tech/gateway/common/audit/Audit.logAndAudit (Lcom/l7tech/gateway/common/audit/AuditDetailMessage;[Ljava/lang/String;)V 3
      // 151: goto 158
      // 154: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 157: athrow
      // 158: getstatic com/l7tech/server/service/resolution/Result.NO_MATCH Lcom/l7tech/server/service/resolution/Result;
      // 15b: areturn
      // 15c: aload 8
      // 15e: invokevirtual java/util/ArrayList.size ()I
      // 161: bipush 1
      // 162: if_icmpne 1b1
      // 165: aload 0
      // 166: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 169: ifnull 18e
      // 16c: goto 173
      // 16f: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 172: athrow
      // 173: aload 0
      // 174: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 177: getstatic com/l7tech/gateway/common/audit/MessageProcessingMessages.SR_HTTPURI_WILD_ONE Lcom/l7tech/gateway/common/audit/Messages$M;
      // 17a: bipush 1
      // 17b: anewarray 342
      // 17e: dup
      // 17f: bipush 0
      // 180: aload 1
      // 181: aastore
      // 182: invokeinterface com/l7tech/gateway/common/audit/Audit.logAndAudit (Lcom/l7tech/gateway/common/audit/AuditDetailMessage;[Ljava/lang/String;)V 3
      // 187: goto 18e
      // 18a: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 18d: athrow
      // 18e: aload 0
      // 18f: getfield com/l7tech/server/service/resolution/UriResolver.d Ljava/util/Map;
      // 192: aload 8
      // 194: bipush 0
      // 195: invokevirtual java/util/ArrayList.get (I)Ljava/lang/Object;
      // 198: invokeinterface java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object; 2
      // 19d: checkcast java/util/List
      // 1a0: astore 4
      // 1a2: new com/l7tech/server/service/resolution/Result
      // 1a5: dup
      // 1a6: aload 0
      // 1a7: aload 2
      // 1a8: aload 4
      // 1aa: invokevirtual com/l7tech/server/service/resolution/UriResolver.b (Ljava/util/Collection;Ljava/util/List;)Ljava/util/Set;
      // 1ad: invokespecial com/l7tech/server/service/resolution/Result.<init> (Ljava/util/Set;)V
      // 1b0: areturn
      // 1b1: aload 0
      // 1b2: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 1b5: ifnull 1d3
      // 1b8: aload 0
      // 1b9: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 1bc: getstatic com/l7tech/gateway/common/audit/MessageProcessingMessages.SR_HTTPURI_WILD_MULTI Lcom/l7tech/gateway/common/audit/Messages$M;
      // 1bf: bipush 1
      // 1c0: anewarray 342
      // 1c3: dup
      // 1c4: bipush 0
      // 1c5: aload 1
      // 1c6: aastore
      // 1c7: invokeinterface com/l7tech/gateway/common/audit/Audit.logAndAudit (Lcom/l7tech/gateway/common/audit/AuditDetailMessage;[Ljava/lang/String;)V 3
      // 1cc: goto 1d3
      // 1cf: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 1d2: athrow
      // 1d3: aload 8
      // 1d5: iload 6
      // 1d7: iload 7
      // 1d9: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/util/List;ZZ)Lcom/l7tech/server/service/resolution/UriResolver$URIResolutionParam;
      // 1dc: astore 9
      // 1de: aload 0
      // 1df: getfield com/l7tech/server/service/resolution/UriResolver.d Ljava/util/Map;
      // 1e2: aload 9
      // 1e4: invokeinterface java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object; 2
      // 1e9: checkcast java/util/List
      // 1ec: astore 4
      // 1ee: new com/l7tech/server/service/resolution/Result
      // 1f1: dup
      // 1f2: aload 0
      // 1f3: aload 2
      // 1f4: aload 4
      // 1f6: invokevirtual com/l7tech/server/service/resolution/UriResolver.b (Ljava/util/Collection;Ljava/util/List;)Ljava/util/Set;
      // 1f9: invokespecial com/l7tech/server/service/resolution/Result.<init> (Ljava/util/Set;)V
      // 1fc: areturn
      // try (9 -> 14): 15 java/lang/RuntimeException
      // try (11 -> 20): 21 java/lang/RuntimeException
      // try (17 -> 33): 34 java/lang/RuntimeException
      // try (41 -> 49): 49 java/lang/RuntimeException
      // try (51 -> 55): 55 java/lang/RuntimeException
      // try (79 -> 91): 92 java/lang/RuntimeException
      // try (82 -> 97): 98 java/lang/RuntimeException
      // try (94 -> 107): 108 java/lang/RuntimeException
      // try (100 -> 113): 114 java/lang/RuntimeException
      // try (126 -> 132): 133 java/lang/RuntimeException
      // try (129 -> 145): 146 java/lang/RuntimeException
      // try (150 -> 157): 158 java/lang/RuntimeException
      // try (154 -> 170): 171 java/lang/RuntimeException
      // try (189 -> 202): 203 java/lang/RuntimeException
   }

   @Override
   public void populateResolutionParameters(Message var1, Map<String, Object> var2) throws ServiceResolutionException {
      if (this.appliesToMessage(var1)) {
         String var3 = this.a(var1);
         var2.put(this.PROP_VALUE, var3);
      }
   }

   @Override
   public Result resolve(Map<String, Object> param1, Collection<PublishedService> param2) throws ServiceResolutionException {
      // $VF: Couldn't be decompiled
      // Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 00: aload 0
      // 01: getfield com/l7tech/server/service/resolution/UriResolver.b Z
      // 04: aload 0
      // 05: getfield com/l7tech/server/service/resolution/UriResolver.j Ljava/util/concurrent/atomic/AtomicBoolean;
      // 08: invokevirtual java/util/concurrent/atomic/AtomicBoolean.get ()Z
      // 0b: if_icmpeq 16
      // 0e: getstatic com/l7tech/server/service/resolution/Result.NOT_APPLICABLE Lcom/l7tech/server/service/resolution/Result;
      // 11: areturn
      // 12: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 15: athrow
      // 16: aload 1
      // 17: aload 0
      // 18: getfield com/l7tech/server/service/resolution/UriResolver.PROP_VALUE Ljava/lang/String;
      // 1b: invokeinterface java/util/Map.containsKey (Ljava/lang/Object;)Z 2
      // 20: ifne 2b
      // 23: getstatic com/l7tech/server/service/resolution/Result.NOT_APPLICABLE Lcom/l7tech/server/service/resolution/Result;
      // 26: areturn
      // 27: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 2a: athrow
      // 2b: aload 0
      // 2c: aload 1
      // 2d: aload 0
      // 2e: getfield com/l7tech/server/service/resolution/UriResolver.PROP_VALUE Ljava/lang/String;
      // 31: invokeinterface java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object; 2
      // 36: checkcast java/lang/String
      // 39: invokevirtual com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/String;)Ljava/lang/String;
      // 3c: astore 3
      // 3d: getstatic java/lang/Boolean.TRUE Ljava/lang/Boolean;
      // 40: aload 1
      // 41: aload 0
      // 42: getfield com/l7tech/server/service/resolution/UriResolver.PROP_EXACT_ONLY Ljava/lang/String;
      // 45: invokeinterface java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object; 2
      // 4a: invokevirtual java/lang/Boolean.equals (Ljava/lang/Object;)Z
      // 4d: istore 4
      // 4f: aload 0
      // 50: getfield com/l7tech/server/service/resolution/UriResolver.h Ljava/util/concurrent/locks/ReadWriteLock;
      // 53: invokeinterface java/util/concurrent/locks/ReadWriteLock.readLock ()Ljava/util/concurrent/locks/Lock; 1
      // 58: invokeinterface java/util/concurrent/locks/Lock.lock ()V 1
      // 5d: aload 0
      // 5e: getfield com/l7tech/server/service/resolution/UriResolver.c Ljava/util/ArrayList;
      // 61: aload 3
      // 62: invokevirtual java/util/ArrayList.contains (Ljava/lang/Object;)Z
      // 65: ifeq 92
      // 68: aload 0
      // 69: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 6c: getstatic com/l7tech/gateway/common/audit/MessageProcessingMessages.SR_HTTPURI_CACHEDFAIL Lcom/l7tech/gateway/common/audit/Messages$M;
      // 6f: bipush 1
      // 70: anewarray 342
      // 73: dup
      // 74: bipush 0
      // 75: aload 3
      // 76: aastore
      // 77: invokeinterface com/l7tech/gateway/common/audit/Audit.logAndAudit (Lcom/l7tech/gateway/common/audit/AuditDetailMessage;[Ljava/lang/String;)V 3
      // 7c: getstatic com/l7tech/server/service/resolution/Result.NO_MATCH Lcom/l7tech/server/service/resolution/Result;
      // 7f: astore 5
      // 81: aload 0
      // 82: getfield com/l7tech/server/service/resolution/UriResolver.h Ljava/util/concurrent/locks/ReadWriteLock;
      // 85: invokeinterface java/util/concurrent/locks/ReadWriteLock.readLock ()Ljava/util/concurrent/locks/Lock; 1
      // 8a: invokeinterface java/util/concurrent/locks/Lock.unlock ()V 1
      // 8f: aload 5
      // 91: areturn
      // 92: aload 0
      // 93: aload 3
      // 94: aload 2
      // 95: iload 4
      // 97: invokevirtual com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/String;Ljava/util/Collection;Z)Lcom/l7tech/server/service/resolution/Result;
      // 9a: astore 5
      // 9c: aload 5
      // 9e: getstatic com/l7tech/server/service/resolution/Result.NO_MATCH Lcom/l7tech/server/service/resolution/Result;
      // a1: if_acmpne c0
      // a4: iload 4
      // a6: ifne c0
      // a9: goto b0
      // ac: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // af: athrow
      // b0: aload 0
      // b1: getfield com/l7tech/server/service/resolution/UriResolver.c Ljava/util/ArrayList;
      // b4: aload 3
      // b5: invokevirtual java/util/ArrayList.add (Ljava/lang/Object;)Z
      // b8: pop
      // b9: goto c0
      // bc: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // bf: athrow
      // c0: aload 5
      // c2: astore 6
      // c4: aload 0
      // c5: getfield com/l7tech/server/service/resolution/UriResolver.h Ljava/util/concurrent/locks/ReadWriteLock;
      // c8: invokeinterface java/util/concurrent/locks/ReadWriteLock.readLock ()Ljava/util/concurrent/locks/Lock; 1
      // cd: invokeinterface java/util/concurrent/locks/Lock.unlock ()V 1
      // d2: aload 6
      // d4: areturn
      // d5: astore 7
      // d7: aload 0
      // d8: getfield com/l7tech/server/service/resolution/UriResolver.h Ljava/util/concurrent/locks/ReadWriteLock;
      // db: invokeinterface java/util/concurrent/locks/ReadWriteLock.readLock ()Ljava/util/concurrent/locks/Lock; 1
      // e0: invokeinterface java/util/concurrent/locks/Lock.unlock ()V 1
      // e5: aload 7
      // e7: athrow
      // try (10 -> 17): 17 com/l7tech/server/service/resolution/ServiceResolutionException
      // try (0 -> 8): 8 com/l7tech/server/service/resolution/ServiceResolutionException
      // try (38 -> 55): 91 null
      // try (70 -> 80): 81 com/l7tech/server/service/resolution/ServiceResolutionException
      // try (67 -> 72): 73 com/l7tech/server/service/resolution/ServiceResolutionException
      // try (61 -> 85): 91 null
      // try (91 -> 92): 91 null
   }

   private String a(String var1) {
      String var2;
      try {
         String[] var4 = m;
         var2 = URLDecoder.decode(var1, var4[1]);
      } catch (UnsupportedEncodingException var5) {
         throw new RuntimeException(m[4]);
      }

      try {
         if (this.b || var1 == null) {
            return var2;
         }
      } catch (UnsupportedEncodingException var6) {
         throw a(var6);
      }

      return var1.toLowerCase();
   }

   private boolean a(Collection<PublishedService> var1, List<Goid> var2) {
      try {
         if (this.serviceResolutionHelper != null) {
            return this.serviceResolutionHelper.anyMatch(var2);
         }
      } catch (RuntimeException var6) {
         throw a(var6);
      }

      for (PublishedService var4 : var1) {
         try {
            if (var2.contains(var4.getGoid())) {
               return true;
            }
         } catch (RuntimeException var5) {
            throw a(var5);
         }
      }

      return false;
   }

   private Set<PublishedService> b(Collection<PublishedService> var1, List<Goid> var2) {
      try {
         if (this.serviceResolutionHelper != null) {
            return this.serviceResolutionHelper.narrowList(var2);
         }
      } catch (RuntimeException var7) {
         throw a(var7);
      }

      HashSet var3 = new HashSet();

      for (PublishedService var5 : var1) {
         try {
            if (var2.contains(var5.getGoid())) {
               var3.add(var5);
            }
         } catch (RuntimeException var6) {
            throw a(var6);
         }
      }

      return var3;
   }

   @Override
   public void serviceDeleted(PublishedService var1) {
      this.h.writeLock().lock();

      try {
         this.a(var1);
      } finally {
         this.h.writeLock().unlock();
      }
   }

   @Override
   public void serviceUpdated(PublishedService var1) throws ServiceResolutionException {
      this.h.writeLock().lock();

      try {
         this.serviceDeleted(var1);
         this.serviceCreated(var1);
      } finally {
         this.h.writeLock().unlock();
      }
   }

   @Override
   protected List<String> buildTargetValues(PublishedService var1) {
      String var2 = var1.getRoutingUri();
      if (var2 == null) {
         var2 = "";
      }

      return Collections.singletonList(this.a(var2));
   }

   @Override
   protected void updateServiceValues(PublishedService var1, List<String> var2) {
      this.h.writeLock().lock();

      try {
         for (String var4 : var2) {
            this.a(var1, var4);
         }

         this.c.clear();
      } finally {
         this.h.writeLock().unlock();
      }
   }

   private Set<UriResolver.URIResolutionParam> b(String var1) {
      List var2 = this.g.search(var1);

      try {
         if (var2 == null) {
            return this.d.keySet();
         }
      } catch (RuntimeException var3) {
         throw a(var3);
      }

      try {
         if (var2.isEmpty()) {
            return Collections.emptySet();
         }
      } catch (RuntimeException var4) {
         throw a(var4);
      }

      return var2.stream().map(this.e::get).filter(Objects::nonNull).collect(Collectors.toSet());
   }

   private TrieBasedResolver b() {
      boolean var1 = TrieBasedResolver.isResolverEnabled();
      boolean var2 = TrieBasedResolver.useInStrictMode();

      try {
         if (var1) {
            this.logger.log(Level.INFO, m[9], new Object[]{this.b, var2});
            return new TrieBasedResolver(var2);
         }
      } catch (RuntimeException var3) {
         throw a(var3);
      }

      return TrieBasedResolver.NOOP_RESOLVER;
   }

   private void a(TrieBasedResolver var1) {
      this.g = var1;
   }

   private void c() {
      TrieBasedResolver var1 = this.b();

      try {
         if (var1 == TrieBasedResolver.NOOP_RESOLVER) {
            this.logger.log(Level.INFO, m[0], this.b);
            this.a(var1);
            return;
         }
      } catch (RuntimeException var2) {
         throw a(var2);
      }

      this.f.execute(() -> {
         try {
            this.b(var1);
            this.a(var1);
            String[] var3 = m;
            this.logger.log(Level.INFO, var3[2], this.b);
         } catch (Exception var4) {
            this.logger.log(Level.WARNING, m[6], new Object[]{this.b, ExceptionUtils.getMessageWithCause(var4)});
         }
      });
   }

   private void b(TrieBasedResolver var1) {
      this.h.writeLock().lock();

      try {
         for (PublishedService var4 : this.serviceResolutionHelper.allServices()) {
            String var5 = var4.getRoutingUri();
            if (var5 != null) {
               UriResolver.URIResolutionParam var6 = new UriResolver.URIResolutionParam(this.a(var5));

               try {
                  if (var6.c) {
                     var1.insert(var6.a, var4.getGoid());
                  }
               } catch (RuntimeException var10) {
                  throw a(var10);
               }
            }
         }
      } finally {
         this.h.writeLock().unlock();
      }
   }

   private void a(PublishedService var1, String var2) {
      UriResolver.URIResolutionParam var3 = new UriResolver.URIResolutionParam(var2);
      List var4 = this.d.get(var3);
      if (var4 == null) {
         var4 = new ArrayList();
         this.d.put(var3, var4);
      }

      try {
         var4.add(var1.getGoid());
         this.e.put(var1.getGoid(), var3);
         if (var3.c) {
            this.g.insert(var3.a, var1.getGoid());
         }
      } catch (RuntimeException var5) {
         throw a(var5);
      }
   }

   private void a(PublishedService var1) {
      UriResolver.URIResolutionParam var2 = this.e.get(var1.getGoid());

      try {
         if (var2 == null) {
            return;
         }
      } catch (RuntimeException var5) {
         throw a(var5);
      }

      List var3 = this.d.get(var2);

      try {
         var3.remove(var1.getGoid());
         this.e.remove(var1.getGoid());
         if (var2.c) {
            this.g.delete(var2.a, var1.getGoid());
         }
      } catch (RuntimeException var4) {
         throw a(var4);
      }
   }

   private static UriResolver.URIResolutionParam a(List<UriResolver.URIResolutionParam> var0, boolean var1, boolean var2) {
      try {
         var0.remove(i);
         if (var0.size() == 1) {
            return (UriResolver.URIResolutionParam)var0.get(0);
         }
      } catch (RuntimeException var9) {
         throw a(var9);
      }

      label63: {
         try {
            if (!var1 || !var2) {
               break label63;
            }
         } catch (RuntimeException var11) {
            throw a(var11);
         }

         Iterator var3 = var0.iterator();

         while (var3.hasNext()) {
            UriResolver.URIResolutionParam var4 = (UriResolver.URIResolutionParam)var3.next();

            try {
               if (!var4.e) {
                  var3.remove();
               }
            } catch (RuntimeException var8) {
               throw a(var8);
            }
         }
      }

      try {
         if (var0.size() == 1) {
            return (UriResolver.URIResolutionParam)var0.get(0);
         }
      } catch (RuntimeException var10) {
         throw a(var10);
      }

      long var12 = 0L;
      UriResolver.URIResolutionParam var5 = null;

      for (UriResolver.URIResolutionParam var7 : var0) {
         if (var7.a.length() > var12) {
            var5 = var7;
            var12 = var7.a.length();
         }
      }

      return var5;
   }

   private String a(Message param1) throws ServiceResolutionException {
      // $VF: Couldn't be decompiled
      // Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 000: aload 1
      // 001: ldc com/l7tech/message/UriKnob
      // 003: invokevirtual com/l7tech/message/Message.getKnob (Ljava/lang/Class;)Ljava/lang/Object;
      // 006: checkcast com/l7tech/message/UriKnob
      // 009: astore 2
      // 00a: aload 2
      // 00b: ifnonnull 020
      // 00e: new com/l7tech/server/service/resolution/ServiceResolutionException
      // 011: dup
      // 012: getstatic com/l7tech/server/service/resolution/UriResolver.m [Ljava/lang/String;
      // 015: bipush 10
      // 017: aaload
      // 018: invokespecial com/l7tech/server/service/resolution/ServiceResolutionException.<init> (Ljava/lang/String;)V
      // 01b: athrow
      // 01c: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 01f: athrow
      // 020: aload 2
      // 021: invokeinterface com/l7tech/message/UriKnob.getRequestUri ()Ljava/lang/String; 1
      // 026: astore 3
      // 027: aload 1
      // 028: ldc com/l7tech/message/HttpRequestKnob
      // 02a: invokevirtual com/l7tech/message/Message.getKnob (Ljava/lang/Class;)Ljava/lang/Object;
      // 02d: checkcast com/l7tech/message/HttpRequestKnob
      // 030: astore 4
      // 032: aload 4
      // 034: ifnull 0d3
      // 037: aload 0
      // 038: getfield com/l7tech/server/service/resolution/UriResolver.k Ljava/util/concurrent/atomic/AtomicBoolean;
      // 03b: invokevirtual java/util/concurrent/atomic/AtomicBoolean.get ()Z
      // 03e: ifeq 059
      // 041: goto 048
      // 044: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 047: athrow
      // 048: aload 4
      // 04a: getstatic com/l7tech/common/protocol/SecureSpanConstants$HttpHeaders.ORIGINAL_URL Ljava/lang/String;
      // 04d: invokeinterface com/l7tech/message/HttpRequestKnob.getHeaderFirstValue (Ljava/lang/String;)Ljava/lang/String; 2
      // 052: goto 05a
      // 055: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 058: athrow
      // 059: aconst_null
      // 05a: astore 5
      // 05c: aload 5
      // 05e: ifnull 0d3
      // 061: new java/net/URL
      // 064: dup
      // 065: aload 5
      // 067: invokespecial java/net/URL.<init> (Ljava/lang/String;)V
      // 06a: astore 6
      // 06c: aload 6
      // 06e: invokevirtual java/net/URL.getFile ()Ljava/lang/String;
      // 071: astore 3
      // 072: aload 3
      // 073: getstatic com/l7tech/common/protocol/SecureSpanConstants.SSG_RESERVEDURI_PREFIX Ljava/lang/String;
      // 076: invokevirtual java/lang/String.startsWith (Ljava/lang/String;)Z
      // 079: ifne 08c
      // 07c: aload 3
      // 07d: ldc "/"
      // 07f: invokevirtual java/lang/String.equals (Ljava/lang/Object;)Z
      // 082: ifeq 08f
      // 085: goto 08c
      // 088: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 08b: athrow
      // 08c: ldc ""
      // 08e: astore 3
      // 08f: aload 0
      // 090: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 093: getstatic com/l7tech/gateway/common/audit/MessageProcessingMessages.SR_HTTPURI_URI_FROM_HEADER Lcom/l7tech/gateway/common/audit/Messages$M;
      // 096: bipush 1
      // 097: anewarray 342
      // 09a: dup
      // 09b: bipush 0
      // 09c: aload 3
      // 09d: aastore
      // 09e: invokeinterface com/l7tech/gateway/common/audit/Audit.logAndAudit (Lcom/l7tech/gateway/common/audit/AuditDetailMessage;[Ljava/lang/String;)V 3
      // 0a3: aload 3
      // 0a4: areturn
      // 0a5: astore 6
      // 0a7: getstatic com/l7tech/server/service/resolution/UriResolver.m [Ljava/lang/String;
      // 0aa: bipush 8
      // 0ac: aaload
      // 0ad: bipush 1
      // 0ae: anewarray 188
      // 0b1: dup
      // 0b2: bipush 0
      // 0b3: aload 5
      // 0b5: aastore
      // 0b6: invokestatic java/text/MessageFormat.format (Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
      // 0b9: astore 7
      // 0bb: aload 0
      // 0bc: getfield com/l7tech/server/service/resolution/UriResolver.logger Ljava/util/logging/Logger;
      // 0bf: getstatic java/util/logging/Level.WARNING Ljava/util/logging/Level;
      // 0c2: aload 7
      // 0c4: aload 6
      // 0c6: invokevirtual java/util/logging/Logger.log (Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Throwable;)V
      // 0c9: new com/l7tech/server/service/resolution/ServiceResolutionException
      // 0cc: dup
      // 0cd: aload 7
      // 0cf: invokespecial com/l7tech/server/service/resolution/ServiceResolutionException.<init> (Ljava/lang/String;)V
      // 0d2: athrow
      // 0d3: aload 3
      // 0d4: ifnull 0e8
      // 0d7: aload 3
      // 0d8: getstatic com/l7tech/common/protocol/SecureSpanConstants.SSG_RESERVEDURI_PREFIX Ljava/lang/String;
      // 0db: invokevirtual java/lang/String.startsWith (Ljava/lang/String;)Z
      // 0de: ifeq 0eb
      // 0e1: goto 0e8
      // 0e4: invokestatic com/l7tech/server/service/resolution/UriResolver.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 0e7: athrow
      // 0e8: ldc ""
      // 0ea: astore 3
      // 0eb: aload 0
      // 0ec: getfield com/l7tech/server/service/resolution/UriResolver.auditor Lcom/l7tech/gateway/common/audit/Audit;
      // 0ef: getstatic com/l7tech/gateway/common/audit/MessageProcessingMessages.SR_HTTPURI_REAL_URI Lcom/l7tech/gateway/common/audit/Messages$M;
      // 0f2: bipush 1
      // 0f3: anewarray 342
      // 0f6: dup
      // 0f7: bipush 0
      // 0f8: aload 3
      // 0f9: aastore
      // 0fa: invokeinterface com/l7tech/gateway/common/audit/Audit.logAndAudit (Lcom/l7tech/gateway/common/audit/AuditDetailMessage;[Ljava/lang/String;)V 3
      // 0ff: aload 3
      // 100: areturn
      // try (51 -> 59): 60 java/net/MalformedURLException
      // try (26 -> 37): 37 java/net/MalformedURLException
      // try (24 -> 30): 31 java/net/MalformedURLException
      // try (5 -> 14): 14 java/net/MalformedURLException
      // try (43 -> 75): 76 java/net/MalformedURLException
      // try (99 -> 105): 106 java/net/MalformedURLException
   }

   public boolean appliesToMessage(Message var1) {
      return canResolveByURI(var1);
   }

   public static boolean canResolveByURI(Message var0) {
      try {
         if (var0.getKnob(UriKnob.class) != null) {
            return true;
         }
      } catch (RuntimeException var1) {
         throw a(var1);
      }

      return false;
   }

   static {
      String[] var5 = new String[11];
      int var3 = 0;
      String var2 = "c[8e\u007f2\\FJ<b+/BB\u001e?gx/\nPW5bh:XC\u001e\fTB{XBM6j}>X\u0007\u0016:gx>\u0007T[7ub/CQ[d};&\u0003\u0005rj\u001f+3Ju[?tn(BBZyrc>\nA_*r+,CKZ:gy?\nrl\u0010&y>YHR/cy{\u0002D_*c&(OIM0rb-O\u001aEi{\"{YR]:cx(LRR5\u007f\u0002\b\u0014\u0017sV0u+(BHK5b+5ES\u001e1g{+OI\u001f\n\t[!gh/eIR ^bL+iy{OI]6se/OU[=&b5\nU[?tn(BNP>&\u007f3O\u0007X8u\u007f{]NR=ej)N\u0007k\u000bO+)OTQ5pn)\n\u000f]8unvYBP*o\u007f2\\B\u0003\"6vr\u0006\u0007]8sx>\u0017\\\u000e$\n\t[!gh/eIR &nP/gg2N\u0007rn+D)C@W7ggv\u007furypj7_B\u0004y!, \u001aZ\u0019~";
      int var4 = "c[8e\u007f2\\FJ<b+/BB\u001e?gx/\nPW5bh:XC\u001e\fTB{XBM6j}>X\u0007\u0016:gx>\u0007T[7ub/CQ[d};&\u0003\u0005rj\u001f+3Ju[?tn(BBZyrc>\nA_*r+,CKZ:gy?\nrl\u0010&y>YHR/cy{\u0002D_*c&(OIM0rb-O\u001aEi{\"{YR]:cx(LRR5\u007f\u0002\b\u0014\u0017sV0u+(BHK5b+5ES\u001e1g{+OI\u001f\n\t[!gh/eIR ^bL+iy{OI]6se/OU[=&b5\nU[?tn(BNP>&\u007f3O\u0007X8u\u007f{]NR=ej)N\u0007k\u000bO+)OTQ5pn)\n\u000f]8unvYBP*o\u007f2\\B\u0003\"6vr\u0006\u0007]8sx>\u0017\\\u000e$\n\t[!gh/eIR &nP/gg2N\u0007rn+D)C@W7ggv\u007furypj7_B\u0004y!, \u001aZ\u0019~"
         .length();
      char var1 = '?';
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 113;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var8 = b(var10000, d(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     m = var5;
                     SUFFIX_EXACT_ONLY = m[7];
                     i = new UriResolver.URIResolutionParam(m[3]);
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var8;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = "3\u001bk0(e\u0013\u0017Ioq:m\u000e\u0004Iy80h\u001e\u0011\u001bjq\t^4P\u001bk\"3`\u000b\u0015\u001b.y?m\u000e\u0015D}42\u007f\u0014\u0004\u0000x4awM\rE.\"(~\u0014\u0013\u001d#<3h\u0018M\u0012?,u\u001d%\u0007o30i]\u0004\u0006.0?o\u0018\u0003\u001a.#9}\b\u0015\u001azq\t^4^";
                  var4 = "3\u001bk0(e\u0013\u0017Ioq:m\u000e\u0004Iy80h\u001e\u0011\u001bjq\t^4P\u001bk\"3`\u000b\u0015\u001b.y?m\u000e\u0015D}42\u007f\u0014\u0004\u0000x4awM\rE.\"(~\u0014\u0013\u001d#<3h\u0018M\u0012?,u\u001d%\u0007o30i]\u0004\u0006.0?o\u0018\u0003\u001a.#9}\b\u0015\u001azq\t^4^"
                     .length();
                  var1 = 'K';
                  var7 = -1;
            }

            var10000 = 38;
            var10001 = var2.substring(++var7, var7 + var1);
            var10002 = 0;
         }
      }
   }

   private static Exception a(Exception var0) {
      return var0;
   }

   private static char[] d(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 91);
      }

      return var10000;
   }

   private static String b(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 86;
            case 1 -> 79;
            case 2 -> 40;
            case 3 -> 119;
            case 4 -> 122;
            case 5 -> 42;
            default -> 91;
         });
      }

      return new String(var10001).intern();
   }

   public static class URIResolutionParam {
      final String a;
      final Object b;
      final boolean c;
      final boolean d;
      final boolean e;
      private static final String[] f;

      public URIResolutionParam(String var1) {
         while (true) {
            String[] var3 = f;
            if (var1.indexOf(var3[0]) < 0) {
               this.a = var1;
               if (var1.indexOf(42) > 0) {
                  this.e = var1.charAt(var1.length() - 1) == '*';
                  String var10000 = Pattern.quote(var1);
                  var3 = f;
                  String var2 = var10000.replace("*", var3[2]);
                  this.b = Pattern.compile(var2);
                  this.c = true;
                  this.d = var3[1].equals(var1);
               } else {
                  this.b = var1;
                  this.c = false;
                  this.d = false;
                  this.e = true;
               }

               return;
            }

            var1 = var1.replace(var3[3], "*");
         }
      }

      @Override
      public String toString() {
         return this.a;
      }

      @Override
      public boolean equals(Object var1) {
         if (this == var1) {
            return true;
         } else if (var1 instanceof String) {
            return var1.equals(this.a);
         } else if (var1 != null && this.getClass() == var1.getClass()) {
            UriResolver.URIResolutionParam var2 = (UriResolver.URIResolutionParam)var1;
            return this.a != null ? this.a.equals(var2.a) : var2.a == null;
         } else {
            return false;
         }
      }

      @Override
      public int hashCode() {
         return this.a.hashCode();
      }

      static {
         String[] var5 = new String[4];
         int var3 = 0;
         String var2 = "9\u001f\u0002<\u001f";
         int var4 = "9\u001f\u0002<\u001f".length();
         char var1 = 2;
         int var7 = -1;

         label24:
         while (true) {
            byte var10000 = 56;
            String var10001 = var2.substring(++var7, var7 + var1);
            byte var10002 = -1;

            while (true) {
               String var8 = a(var10000, a(var10001));
               switch (var10002) {
                  case 0:
                     var5[var3++] = var8;
                     if ((var7 += var1) >= var4) {
                        f = var5;
                        return;
                     }

                     var1 = var2.charAt(var7);
                     break;
                  default:
                     var5[var3++] = var8;
                     if ((var7 += var1) < var4) {
                        var1 = var2.charAt(var7);
                        continue label24;
                     }

                     var2 = "uJ=6\u00027\u0002\u0003%";
                     var4 = "uJ=6\u00027\u0002\u0003%".length();
                     var1 = 6;
                     var7 = -1;
               }

               var10000 = 2;
               var10001 = var2.substring(++var7, var7 + var1);
               var10002 = 0;
            }
         }
      }

      private static char[] a(String var0) {
         char[] var10000 = var0.toCharArray();
         if (var10000.length < 2) {
            var10000[0] = (char)(var10000[0] ^ 115);
         }

         return var10000;
      }

      private static String a(int var0, char[] var1) {
         int var10003 = var1.length;
         int var10002 = var0;
         char[] var10001 = var1;
         int var10000 = var10003;

         for (int var2 = 0; var10000 > var2; var2++) {
            var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
               case 0 -> 43;
               case 1 -> 13;
               case 2 -> 17;
               case 3 -> 30;
               case 4 -> 92;
               case 5 -> 100;
               default -> 115;
            });
         }

         return new String(var10001).intern();
      }
   }
}
