/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.common.io.CertGenParams
 *  com.l7tech.common.io.CertUtils
 *  com.l7tech.gateway.common.LicenseException
 *  com.l7tech.gateway.common.security.keystore.SsgKeyEntry
 *  com.l7tech.gateway.common.transport.SsgConnector$Endpoint
 *  com.l7tech.identity.BadCredentialsException
 *  com.l7tech.identity.IdentityProviderConfig
 *  com.l7tech.identity.IdentityProviderConfigManager
 *  com.l7tech.identity.IssuedCertNotPresentedException
 *  com.l7tech.identity.MissingCredentialsException
 *  com.l7tech.identity.User
 *  com.l7tech.identity.internal.InternalUser
 *  com.l7tech.objectmodel.FindException
 *  com.l7tech.objectmodel.Goid
 *  com.l7tech.objectmodel.UpdateException
 *  com.l7tech.security.prov.JceProvider
 *  com.l7tech.security.prov.RsaSignerEngine
 *  com.l7tech.util.ExceptionUtils
 *  com.l7tech.util.IOUtils
 *  jakarta.servlet.ServletConfig
 *  jakarta.servlet.ServletException
 *  jakarta.servlet.http.HttpServletRequest
 *  jakarta.servlet.http.HttpServletResponse
 *  org.springframework.context.ApplicationEvent
 */
package com.l7tech.server.identity.cert;

import com.l7tech.common.io.CertGenParams;
import com.l7tech.common.io.CertUtils;
import com.l7tech.gateway.common.LicenseException;
import com.l7tech.gateway.common.security.keystore.SsgKeyEntry;
import com.l7tech.gateway.common.transport.SsgConnector;
import com.l7tech.identity.BadCredentialsException;
import com.l7tech.identity.IdentityProviderConfig;
import com.l7tech.identity.IdentityProviderConfigManager;
import com.l7tech.identity.IssuedCertNotPresentedException;
import com.l7tech.identity.MissingCredentialsException;
import com.l7tech.identity.User;
import com.l7tech.identity.internal.InternalUser;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.UpdateException;
import com.l7tech.security.prov.JceProvider;
import com.l7tech.security.prov.RsaSignerEngine;
import com.l7tech.server.AuthenticatableHttpServlet;
import com.l7tech.server.DefaultKey;
import com.l7tech.server.audit.AuditContextUtils;
import com.l7tech.server.event.system.CertificateSigningServiceEvent;
import com.l7tech.server.transport.ListenerException;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.IOUtils;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.logging.Level;
import javax.security.auth.x500.X500Principal;
import org.springframework.context.ApplicationEvent;

public class CSRHandler
extends AuthenticatableHttpServlet {
    private DefaultKey defaultKey;
    private IdentityProviderConfigManager providerConfigManager;
    public static final String AUTH_HEADER_NAME;
    public static final String ROUTED_FROM_PEER;
    private static final String PROP_PKIX_CSR_DEFAULT_EXPIRY_AGE;
    static final long serialVersionUID = -1312528994084368316L;
    private static final String[] b;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
        String[] stringArray = b;
        this.defaultKey = (DefaultKey)this.getApplicationContext().getBean(stringArray[35], DefaultKey.class);
        this.providerConfigManager = (IdentityProviderConfigManager)this.getApplicationContext().getBean(stringArray[29], IdentityProviderConfigManager.class);
    }

    @Override
    protected String getFeature() {
        return b[23];
    }

    @Override
    protected SsgConnector.Endpoint getRequiredEndpoint() {
        return SsgConnector.Endpoint.CSRHANDLER;
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     * Unable to fully structure code
     * Could not resolve type clashes
     */
    protected void doPost(HttpServletRequest var1_1, HttpServletResponse var2_2) throws ServletException, IOException {
        block34: {
            try {
                if (!var1_1.isSecure()) {
                    var2_2.sendError(403, CSRHandler.b[1]);
                    return;
                }
            }
            catch (BadCredentialsException v0) {
                throw CSRHandler.a((Exception)v0);
            }
            try {
                var3_3 = this.authenticateRequestBasic(var1_1);
            }
            catch (BadCredentialsException var4_4) {
                var15_11 = CSRHandler.b;
                var2_2.sendError(401, var15_11[12]);
                this.logger.log(Level.WARNING, var15_11[17] + ExceptionUtils.getMessage((Throwable)var4_4), ExceptionUtils.getDebugException((Throwable)var4_4));
                return;
            }
            catch (MissingCredentialsException var4_5) {
                var15_12 = CSRHandler.b;
                var2_2.sendError(401, var15_12[5]);
                this.logger.log(Level.WARNING, var15_12[18] + ExceptionUtils.getMessage((Throwable)var4_5), ExceptionUtils.getDebugException((Throwable)var4_5));
                return;
            }
            catch (IssuedCertNotPresentedException var4_6) {
                var15_13 = CSRHandler.b;
                this.logger.log(Level.WARNING, var15_13[10]);
                var2_2.sendError(403, var15_13[22]);
                return;
            }
            catch (LicenseException var4_7) {
                var15_14 = CSRHandler.b;
                this.logger.log(Level.WARNING, var15_14[8], ExceptionUtils.getDebugException((Throwable)var4_7));
                var2_2.sendError(503, var15_14[6]);
                return;
            }
            catch (ListenerException var4_8) {
                var15_15 = CSRHandler.b;
                this.logger.log(Level.WARNING, var15_15[21], ExceptionUtils.getDebugException((Throwable)var4_8));
                var2_2.sendError(503, var15_15[15]);
                return;
            }
            if (var3_3 == null) ** GOTO lbl43
            try {
                block36: {
                    if (var3_3.length >= 1) break block34;
                    break block36;
                    catch (BadCredentialsException v1) {
                        throw CSRHandler.a((Exception)v1);
                    }
                }
                var2_2.sendError(401, CSRHandler.b[5]);
                this.logger.warning(CSRHandler.b[2]);
                return;
            }
            catch (BadCredentialsException v2) {
                throw CSRHandler.a((Exception)v2);
            }
        }
        if (var3_3.length > 1) {
            var15_16 = CSRHandler.b;
            var4_9 = var15_16[19];
            var2_2.sendError(409, var4_9);
            this.logger.warning(var4_9);
            return;
        }
        var4_10 = var3_3[0];
        var5_20 = var4_10.getUser();
        var6_21 = var4_10.getAuthenticatedCert();
        try {
            if (!this.clientCertManager.userCanGenCert(var5_20, (Certificate)var6_21)) {
                this.logger.log(Level.SEVERE, CSRHandler.b[24] + var5_20.getLogin());
                var2_2.sendError(403, CSRHandler.b[25]);
                return;
            }
        }
        catch (BadCredentialsException v3) {
            throw CSRHandler.a((Exception)v3);
        }
        try {
            var7_22 /* !! */  = var5_20.getProviderId();
            var8_24 = (IdentityProviderConfig)this.providerConfigManager.findByPrimaryKey(var7_22 /* !! */ );
            if (!var8_24.canIssueCertificates()) {
                var15_17 = CSRHandler.b;
                this.logger.log(Level.WARNING, var15_17[4] + var8_24.getName() + var15_17[0]);
                var2_2.sendError(403, var15_17[25]);
                return;
            }
        }
        catch (FindException var7_23) {
            var15_18 = CSRHandler.b;
            this.logger.log(Level.SEVERE, var15_18[34] + var5_20.getLogin() + var15_18[3]);
            var2_2.sendError(403, var15_18[25]);
            return;
        }
        var7_22 /* !! */  = (Goid)this.readCSRFromRequest(var1_1);
        var15_19 = CSRHandler.b;
        var9_25 = new X500Principal(var15_19[27] + var5_20.getLogin());
        try {
            var10_26 = this.config.getIntProperty(var15_19[30], 730);
            var11_29 /* !! */  = new CertGenParams(var9_25, (int)var10_26, false, null).useUserCertDefaults();
            if (var5_20 instanceof InternalUser) {
                var12_32 = ((InternalUser)var5_20).getExpiration();
                try {
                    if (var12_32 != -1L) {
                        var11_29 /* !! */ .setNotAfter(new Date(var12_32));
                    }
                }
                catch (BadCredentialsException v4) {
                    throw CSRHandler.a((Exception)v4);
                }
            }
            var8_24 = this.getSigner().createCertificate((byte[])var7_22 /* !! */ , var11_29 /* !! */ );
        }
        catch (NoCaException var10_27) {
            var15_19 = CSRHandler.b;
            var2_2.sendError(503, var15_19[36]);
            this.logger.log(Level.WARNING, var15_19[37]);
            return;
        }
        catch (Exception var10_28) {
            var2_2.sendError(500, var10_28.getMessage());
            this.logger.log(Level.SEVERE, ExceptionUtils.getMessage((Throwable)var10_28), var10_28);
            return;
        }
        var10_26 = AuditContextUtils.isSystem();
        AuditContextUtils.setSystem(true);
        try {
            this.clientCertManager.recordNewUserCert(var5_20, (Certificate)var8_24, var4_10.isCertSignedByStaleCA());
            var11_29 /* !! */  = this.buildIssuedMessage(var5_20);
            this.getApplicationContext().publishEvent((ApplicationEvent)new CertificateSigningServiceEvent((Object)this, Level.INFO, var1_1.getRemoteAddr(), (String)var11_29 /* !! */ , var5_20.getProviderId(), this.getName(var5_20), var5_20.getId()));
        }
        catch (UpdateException var11_30) {
            var15_19 = CSRHandler.b;
            var12_33 = var15_19[28] + var11_30.getMessage();
            var2_2.sendError(500, var12_33);
            this.logger.log(Level.SEVERE, var12_33, var11_30);
            return;
        }
        finally {
            AuditContextUtils.setSystem(var10_26);
        }
        try {
            var11_29 /* !! */  = (CertGenParams)var8_24.getEncoded();
            var2_2.setStatus(200);
            var15_19 = CSRHandler.b;
            var2_2.setContentType(var15_19[31]);
            var2_2.setContentLength(((CertGenParams)var11_29 /* !! */ ).length);
            var2_2.getOutputStream().write((byte[])var11_29 /* !! */ );
            var2_2.flushBuffer();
            this.logger.fine(var15_19[33] + var5_20.getLogin() + var15_19[9] + ((X509Certificate)var8_24).getSubjectDN().toString());
        }
        catch (CertificateEncodingException var11_31) {
            var2_2.sendError(500, var11_31.getMessage());
            this.logger.log(Level.SEVERE, ExceptionUtils.getMessage((Throwable)var11_31), var11_31);
        }
    }

    private String buildIssuedMessage(User user) {
        StringBuilder stringBuilder = new StringBuilder();
        String[] stringArray = b;
        stringBuilder.append(stringArray[20]);
        stringBuilder.append(this.getName(user));
        stringBuilder.append(stringArray[26]);
        stringBuilder.append(user.getId());
        stringBuilder.append(stringArray[7]);
        stringBuilder.append(this.getIdentityProviderName(user.getProviderId()));
        stringBuilder.append(stringArray[11]);
        stringBuilder.append(user.getProviderId());
        stringBuilder.append(")");
        return stringBuilder.toString();
    }

    private String getName(User user) {
        return user.getLogin() != null ? user.getLogin() : user.getId();
    }

    private byte[] readCSRFromRequest(HttpServletRequest httpServletRequest) throws IOException {
        byte[] byArray = IOUtils.slurpStream((InputStream)httpServletRequest.getInputStream());
        try {
            return CertUtils.csrPemToBinary((byte[])byArray);
        }
        catch (IOException iOException) {
            return byArray;
        }
    }

    private RsaSignerEngine getSigner() throws NoCaException {
        SsgKeyEntry ssgKeyEntry = this.defaultKey.getCaInfo();
        try {
            if (ssgKeyEntry == null) {
                throw new NoCaException();
            }
        }
        catch (UnrecoverableKeyException unrecoverableKeyException) {
            throw CSRHandler.a(unrecoverableKeyException);
        }
        try {
            return JceProvider.getInstance().createRsaSignerEngine(ssgKeyEntry.getPrivate(), ssgKeyEntry.getCertificateChain());
        }
        catch (UnrecoverableKeyException unrecoverableKeyException) {
            throw new NoCaException(b[13] + ExceptionUtils.getMessage((Throwable)unrecoverableKeyException), unrecoverableKeyException);
        }
    }

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

    /*
     * Unable to fully structure code
     */
    static {
        block10: {
            block9: {
                var5 = new String[38];
                var3_1 = 0;
                var2_2 = "|\u00071o_v_0H! J`\r3N! yV-p'\u001dt\u0007 H`\u000e+B&tI%\u0012+T! Yj\u0012;\u0007!hHj\n9OusIi_.H't&\u001dt\u0007 rd\u0011:K0r\u001af\u001e2K0d\u001ar\u0016*O:uN%\u001c,B1eTq\u0016?K&\u000b~d\u0006R\u001aa\u001a0N0d\u0017\nO0 sa\u001a0S<tC%\u000f,H#i^`\r~\u0005\u001e3R&t\u001au\r1Q<d_%\t?K<d\u001af\r;C0nNl\u001e2T)\u0019F!eMd\u0006~d\u0014 I`\r(N6e\u001ak\u0010*\u00070n[g\u0013;CubC%\u00137D0nI`\u0003w\u000bu$\rB'vSf\u001a~N& Ok\u00137D0nI`\u001br\u0007'eNp\r0N;g\u001a0On\rp\u0007\u0006uXo\u001a=SuDt8\u0018\fB$u_v\u000b1UuiI%\r;A s_a_=T'\u0003~\u000fv\u001e3R&t\u001au\r1Q<d_%\t?K<d\u001af\r;C0nNl\u001e2T,\u000bI4bV`_*HuaYf\u001a-TucUk\u00197@ r_a_\u001dfupHl\t?S0 Q`\u0006d\u0007\u0019.L<x\u0014f\f,\t1e\\d\n2S\u0010xJl\r'f2e+\u0019F!eMd\u0006~d\u0014 I`\r(N6e\u001ak\u0010*\u00070n[g\u0013;CuoT%\u000b6N& Jj\r*\u0010\fH t_aR\u0018U:m\u0017U\u001a;U\u0017\u001fR!h_k\u000b7D4tSj\u0011~A4iV`\u001bd\u0007\u0017\u001fR!h_k\u000b7D4tSj\u0011~A4iV`\u001bd\u0007P\u001fJ7i]p\u0010+TuaOq\u0017;I!iYd\u000b7H; \u0017%\u001c,B1eTq\u0016?K& Ld\u00137CuiT%\u00121U0 Nm\u001e0\u0007:n_%\u0016:B;tSq\u0006~W'oLl\u001b;U{\u001c\u0017T&u_a_=B'tSc\u0016=F!e\u001ac\u0010,\u0007 s_w_1\fB$u_v\u000b~I:t\u001au\u001a,J<tN`\u001b~H; Nm\u0016-\u0007%oHqS~U0tOw\u00117I2 \u000f5O8\u001dt\u0007 |j\r<N1d_kQ~d:nNd\u001c*\u0007,oOw_?C8iTl\f*U4tUw_8H' Wj\r;\u0007<n\\jQ\u0012-B'vSf\u001add\u0006Rrd\u0011:K0r\u0015+T0r\u001al\f~U0fOv\u001a:\u00076sH?_8\u001dt\u0007 |j\r<N1d_kQ~d:nNd\u001c*\u0007,oOw_?C8iTl\f*U4tUw_8H' Wj\r;\u0007<n\\jQ\u0003~\u000fv\u0003=Ih\u0017\u001dH l^%\u00111Sur_f\u0010,Cuc_w\u000bp\u0007\u001d7C0nNl\u000b'w'oLl\u001b;U\u0016oTc\u00169j4n[b\u001a,\u0019.L<x\u0014f\f,\t1e\\d\n2S\u0010xJl\r'f2e\u001a?W%lSf\u001e*N:n\u0015}R&\u0012e9\u0017f\u001esD0rN\r\u001fR!hUw\u0016$F!iUk\u0016-B;t\u001ak\u001a)\u00076eHq_*HuuI`\r~6\u001dH l^kX*\u00079oUn_+WutR`_7C0nNl\u000b'\u0007%rUs\u0016:B' \\j\r~S=e\u001ap\f;Uu:\u001a\n:B3aOi\u000b\u0015B,";
                var4_3 = "|\u00071o_v_0H! J`\r3N! yV-p'\u001dt\u0007 H`\u000e+B&tI%\u0012+T! Yj\u0012;\u0007!hHj\n9OusIi_.H't&\u001dt\u0007 rd\u0011:K0r\u001af\u001e2K0d\u001ar\u0016*O:uN%\u001c,B1eTq\u0016?K&\u000b~d\u0006R\u001aa\u001a0N0d\u0017\nO0 sa\u001a0S<tC%\u000f,H#i^`\r~\u0005\u001e3R&t\u001au\r1Q<d_%\t?K<d\u001af\r;C0nNl\u001e2T)\u0019F!eMd\u0006~d\u0014 I`\r(N6e\u001ak\u0010*\u00070n[g\u0013;CubC%\u00137D0nI`\u0003w\u000bu$\rB'vSf\u001a~N& Ok\u00137D0nI`\u001br\u0007'eNp\r0N;g\u001a0On\rp\u0007\u0006uXo\u001a=SuDt8\u0018\fB$u_v\u000b1UuiI%\r;A s_a_=T'\u0003~\u000fv\u001e3R&t\u001au\r1Q<d_%\t?K<d\u001af\r;C0nNl\u001e2T,\u000bI4bV`_*HuaYf\u001a-TucUk\u00197@ r_a_\u001dfupHl\t?S0 Q`\u0006d\u0007\u0019.L<x\u0014f\f,\t1e\\d\n2S\u0010xJl\r'f2e+\u0019F!eMd\u0006~d\u0014 I`\r(N6e\u001ak\u0010*\u00070n[g\u0013;CuoT%\u000b6N& Jj\r*\u0010\fH t_aR\u0018U:m\u0017U\u001a;U\u0017\u001fR!h_k\u000b7D4tSj\u0011~A4iV`\u001bd\u0007\u0017\u001fR!h_k\u000b7D4tSj\u0011~A4iV`\u001bd\u0007P\u001fJ7i]p\u0010+TuaOq\u0017;I!iYd\u000b7H; \u0017%\u001c,B1eTq\u0016?K& Ld\u00137CuiT%\u00121U0 Nm\u001e0\u0007:n_%\u0016:B;tSq\u0006~W'oLl\u001b;U{\u001c\u0017T&u_a_=B'tSc\u0016=F!e\u001ac\u0010,\u0007 s_w_1\fB$u_v\u000b~I:t\u001au\u001a,J<tN`\u001b~H; Nm\u0016-\u0007%oHqS~U0tOw\u00117I2 \u000f5O8\u001dt\u0007 |j\r<N1d_kQ~d:nNd\u001c*\u0007,oOw_?C8iTl\f*U4tUw_8H' Wj\r;\u0007<n\\jQ\u0012-B'vSf\u001add\u0006Rrd\u0011:K0r\u0015+T0r\u001al\f~U0fOv\u001a:\u00076sH?_8\u001dt\u0007 |j\r<N1d_kQ~d:nNd\u001c*\u0007,oOw_?C8iTl\f*U4tUw_8H' Wj\r;\u0007<n\\jQ\u0003~\u000fv\u0003=Ih\u0017\u001dH l^%\u00111Sur_f\u0010,Cuc_w\u000bp\u0007\u001d7C0nNl\u000b'w'oLl\u001b;U\u0016oTc\u00169j4n[b\u001a,\u0019.L<x\u0014f\f,\t1e\\d\n2S\u0010xJl\r'f2e\u001a?W%lSf\u001e*N:n\u0015}R&\u0012e9\u0017f\u001esD0rN\r\u001fR!hUw\u0016$F!iUk\u0016-B;t\u001ak\u001a)\u00076eHq_*HuuI`\r~6\u001dH l^kX*\u00079oUn_+WutR`_7C0nNl\u000b'\u0007%rUs\u0016:B' \\j\r~S=e\u001ap\f;Uu:\u001a\n:B3aOi\u000b\u0015B,".length();
                var1_4 = 22;
                var0_5 = -1;
lbl7:
                // 2 sources

                while (true) {
                    v0 = 106;
                    v1 = ++var0_5;
                    v2 = var2_2.substring(v1, v1 + var1_4);
                    v3 = -1;
                    break block9;
                    break;
                }
lbl13:
                // 1 sources

                while (true) {
                    var5[var3_1++] = CSRHandler.b(v0, CSRHandler.b(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    var2_2 = "G\u0018\u007f;\u0013:X :J~\u0017>Sv\u0010h;D5NtYj(\u00052Ma\u001bg;AT\u0011b-D\u001c@t\u001c|?\u001d{Eo\u001cx~\n4U \u001a~,\u0016>Ot\u0015r~\f:WeYj~\u0000>Ga\fg*D\u0018` \u0012n'D8Nn\u001fb9\u0011)DdW";
                    var4_3 = "G\u0018\u007f;\u0013:X :J~\u0017>Sv\u0010h;D5NtYj(\u00052Ma\u001bg;AT\u0011b-D\u001c@t\u001c|?\u001d{Eo\u001cx~\n4U \u001a~,\u0016>Ot\u0015r~\f:WeYj~\u0000>Ga\fg*D\u0018` \u0012n'D8Nn\u001fb9\u0011)DdW".length();
                    var1_4 = 32;
                    var0_5 = -1;
lbl22:
                    // 2 sources

                    while (true) {
                        v0 = 52;
                        v4 = ++var0_5;
                        v2 = var2_2.substring(v4, v4 + var1_4);
                        v3 = 0;
                        break block9;
                        break;
                    }
                    break;
                }
lbl28:
                // 1 sources

                while (true) {
                    var5[var3_1++] = CSRHandler.b(v0, CSRHandler.b(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    break block10;
                    break;
                }
            }
            switch (v3) {
                default: {
                    ** continue;
                }
                ** case 0:
lbl39:
                // 1 sources

                ** continue;
            }
        }
        CSRHandler.b = var5;
        CSRHandler.ROUTED_FROM_PEER = CSRHandler.b[16];
        CSRHandler.PROP_PKIX_CSR_DEFAULT_EXPIRY_AGE = CSRHandler.b[14];
        CSRHandler.AUTH_HEADER_NAME = CSRHandler.b[32];
    }

    private static char[] b(String string) {
        char[] cArray = string.toCharArray();
        if (cArray.length < 2) {
            cArray = cArray;
            cArray[0] = (char)(cArray[0] ^ 0x15);
        }
        return cArray;
    }

    /*
     * Handled impossible loop by duplicating code
     * Enabled aggressive block sorting
     */
    private static String b(int n2, char[] cArray) {
        char[] cArray2;
        block11: {
            int n3;
            int n4;
            int n5;
            block10: {
                n5 = n2;
                cArray2 = cArray;
                n4 = cArray.length;
                n3 = 0;
                if (!true) break block10;
                n4 = n4;
                if (n4 <= n3) break block11;
            }
            do {
                n5 = n5;
                cArray2 = cArray2;
                int n6 = n3;
                cArray2[n6] = (char)(cArray2[n6] ^ (n5 ^ (switch (n3 % 7) {
                    case 0 -> 52;
                    case 1 -> 77;
                    case 2 -> 63;
                    case 3 -> 106;
                    case 4 -> 80;
                    case 5 -> 111;
                    default -> 21;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }

    private static final class NoCaException
    extends Exception {
        static final long serialVersionUID = -6515174456756153779L;

        private NoCaException() {
        }

        private NoCaException(String string, Throwable throwable) {
            super(string, throwable);
        }
    }
}

