// Path: src/main/java/me/semx11/autotip/api/GetBuilder.java
// public class GetBuilder {
// 
//     private static final String BASE_URL = "https://api.autotip.pro/";
// 
//     private final RequestBuilder builder;
// 
//     private GetBuilder(Request request) {
//         this.builder = RequestBuilder.get().setUri(BASE_URL + request.getType().getEndpoint());
//     }
// 
//     public static GetBuilder of(Request request) {
//         return new GetBuilder(request);
//     }
// 
//     public GetBuilder addParameter(String key, Object value) {
//         this.builder.addParameter(key, String.valueOf(value));
//         return this;
//     }
// 
//     public HttpUriRequest build() {
//         return this.builder.build();
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/RequestHandler.java
// public class RequestHandler {
// 
//     private static final Gson GSON = new GsonBuilder()
//             .registerTypeAdapter(Locale.class, new LocaleAdapter())
//             .registerTypeAdapter(Pattern.class, new PatternAdapter())
//             .registerTypeAdapter(SessionKey.class, new SessionKeyAdapter())
//             .registerTypeAdapter(Version.class, new VersionAdapter())
//             .create();
// 
//     private static Autotip autotip;
// 
//     public static void setAutotip(Autotip autotip) {
//         RequestHandler.autotip = autotip;
//     }
// 
//     public static Optional<Reply> getReply(Request request, URI uri) {
//         String json = null;
//         try {
//             HttpURLConnection conn = (HttpURLConnection) uri.toURL().openConnection();
//             conn.setRequestProperty("User-Agent", "Autotip v" + autotip.getVersion());
// 
//             InputStream input;
//             if (conn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
//                 input = conn.getInputStream();
//             } else {
//                 input = conn.getErrorStream();
//             }
//             json = IOUtils.toString(input, StandardCharsets.UTF_8);
//             Autotip.LOGGER.debug(request.getType() + " JSON: " + json);
// 
//             Reply reply = GSON.fromJson(json, (Type) request.getType().getReplyClass());
// 
//             return Optional.ofNullable(reply);
//         } catch (IOException | JsonParseException e) {
//             ErrorReport.reportException(e);
//             Autotip.LOGGER.info(request.getType() + " JSON: " + json);
//             return Optional.empty();
//         }
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/RequestType.java
// public enum RequestType {
//     SETTINGS("settings", SettingsReply.class),
//     LOCALE("locale", LocaleReply.class),
//     LOGIN("login", LoginReply.class),
//     KEEP_ALIVE("keepalive", KeepAliveReply.class),
//     TIP("tip", TipReply.class),
//     LOGOUT("logout", LogoutReply.class);
// 
//     private final String endpoint;
//     private final Class<?> replyClass;
// 
//     RequestType(String endpoint, Class<?> replyClass) {
//         this.endpoint = endpoint;
//         this.replyClass = replyClass;
//     }
// 
//     public String getEndpoint() {
//         return endpoint;
//     }
// 
//     public Class<?> getReplyClass() {
//         return replyClass;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/SessionKey.java
// public class SessionKey {
// 
//     private final String key;
// 
//     public SessionKey(String key) {
//         this.key = key;
//     }
// 
//     public String getKey() {
//         return key;
//     }
// 
//     @Override
//     public String toString() {
//         return key;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/Reply.java
// public abstract class Reply {
// 
//     private boolean success;
//     private String cause;
// 
//     public Reply() {
//     }
// 
//     public Reply(boolean success) {
//         this.success = success;
//     }
// 
//     public boolean isSuccess() {
//         return success;
//     }
// 
//     public String getCause() {
//         return cause;
//     }
// 
//     public abstract RequestType getRequestType();
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LogoutReply.java
// public class LogoutReply extends Reply {
// 
//     public LogoutReply() {
//     }
// 
//     public LogoutReply(boolean success) {
//         super(success);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOGOUT;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/request/Request.java
// public interface Request<T extends Reply> {
// 
//     T execute();
// 
//     RequestType getType();
// 
// }


import java.util.Optional;
import me.semx11.autotip.api.GetBuilder;
import me.semx11.autotip.api.RequestHandler;
import me.semx11.autotip.api.RequestType;
import me.semx11.autotip.api.SessionKey;
import me.semx11.autotip.api.reply.Reply;
import me.semx11.autotip.api.reply.impl.LogoutReply;
import me.semx11.autotip.api.request.Request;
import org.apache.http.client.methods.HttpUriRequest;
package me.semx11.autotip.api.request.impl;


public class LogoutRequest implements Request<LogoutReply> {

    private final SessionKey sessionKey;

    private LogoutRequest(SessionKey sessionKey) {
// Path: src/main/java/me/semx11/autotip/api/GetBuilder.java
// public class GetBuilder {
// 
//     private static final String BASE_URL = "https://api.autotip.pro/";
// 
//     private final RequestBuilder builder;
// 
//     private GetBuilder(Request request) {
//         this.builder = RequestBuilder.get().setUri(BASE_URL + request.getType().getEndpoint());
//     }
// 
//     public static GetBuilder of(Request request) {
//         return new GetBuilder(request);
//     }
// 
//     public GetBuilder addParameter(String key, Object value) {
//         this.builder.addParameter(key, String.valueOf(value));
//         return this;
//     }
// 
//     public HttpUriRequest build() {
//         return this.builder.build();
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/RequestHandler.java
// public class RequestHandler {
// 
//     private static final Gson GSON = new GsonBuilder()
//             .registerTypeAdapter(Locale.class, new LocaleAdapter())
//             .registerTypeAdapter(Pattern.class, new PatternAdapter())
//             .registerTypeAdapter(SessionKey.class, new SessionKeyAdapter())
//             .registerTypeAdapter(Version.class, new VersionAdapter())
//             .create();
// 
//     private static Autotip autotip;
// 
//     public static void setAutotip(Autotip autotip) {
//         RequestHandler.autotip = autotip;
//     }
// 
//     public static Optional<Reply> getReply(Request request, URI uri) {
//         String json = null;
//         try {
//             HttpURLConnection conn = (HttpURLConnection) uri.toURL().openConnection();
//             conn.setRequestProperty("User-Agent", "Autotip v" + autotip.getVersion());
// 
//             InputStream input;
//             if (conn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
//                 input = conn.getInputStream();
//             } else {
//                 input = conn.getErrorStream();
//             }
//             json = IOUtils.toString(input, StandardCharsets.UTF_8);
//             Autotip.LOGGER.debug(request.getType() + " JSON: " + json);
// 
//             Reply reply = GSON.fromJson(json, (Type) request.getType().getReplyClass());
// 
//             return Optional.ofNullable(reply);
//         } catch (IOException | JsonParseException e) {
//             ErrorReport.reportException(e);
//             Autotip.LOGGER.info(request.getType() + " JSON: " + json);
//             return Optional.empty();
//         }
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/RequestType.java
// public enum RequestType {
//     SETTINGS("settings", SettingsReply.class),
//     LOCALE("locale", LocaleReply.class),
//     LOGIN("login", LoginReply.class),
//     KEEP_ALIVE("keepalive", KeepAliveReply.class),
//     TIP("tip", TipReply.class),
//     LOGOUT("logout", LogoutReply.class);
// 
//     private final String endpoint;
//     private final Class<?> replyClass;
// 
//     RequestType(String endpoint, Class<?> replyClass) {
//         this.endpoint = endpoint;
//         this.replyClass = replyClass;
//     }
// 
//     public String getEndpoint() {
//         return endpoint;
//     }
// 
//     public Class<?> getReplyClass() {
//         return replyClass;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/SessionKey.java
// public class SessionKey {
// 
//     private final String key;
// 
//     public SessionKey(String key) {
//         this.key = key;
//     }
// 
//     public String getKey() {
//         return key;
//     }
// 
//     @Override
//     public String toString() {
//         return key;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/Reply.java
// public abstract class Reply {
// 
//     private boolean success;
//     private String cause;
// 
//     public Reply() {
//     }
// 
//     public Reply(boolean success) {
//         this.success = success;
//     }
// 
//     public boolean isSuccess() {
//         return success;
//     }
// 
//     public String getCause() {
//         return cause;
//     }
// 
//     public abstract RequestType getRequestType();
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LogoutReply.java
// public class LogoutReply extends Reply {
// 
//     public LogoutReply() {
//     }
// 
//     public LogoutReply(boolean success) {
//         super(success);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOGOUT;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/request/Request.java
// public interface Request<T extends Reply> {
// 
//     T execute();
// 
//     RequestType getType();
// 
// }


// Path: src/main/java/me/semx11/autotip/api/request/impl/LogoutRequest.java
import java.util.Optional;
import me.semx11.autotip.api.GetBuilder;
import me.semx11.autotip.api.RequestHandler;
import me.semx11.autotip.api.RequestType;
import me.semx11.autotip.api.SessionKey;
import me.semx11.autotip.api.reply.Reply;
import me.semx11.autotip.api.reply.impl.LogoutReply;
import me.semx11.autotip.api.request.Request;
import org.apache.http.client.methods.HttpUriRequest;

package me.semx11.autotip.api.request.impl;


public class LogoutRequest implements Request<LogoutReply> {

    private final SessionKey sessionKey;

    private LogoutRequest(SessionKey sessionKey) {
        this.sessionKey = sessionKey;