/* 
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

package dev.plexapi.sdk.models.operations;


import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.plexapi.sdk.utils.Utils;
import java.lang.Boolean;
import java.lang.Double;
import java.lang.Override;
import java.lang.String;
import java.lang.SuppressWarnings;
import java.util.List;
import java.util.Objects;
import java.util.Optional;


public class MediaContainer {

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("size")
    private Optional<Double> size;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("allowCameraUpload")
    private Optional<Boolean> allowCameraUpload;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("allowChannelAccess")
    private Optional<Boolean> allowChannelAccess;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("allowMediaDeletion")
    private Optional<Boolean> allowMediaDeletion;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("allowSharing")
    private Optional<Boolean> allowSharing;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("allowSync")
    private Optional<Boolean> allowSync;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("allowTuners")
    private Optional<Boolean> allowTuners;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("backgroundProcessing")
    private Optional<Boolean> backgroundProcessing;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("certificate")
    private Optional<Boolean> certificate;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("companionProxy")
    private Optional<Boolean> companionProxy;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("countryCode")
    private Optional<String> countryCode;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("diagnostics")
    private Optional<String> diagnostics;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("eventStream")
    private Optional<Boolean> eventStream;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("friendlyName")
    private Optional<String> friendlyName;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("hubSearch")
    private Optional<Boolean> hubSearch;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("itemClusters")
    private Optional<Boolean> itemClusters;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("livetv")
    private Optional<Double> livetv;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("machineIdentifier")
    private Optional<String> machineIdentifier;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("mediaProviders")
    private Optional<Boolean> mediaProviders;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("multiuser")
    private Optional<Boolean> multiuser;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("musicAnalysis")
    private Optional<Double> musicAnalysis;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("myPlex")
    private Optional<Boolean> myPlex;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("myPlexMappingState")
    private Optional<String> myPlexMappingState;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("myPlexSigninState")
    private Optional<String> myPlexSigninState;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("myPlexSubscription")
    private Optional<Boolean> myPlexSubscription;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("myPlexUsername")
    private Optional<String> myPlexUsername;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("offlineTranscode")
    private Optional<Double> offlineTranscode;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("ownerFeatures")
    private Optional<String> ownerFeatures;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("photoAutoTag")
    private Optional<Boolean> photoAutoTag;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("platform")
    private Optional<String> platform;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("platformVersion")
    private Optional<String> platformVersion;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("pluginHost")
    private Optional<Boolean> pluginHost;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("pushNotifications")
    private Optional<Boolean> pushNotifications;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("readOnlyLibraries")
    private Optional<Boolean> readOnlyLibraries;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("streamingBrainABRVersion")
    private Optional<Double> streamingBrainABRVersion;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("streamingBrainVersion")
    private Optional<Double> streamingBrainVersion;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("sync")
    private Optional<Boolean> sync;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderActiveVideoSessions")
    private Optional<Double> transcoderActiveVideoSessions;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderAudio")
    private Optional<Boolean> transcoderAudio;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderLyrics")
    private Optional<Boolean> transcoderLyrics;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderPhoto")
    private Optional<Boolean> transcoderPhoto;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderSubtitles")
    private Optional<Boolean> transcoderSubtitles;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderVideo")
    private Optional<Boolean> transcoderVideo;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderVideoBitrates")
    private Optional<String> transcoderVideoBitrates;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderVideoQualities")
    private Optional<String> transcoderVideoQualities;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("transcoderVideoResolutions")
    private Optional<String> transcoderVideoResolutions;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("updatedAt")
    private Optional<Double> updatedAt;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("updater")
    private Optional<Boolean> updater;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("version")
    private Optional<String> version;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("voiceSearch")
    private Optional<Boolean> voiceSearch;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("Directory")
    private Optional<? extends List<Directory>> directory;

    @JsonCreator
    public MediaContainer(
            @JsonProperty("size") Optional<Double> size,
            @JsonProperty("allowCameraUpload") Optional<Boolean> allowCameraUpload,
            @JsonProperty("allowChannelAccess") Optional<Boolean> allowChannelAccess,
            @JsonProperty("allowMediaDeletion") Optional<Boolean> allowMediaDeletion,
            @JsonProperty("allowSharing") Optional<Boolean> allowSharing,
            @JsonProperty("allowSync") Optional<Boolean> allowSync,
            @JsonProperty("allowTuners") Optional<Boolean> allowTuners,
            @JsonProperty("backgroundProcessing") Optional<Boolean> backgroundProcessing,
            @JsonProperty("certificate") Optional<Boolean> certificate,
            @JsonProperty("companionProxy") Optional<Boolean> companionProxy,
            @JsonProperty("countryCode") Optional<String> countryCode,
            @JsonProperty("diagnostics") Optional<String> diagnostics,
            @JsonProperty("eventStream") Optional<Boolean> eventStream,
            @JsonProperty("friendlyName") Optional<String> friendlyName,
            @JsonProperty("hubSearch") Optional<Boolean> hubSearch,
            @JsonProperty("itemClusters") Optional<Boolean> itemClusters,
            @JsonProperty("livetv") Optional<Double> livetv,
            @JsonProperty("machineIdentifier") Optional<String> machineIdentifier,
            @JsonProperty("mediaProviders") Optional<Boolean> mediaProviders,
            @JsonProperty("multiuser") Optional<Boolean> multiuser,
            @JsonProperty("musicAnalysis") Optional<Double> musicAnalysis,
            @JsonProperty("myPlex") Optional<Boolean> myPlex,
            @JsonProperty("myPlexMappingState") Optional<String> myPlexMappingState,
            @JsonProperty("myPlexSigninState") Optional<String> myPlexSigninState,
            @JsonProperty("myPlexSubscription") Optional<Boolean> myPlexSubscription,
            @JsonProperty("myPlexUsername") Optional<String> myPlexUsername,
            @JsonProperty("offlineTranscode") Optional<Double> offlineTranscode,
            @JsonProperty("ownerFeatures") Optional<String> ownerFeatures,
            @JsonProperty("photoAutoTag") Optional<Boolean> photoAutoTag,
            @JsonProperty("platform") Optional<String> platform,
            @JsonProperty("platformVersion") Optional<String> platformVersion,
            @JsonProperty("pluginHost") Optional<Boolean> pluginHost,
            @JsonProperty("pushNotifications") Optional<Boolean> pushNotifications,
            @JsonProperty("readOnlyLibraries") Optional<Boolean> readOnlyLibraries,
            @JsonProperty("streamingBrainABRVersion") Optional<Double> streamingBrainABRVersion,
            @JsonProperty("streamingBrainVersion") Optional<Double> streamingBrainVersion,
            @JsonProperty("sync") Optional<Boolean> sync,
            @JsonProperty("transcoderActiveVideoSessions") Optional<Double> transcoderActiveVideoSessions,
            @JsonProperty("transcoderAudio") Optional<Boolean> transcoderAudio,
            @JsonProperty("transcoderLyrics") Optional<Boolean> transcoderLyrics,
            @JsonProperty("transcoderPhoto") Optional<Boolean> transcoderPhoto,
            @JsonProperty("transcoderSubtitles") Optional<Boolean> transcoderSubtitles,
            @JsonProperty("transcoderVideo") Optional<Boolean> transcoderVideo,
            @JsonProperty("transcoderVideoBitrates") Optional<String> transcoderVideoBitrates,
            @JsonProperty("transcoderVideoQualities") Optional<String> transcoderVideoQualities,
            @JsonProperty("transcoderVideoResolutions") Optional<String> transcoderVideoResolutions,
            @JsonProperty("updatedAt") Optional<Double> updatedAt,
            @JsonProperty("updater") Optional<Boolean> updater,
            @JsonProperty("version") Optional<String> version,
            @JsonProperty("voiceSearch") Optional<Boolean> voiceSearch,
            @JsonProperty("Directory") Optional<? extends List<Directory>> directory) {
        Utils.checkNotNull(size, "size");
        Utils.checkNotNull(allowCameraUpload, "allowCameraUpload");
        Utils.checkNotNull(allowChannelAccess, "allowChannelAccess");
        Utils.checkNotNull(allowMediaDeletion, "allowMediaDeletion");
        Utils.checkNotNull(allowSharing, "allowSharing");
        Utils.checkNotNull(allowSync, "allowSync");
        Utils.checkNotNull(allowTuners, "allowTuners");
        Utils.checkNotNull(backgroundProcessing, "backgroundProcessing");
        Utils.checkNotNull(certificate, "certificate");
        Utils.checkNotNull(companionProxy, "companionProxy");
        Utils.checkNotNull(countryCode, "countryCode");
        Utils.checkNotNull(diagnostics, "diagnostics");
        Utils.checkNotNull(eventStream, "eventStream");
        Utils.checkNotNull(friendlyName, "friendlyName");
        Utils.checkNotNull(hubSearch, "hubSearch");
        Utils.checkNotNull(itemClusters, "itemClusters");
        Utils.checkNotNull(livetv, "livetv");
        Utils.checkNotNull(machineIdentifier, "machineIdentifier");
        Utils.checkNotNull(mediaProviders, "mediaProviders");
        Utils.checkNotNull(multiuser, "multiuser");
        Utils.checkNotNull(musicAnalysis, "musicAnalysis");
        Utils.checkNotNull(myPlex, "myPlex");
        Utils.checkNotNull(myPlexMappingState, "myPlexMappingState");
        Utils.checkNotNull(myPlexSigninState, "myPlexSigninState");
        Utils.checkNotNull(myPlexSubscription, "myPlexSubscription");
        Utils.checkNotNull(myPlexUsername, "myPlexUsername");
        Utils.checkNotNull(offlineTranscode, "offlineTranscode");
        Utils.checkNotNull(ownerFeatures, "ownerFeatures");
        Utils.checkNotNull(photoAutoTag, "photoAutoTag");
        Utils.checkNotNull(platform, "platform");
        Utils.checkNotNull(platformVersion, "platformVersion");
        Utils.checkNotNull(pluginHost, "pluginHost");
        Utils.checkNotNull(pushNotifications, "pushNotifications");
        Utils.checkNotNull(readOnlyLibraries, "readOnlyLibraries");
        Utils.checkNotNull(streamingBrainABRVersion, "streamingBrainABRVersion");
        Utils.checkNotNull(streamingBrainVersion, "streamingBrainVersion");
        Utils.checkNotNull(sync, "sync");
        Utils.checkNotNull(transcoderActiveVideoSessions, "transcoderActiveVideoSessions");
        Utils.checkNotNull(transcoderAudio, "transcoderAudio");
        Utils.checkNotNull(transcoderLyrics, "transcoderLyrics");
        Utils.checkNotNull(transcoderPhoto, "transcoderPhoto");
        Utils.checkNotNull(transcoderSubtitles, "transcoderSubtitles");
        Utils.checkNotNull(transcoderVideo, "transcoderVideo");
        Utils.checkNotNull(transcoderVideoBitrates, "transcoderVideoBitrates");
        Utils.checkNotNull(transcoderVideoQualities, "transcoderVideoQualities");
        Utils.checkNotNull(transcoderVideoResolutions, "transcoderVideoResolutions");
        Utils.checkNotNull(updatedAt, "updatedAt");
        Utils.checkNotNull(updater, "updater");
        Utils.checkNotNull(version, "version");
        Utils.checkNotNull(voiceSearch, "voiceSearch");
        Utils.checkNotNull(directory, "directory");
        this.size = size;
        this.allowCameraUpload = allowCameraUpload;
        this.allowChannelAccess = allowChannelAccess;
        this.allowMediaDeletion = allowMediaDeletion;
        this.allowSharing = allowSharing;
        this.allowSync = allowSync;
        this.allowTuners = allowTuners;
        this.backgroundProcessing = backgroundProcessing;
        this.certificate = certificate;
        this.companionProxy = companionProxy;
        this.countryCode = countryCode;
        this.diagnostics = diagnostics;
        this.eventStream = eventStream;
        this.friendlyName = friendlyName;
        this.hubSearch = hubSearch;
        this.itemClusters = itemClusters;
        this.livetv = livetv;
        this.machineIdentifier = machineIdentifier;
        this.mediaProviders = mediaProviders;
        this.multiuser = multiuser;
        this.musicAnalysis = musicAnalysis;
        this.myPlex = myPlex;
        this.myPlexMappingState = myPlexMappingState;
        this.myPlexSigninState = myPlexSigninState;
        this.myPlexSubscription = myPlexSubscription;
        this.myPlexUsername = myPlexUsername;
        this.offlineTranscode = offlineTranscode;
        this.ownerFeatures = ownerFeatures;
        this.photoAutoTag = photoAutoTag;
        this.platform = platform;
        this.platformVersion = platformVersion;
        this.pluginHost = pluginHost;
        this.pushNotifications = pushNotifications;
        this.readOnlyLibraries = readOnlyLibraries;
        this.streamingBrainABRVersion = streamingBrainABRVersion;
        this.streamingBrainVersion = streamingBrainVersion;
        this.sync = sync;
        this.transcoderActiveVideoSessions = transcoderActiveVideoSessions;
        this.transcoderAudio = transcoderAudio;
        this.transcoderLyrics = transcoderLyrics;
        this.transcoderPhoto = transcoderPhoto;
        this.transcoderSubtitles = transcoderSubtitles;
        this.transcoderVideo = transcoderVideo;
        this.transcoderVideoBitrates = transcoderVideoBitrates;
        this.transcoderVideoQualities = transcoderVideoQualities;
        this.transcoderVideoResolutions = transcoderVideoResolutions;
        this.updatedAt = updatedAt;
        this.updater = updater;
        this.version = version;
        this.voiceSearch = voiceSearch;
        this.directory = directory;
    }
    
    public MediaContainer() {
        this(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty());
    }

    @JsonIgnore
    public Optional<Double> size() {
        return size;
    }

    @JsonIgnore
    public Optional<Boolean> allowCameraUpload() {
        return allowCameraUpload;
    }

    @JsonIgnore
    public Optional<Boolean> allowChannelAccess() {
        return allowChannelAccess;
    }

    @JsonIgnore
    public Optional<Boolean> allowMediaDeletion() {
        return allowMediaDeletion;
    }

    @JsonIgnore
    public Optional<Boolean> allowSharing() {
        return allowSharing;
    }

    @JsonIgnore
    public Optional<Boolean> allowSync() {
        return allowSync;
    }

    @JsonIgnore
    public Optional<Boolean> allowTuners() {
        return allowTuners;
    }

    @JsonIgnore
    public Optional<Boolean> backgroundProcessing() {
        return backgroundProcessing;
    }

    @JsonIgnore
    public Optional<Boolean> certificate() {
        return certificate;
    }

    @JsonIgnore
    public Optional<Boolean> companionProxy() {
        return companionProxy;
    }

    @JsonIgnore
    public Optional<String> countryCode() {
        return countryCode;
    }

    @JsonIgnore
    public Optional<String> diagnostics() {
        return diagnostics;
    }

    @JsonIgnore
    public Optional<Boolean> eventStream() {
        return eventStream;
    }

    @JsonIgnore
    public Optional<String> friendlyName() {
        return friendlyName;
    }

    @JsonIgnore
    public Optional<Boolean> hubSearch() {
        return hubSearch;
    }

    @JsonIgnore
    public Optional<Boolean> itemClusters() {
        return itemClusters;
    }

    @JsonIgnore
    public Optional<Double> livetv() {
        return livetv;
    }

    @JsonIgnore
    public Optional<String> machineIdentifier() {
        return machineIdentifier;
    }

    @JsonIgnore
    public Optional<Boolean> mediaProviders() {
        return mediaProviders;
    }

    @JsonIgnore
    public Optional<Boolean> multiuser() {
        return multiuser;
    }

    @JsonIgnore
    public Optional<Double> musicAnalysis() {
        return musicAnalysis;
    }

    @JsonIgnore
    public Optional<Boolean> myPlex() {
        return myPlex;
    }

    @JsonIgnore
    public Optional<String> myPlexMappingState() {
        return myPlexMappingState;
    }

    @JsonIgnore
    public Optional<String> myPlexSigninState() {
        return myPlexSigninState;
    }

    @JsonIgnore
    public Optional<Boolean> myPlexSubscription() {
        return myPlexSubscription;
    }

    @JsonIgnore
    public Optional<String> myPlexUsername() {
        return myPlexUsername;
    }

    @JsonIgnore
    public Optional<Double> offlineTranscode() {
        return offlineTranscode;
    }

    @JsonIgnore
    public Optional<String> ownerFeatures() {
        return ownerFeatures;
    }

    @JsonIgnore
    public Optional<Boolean> photoAutoTag() {
        return photoAutoTag;
    }

    @JsonIgnore
    public Optional<String> platform() {
        return platform;
    }

    @JsonIgnore
    public Optional<String> platformVersion() {
        return platformVersion;
    }

    @JsonIgnore
    public Optional<Boolean> pluginHost() {
        return pluginHost;
    }

    @JsonIgnore
    public Optional<Boolean> pushNotifications() {
        return pushNotifications;
    }

    @JsonIgnore
    public Optional<Boolean> readOnlyLibraries() {
        return readOnlyLibraries;
    }

    @JsonIgnore
    public Optional<Double> streamingBrainABRVersion() {
        return streamingBrainABRVersion;
    }

    @JsonIgnore
    public Optional<Double> streamingBrainVersion() {
        return streamingBrainVersion;
    }

    @JsonIgnore
    public Optional<Boolean> sync() {
        return sync;
    }

    @JsonIgnore
    public Optional<Double> transcoderActiveVideoSessions() {
        return transcoderActiveVideoSessions;
    }

    @JsonIgnore
    public Optional<Boolean> transcoderAudio() {
        return transcoderAudio;
    }

    @JsonIgnore
    public Optional<Boolean> transcoderLyrics() {
        return transcoderLyrics;
    }

    @JsonIgnore
    public Optional<Boolean> transcoderPhoto() {
        return transcoderPhoto;
    }

    @JsonIgnore
    public Optional<Boolean> transcoderSubtitles() {
        return transcoderSubtitles;
    }

    @JsonIgnore
    public Optional<Boolean> transcoderVideo() {
        return transcoderVideo;
    }

    @JsonIgnore
    public Optional<String> transcoderVideoBitrates() {
        return transcoderVideoBitrates;
    }

    @JsonIgnore
    public Optional<String> transcoderVideoQualities() {
        return transcoderVideoQualities;
    }

    @JsonIgnore
    public Optional<String> transcoderVideoResolutions() {
        return transcoderVideoResolutions;
    }

    @JsonIgnore
    public Optional<Double> updatedAt() {
        return updatedAt;
    }

    @JsonIgnore
    public Optional<Boolean> updater() {
        return updater;
    }

    @JsonIgnore
    public Optional<String> version() {
        return version;
    }

    @JsonIgnore
    public Optional<Boolean> voiceSearch() {
        return voiceSearch;
    }

    @SuppressWarnings("unchecked")
    @JsonIgnore
    public Optional<List<Directory>> directory() {
        return (Optional<List<Directory>>) directory;
    }

    public final static Builder builder() {
        return new Builder();
    }

    public MediaContainer withSize(double size) {
        Utils.checkNotNull(size, "size");
        this.size = Optional.ofNullable(size);
        return this;
    }

    public MediaContainer withSize(Optional<Double> size) {
        Utils.checkNotNull(size, "size");
        this.size = size;
        return this;
    }

    public MediaContainer withAllowCameraUpload(boolean allowCameraUpload) {
        Utils.checkNotNull(allowCameraUpload, "allowCameraUpload");
        this.allowCameraUpload = Optional.ofNullable(allowCameraUpload);
        return this;
    }

    public MediaContainer withAllowCameraUpload(Optional<Boolean> allowCameraUpload) {
        Utils.checkNotNull(allowCameraUpload, "allowCameraUpload");
        this.allowCameraUpload = allowCameraUpload;
        return this;
    }

    public MediaContainer withAllowChannelAccess(boolean allowChannelAccess) {
        Utils.checkNotNull(allowChannelAccess, "allowChannelAccess");
        this.allowChannelAccess = Optional.ofNullable(allowChannelAccess);
        return this;
    }

    public MediaContainer withAllowChannelAccess(Optional<Boolean> allowChannelAccess) {
        Utils.checkNotNull(allowChannelAccess, "allowChannelAccess");
        this.allowChannelAccess = allowChannelAccess;
        return this;
    }

    public MediaContainer withAllowMediaDeletion(boolean allowMediaDeletion) {
        Utils.checkNotNull(allowMediaDeletion, "allowMediaDeletion");
        this.allowMediaDeletion = Optional.ofNullable(allowMediaDeletion);
        return this;
    }

    public MediaContainer withAllowMediaDeletion(Optional<Boolean> allowMediaDeletion) {
        Utils.checkNotNull(allowMediaDeletion, "allowMediaDeletion");
        this.allowMediaDeletion = allowMediaDeletion;
        return this;
    }

    public MediaContainer withAllowSharing(boolean allowSharing) {
        Utils.checkNotNull(allowSharing, "allowSharing");
        this.allowSharing = Optional.ofNullable(allowSharing);
        return this;
    }

    public MediaContainer withAllowSharing(Optional<Boolean> allowSharing) {
        Utils.checkNotNull(allowSharing, "allowSharing");
        this.allowSharing = allowSharing;
        return this;
    }

    public MediaContainer withAllowSync(boolean allowSync) {
        Utils.checkNotNull(allowSync, "allowSync");
        this.allowSync = Optional.ofNullable(allowSync);
        return this;
    }

    public MediaContainer withAllowSync(Optional<Boolean> allowSync) {
        Utils.checkNotNull(allowSync, "allowSync");
        this.allowSync = allowSync;
        return this;
    }

    public MediaContainer withAllowTuners(boolean allowTuners) {
        Utils.checkNotNull(allowTuners, "allowTuners");
        this.allowTuners = Optional.ofNullable(allowTuners);
        return this;
    }

    public MediaContainer withAllowTuners(Optional<Boolean> allowTuners) {
        Utils.checkNotNull(allowTuners, "allowTuners");
        this.allowTuners = allowTuners;
        return this;
    }

    public MediaContainer withBackgroundProcessing(boolean backgroundProcessing) {
        Utils.checkNotNull(backgroundProcessing, "backgroundProcessing");
        this.backgroundProcessing = Optional.ofNullable(backgroundProcessing);
        return this;
    }

    public MediaContainer withBackgroundProcessing(Optional<Boolean> backgroundProcessing) {
        Utils.checkNotNull(backgroundProcessing, "backgroundProcessing");
        this.backgroundProcessing = backgroundProcessing;
        return this;
    }

    public MediaContainer withCertificate(boolean certificate) {
        Utils.checkNotNull(certificate, "certificate");
        this.certificate = Optional.ofNullable(certificate);
        return this;
    }

    public MediaContainer withCertificate(Optional<Boolean> certificate) {
        Utils.checkNotNull(certificate, "certificate");
        this.certificate = certificate;
        return this;
    }

    public MediaContainer withCompanionProxy(boolean companionProxy) {
        Utils.checkNotNull(companionProxy, "companionProxy");
        this.companionProxy = Optional.ofNullable(companionProxy);
        return this;
    }

    public MediaContainer withCompanionProxy(Optional<Boolean> companionProxy) {
        Utils.checkNotNull(companionProxy, "companionProxy");
        this.companionProxy = companionProxy;
        return this;
    }

    public MediaContainer withCountryCode(String countryCode) {
        Utils.checkNotNull(countryCode, "countryCode");
        this.countryCode = Optional.ofNullable(countryCode);
        return this;
    }

    public MediaContainer withCountryCode(Optional<String> countryCode) {
        Utils.checkNotNull(countryCode, "countryCode");
        this.countryCode = countryCode;
        return this;
    }

    public MediaContainer withDiagnostics(String diagnostics) {
        Utils.checkNotNull(diagnostics, "diagnostics");
        this.diagnostics = Optional.ofNullable(diagnostics);
        return this;
    }

    public MediaContainer withDiagnostics(Optional<String> diagnostics) {
        Utils.checkNotNull(diagnostics, "diagnostics");
        this.diagnostics = diagnostics;
        return this;
    }

    public MediaContainer withEventStream(boolean eventStream) {
        Utils.checkNotNull(eventStream, "eventStream");
        this.eventStream = Optional.ofNullable(eventStream);
        return this;
    }

    public MediaContainer withEventStream(Optional<Boolean> eventStream) {
        Utils.checkNotNull(eventStream, "eventStream");
        this.eventStream = eventStream;
        return this;
    }

    public MediaContainer withFriendlyName(String friendlyName) {
        Utils.checkNotNull(friendlyName, "friendlyName");
        this.friendlyName = Optional.ofNullable(friendlyName);
        return this;
    }

    public MediaContainer withFriendlyName(Optional<String> friendlyName) {
        Utils.checkNotNull(friendlyName, "friendlyName");
        this.friendlyName = friendlyName;
        return this;
    }

    public MediaContainer withHubSearch(boolean hubSearch) {
        Utils.checkNotNull(hubSearch, "hubSearch");
        this.hubSearch = Optional.ofNullable(hubSearch);
        return this;
    }

    public MediaContainer withHubSearch(Optional<Boolean> hubSearch) {
        Utils.checkNotNull(hubSearch, "hubSearch");
        this.hubSearch = hubSearch;
        return this;
    }

    public MediaContainer withItemClusters(boolean itemClusters) {
        Utils.checkNotNull(itemClusters, "itemClusters");
        this.itemClusters = Optional.ofNullable(itemClusters);
        return this;
    }

    public MediaContainer withItemClusters(Optional<Boolean> itemClusters) {
        Utils.checkNotNull(itemClusters, "itemClusters");
        this.itemClusters = itemClusters;
        return this;
    }

    public MediaContainer withLivetv(double livetv) {
        Utils.checkNotNull(livetv, "livetv");
        this.livetv = Optional.ofNullable(livetv);
        return this;
    }

    public MediaContainer withLivetv(Optional<Double> livetv) {
        Utils.checkNotNull(livetv, "livetv");
        this.livetv = livetv;
        return this;
    }

    public MediaContainer withMachineIdentifier(String machineIdentifier) {
        Utils.checkNotNull(machineIdentifier, "machineIdentifier");
        this.machineIdentifier = Optional.ofNullable(machineIdentifier);
        return this;
    }

    public MediaContainer withMachineIdentifier(Optional<String> machineIdentifier) {
        Utils.checkNotNull(machineIdentifier, "machineIdentifier");
        this.machineIdentifier = machineIdentifier;
        return this;
    }

    public MediaContainer withMediaProviders(boolean mediaProviders) {
        Utils.checkNotNull(mediaProviders, "mediaProviders");
        this.mediaProviders = Optional.ofNullable(mediaProviders);
        return this;
    }

    public MediaContainer withMediaProviders(Optional<Boolean> mediaProviders) {
        Utils.checkNotNull(mediaProviders, "mediaProviders");
        this.mediaProviders = mediaProviders;
        return this;
    }

    public MediaContainer withMultiuser(boolean multiuser) {
        Utils.checkNotNull(multiuser, "multiuser");
        this.multiuser = Optional.ofNullable(multiuser);
        return this;
    }

    public MediaContainer withMultiuser(Optional<Boolean> multiuser) {
        Utils.checkNotNull(multiuser, "multiuser");
        this.multiuser = multiuser;
        return this;
    }

    public MediaContainer withMusicAnalysis(double musicAnalysis) {
        Utils.checkNotNull(musicAnalysis, "musicAnalysis");
        this.musicAnalysis = Optional.ofNullable(musicAnalysis);
        return this;
    }

    public MediaContainer withMusicAnalysis(Optional<Double> musicAnalysis) {
        Utils.checkNotNull(musicAnalysis, "musicAnalysis");
        this.musicAnalysis = musicAnalysis;
        return this;
    }

    public MediaContainer withMyPlex(boolean myPlex) {
        Utils.checkNotNull(myPlex, "myPlex");
        this.myPlex = Optional.ofNullable(myPlex);
        return this;
    }

    public MediaContainer withMyPlex(Optional<Boolean> myPlex) {
        Utils.checkNotNull(myPlex, "myPlex");
        this.myPlex = myPlex;
        return this;
    }

    public MediaContainer withMyPlexMappingState(String myPlexMappingState) {
        Utils.checkNotNull(myPlexMappingState, "myPlexMappingState");
        this.myPlexMappingState = Optional.ofNullable(myPlexMappingState);
        return this;
    }

    public MediaContainer withMyPlexMappingState(Optional<String> myPlexMappingState) {
        Utils.checkNotNull(myPlexMappingState, "myPlexMappingState");
        this.myPlexMappingState = myPlexMappingState;
        return this;
    }

    public MediaContainer withMyPlexSigninState(String myPlexSigninState) {
        Utils.checkNotNull(myPlexSigninState, "myPlexSigninState");
        this.myPlexSigninState = Optional.ofNullable(myPlexSigninState);
        return this;
    }

    public MediaContainer withMyPlexSigninState(Optional<String> myPlexSigninState) {
        Utils.checkNotNull(myPlexSigninState, "myPlexSigninState");
        this.myPlexSigninState = myPlexSigninState;
        return this;
    }

    public MediaContainer withMyPlexSubscription(boolean myPlexSubscription) {
        Utils.checkNotNull(myPlexSubscription, "myPlexSubscription");
        this.myPlexSubscription = Optional.ofNullable(myPlexSubscription);
        return this;
    }

    public MediaContainer withMyPlexSubscription(Optional<Boolean> myPlexSubscription) {
        Utils.checkNotNull(myPlexSubscription, "myPlexSubscription");
        this.myPlexSubscription = myPlexSubscription;
        return this;
    }

    public MediaContainer withMyPlexUsername(String myPlexUsername) {
        Utils.checkNotNull(myPlexUsername, "myPlexUsername");
        this.myPlexUsername = Optional.ofNullable(myPlexUsername);
        return this;
    }

    public MediaContainer withMyPlexUsername(Optional<String> myPlexUsername) {
        Utils.checkNotNull(myPlexUsername, "myPlexUsername");
        this.myPlexUsername = myPlexUsername;
        return this;
    }

    public MediaContainer withOfflineTranscode(double offlineTranscode) {
        Utils.checkNotNull(offlineTranscode, "offlineTranscode");
        this.offlineTranscode = Optional.ofNullable(offlineTranscode);
        return this;
    }

    public MediaContainer withOfflineTranscode(Optional<Double> offlineTranscode) {
        Utils.checkNotNull(offlineTranscode, "offlineTranscode");
        this.offlineTranscode = offlineTranscode;
        return this;
    }

    public MediaContainer withOwnerFeatures(String ownerFeatures) {
        Utils.checkNotNull(ownerFeatures, "ownerFeatures");
        this.ownerFeatures = Optional.ofNullable(ownerFeatures);
        return this;
    }

    public MediaContainer withOwnerFeatures(Optional<String> ownerFeatures) {
        Utils.checkNotNull(ownerFeatures, "ownerFeatures");
        this.ownerFeatures = ownerFeatures;
        return this;
    }

    public MediaContainer withPhotoAutoTag(boolean photoAutoTag) {
        Utils.checkNotNull(photoAutoTag, "photoAutoTag");
        this.photoAutoTag = Optional.ofNullable(photoAutoTag);
        return this;
    }

    public MediaContainer withPhotoAutoTag(Optional<Boolean> photoAutoTag) {
        Utils.checkNotNull(photoAutoTag, "photoAutoTag");
        this.photoAutoTag = photoAutoTag;
        return this;
    }

    public MediaContainer withPlatform(String platform) {
        Utils.checkNotNull(platform, "platform");
        this.platform = Optional.ofNullable(platform);
        return this;
    }

    public MediaContainer withPlatform(Optional<String> platform) {
        Utils.checkNotNull(platform, "platform");
        this.platform = platform;
        return this;
    }

    public MediaContainer withPlatformVersion(String platformVersion) {
        Utils.checkNotNull(platformVersion, "platformVersion");
        this.platformVersion = Optional.ofNullable(platformVersion);
        return this;
    }

    public MediaContainer withPlatformVersion(Optional<String> platformVersion) {
        Utils.checkNotNull(platformVersion, "platformVersion");
        this.platformVersion = platformVersion;
        return this;
    }

    public MediaContainer withPluginHost(boolean pluginHost) {
        Utils.checkNotNull(pluginHost, "pluginHost");
        this.pluginHost = Optional.ofNullable(pluginHost);
        return this;
    }

    public MediaContainer withPluginHost(Optional<Boolean> pluginHost) {
        Utils.checkNotNull(pluginHost, "pluginHost");
        this.pluginHost = pluginHost;
        return this;
    }

    public MediaContainer withPushNotifications(boolean pushNotifications) {
        Utils.checkNotNull(pushNotifications, "pushNotifications");
        this.pushNotifications = Optional.ofNullable(pushNotifications);
        return this;
    }

    public MediaContainer withPushNotifications(Optional<Boolean> pushNotifications) {
        Utils.checkNotNull(pushNotifications, "pushNotifications");
        this.pushNotifications = pushNotifications;
        return this;
    }

    public MediaContainer withReadOnlyLibraries(boolean readOnlyLibraries) {
        Utils.checkNotNull(readOnlyLibraries, "readOnlyLibraries");
        this.readOnlyLibraries = Optional.ofNullable(readOnlyLibraries);
        return this;
    }

    public MediaContainer withReadOnlyLibraries(Optional<Boolean> readOnlyLibraries) {
        Utils.checkNotNull(readOnlyLibraries, "readOnlyLibraries");
        this.readOnlyLibraries = readOnlyLibraries;
        return this;
    }

    public MediaContainer withStreamingBrainABRVersion(double streamingBrainABRVersion) {
        Utils.checkNotNull(streamingBrainABRVersion, "streamingBrainABRVersion");
        this.streamingBrainABRVersion = Optional.ofNullable(streamingBrainABRVersion);
        return this;
    }

    public MediaContainer withStreamingBrainABRVersion(Optional<Double> streamingBrainABRVersion) {
        Utils.checkNotNull(streamingBrainABRVersion, "streamingBrainABRVersion");
        this.streamingBrainABRVersion = streamingBrainABRVersion;
        return this;
    }

    public MediaContainer withStreamingBrainVersion(double streamingBrainVersion) {
        Utils.checkNotNull(streamingBrainVersion, "streamingBrainVersion");
        this.streamingBrainVersion = Optional.ofNullable(streamingBrainVersion);
        return this;
    }

    public MediaContainer withStreamingBrainVersion(Optional<Double> streamingBrainVersion) {
        Utils.checkNotNull(streamingBrainVersion, "streamingBrainVersion");
        this.streamingBrainVersion = streamingBrainVersion;
        return this;
    }

    public MediaContainer withSync(boolean sync) {
        Utils.checkNotNull(sync, "sync");
        this.sync = Optional.ofNullable(sync);
        return this;
    }

    public MediaContainer withSync(Optional<Boolean> sync) {
        Utils.checkNotNull(sync, "sync");
        this.sync = sync;
        return this;
    }

    public MediaContainer withTranscoderActiveVideoSessions(double transcoderActiveVideoSessions) {
        Utils.checkNotNull(transcoderActiveVideoSessions, "transcoderActiveVideoSessions");
        this.transcoderActiveVideoSessions = Optional.ofNullable(transcoderActiveVideoSessions);
        return this;
    }

    public MediaContainer withTranscoderActiveVideoSessions(Optional<Double> transcoderActiveVideoSessions) {
        Utils.checkNotNull(transcoderActiveVideoSessions, "transcoderActiveVideoSessions");
        this.transcoderActiveVideoSessions = transcoderActiveVideoSessions;
        return this;
    }

    public MediaContainer withTranscoderAudio(boolean transcoderAudio) {
        Utils.checkNotNull(transcoderAudio, "transcoderAudio");
        this.transcoderAudio = Optional.ofNullable(transcoderAudio);
        return this;
    }

    public MediaContainer withTranscoderAudio(Optional<Boolean> transcoderAudio) {
        Utils.checkNotNull(transcoderAudio, "transcoderAudio");
        this.transcoderAudio = transcoderAudio;
        return this;
    }

    public MediaContainer withTranscoderLyrics(boolean transcoderLyrics) {
        Utils.checkNotNull(transcoderLyrics, "transcoderLyrics");
        this.transcoderLyrics = Optional.ofNullable(transcoderLyrics);
        return this;
    }

    public MediaContainer withTranscoderLyrics(Optional<Boolean> transcoderLyrics) {
        Utils.checkNotNull(transcoderLyrics, "transcoderLyrics");
        this.transcoderLyrics = transcoderLyrics;
        return this;
    }

    public MediaContainer withTranscoderPhoto(boolean transcoderPhoto) {
        Utils.checkNotNull(transcoderPhoto, "transcoderPhoto");
        this.transcoderPhoto = Optional.ofNullable(transcoderPhoto);
        return this;
    }

    public MediaContainer withTranscoderPhoto(Optional<Boolean> transcoderPhoto) {
        Utils.checkNotNull(transcoderPhoto, "transcoderPhoto");
        this.transcoderPhoto = transcoderPhoto;
        return this;
    }

    public MediaContainer withTranscoderSubtitles(boolean transcoderSubtitles) {
        Utils.checkNotNull(transcoderSubtitles, "transcoderSubtitles");
        this.transcoderSubtitles = Optional.ofNullable(transcoderSubtitles);
        return this;
    }

    public MediaContainer withTranscoderSubtitles(Optional<Boolean> transcoderSubtitles) {
        Utils.checkNotNull(transcoderSubtitles, "transcoderSubtitles");
        this.transcoderSubtitles = transcoderSubtitles;
        return this;
    }

    public MediaContainer withTranscoderVideo(boolean transcoderVideo) {
        Utils.checkNotNull(transcoderVideo, "transcoderVideo");
        this.transcoderVideo = Optional.ofNullable(transcoderVideo);
        return this;
    }

    public MediaContainer withTranscoderVideo(Optional<Boolean> transcoderVideo) {
        Utils.checkNotNull(transcoderVideo, "transcoderVideo");
        this.transcoderVideo = transcoderVideo;
        return this;
    }

    public MediaContainer withTranscoderVideoBitrates(String transcoderVideoBitrates) {
        Utils.checkNotNull(transcoderVideoBitrates, "transcoderVideoBitrates");
        this.transcoderVideoBitrates = Optional.ofNullable(transcoderVideoBitrates);
        return this;
    }

    public MediaContainer withTranscoderVideoBitrates(Optional<String> transcoderVideoBitrates) {
        Utils.checkNotNull(transcoderVideoBitrates, "transcoderVideoBitrates");
        this.transcoderVideoBitrates = transcoderVideoBitrates;
        return this;
    }

    public MediaContainer withTranscoderVideoQualities(String transcoderVideoQualities) {
        Utils.checkNotNull(transcoderVideoQualities, "transcoderVideoQualities");
        this.transcoderVideoQualities = Optional.ofNullable(transcoderVideoQualities);
        return this;
    }

    public MediaContainer withTranscoderVideoQualities(Optional<String> transcoderVideoQualities) {
        Utils.checkNotNull(transcoderVideoQualities, "transcoderVideoQualities");
        this.transcoderVideoQualities = transcoderVideoQualities;
        return this;
    }

    public MediaContainer withTranscoderVideoResolutions(String transcoderVideoResolutions) {
        Utils.checkNotNull(transcoderVideoResolutions, "transcoderVideoResolutions");
        this.transcoderVideoResolutions = Optional.ofNullable(transcoderVideoResolutions);
        return this;
    }

    public MediaContainer withTranscoderVideoResolutions(Optional<String> transcoderVideoResolutions) {
        Utils.checkNotNull(transcoderVideoResolutions, "transcoderVideoResolutions");
        this.transcoderVideoResolutions = transcoderVideoResolutions;
        return this;
    }

    public MediaContainer withUpdatedAt(double updatedAt) {
        Utils.checkNotNull(updatedAt, "updatedAt");
        this.updatedAt = Optional.ofNullable(updatedAt);
        return this;
    }

    public MediaContainer withUpdatedAt(Optional<Double> updatedAt) {
        Utils.checkNotNull(updatedAt, "updatedAt");
        this.updatedAt = updatedAt;
        return this;
    }

    public MediaContainer withUpdater(boolean updater) {
        Utils.checkNotNull(updater, "updater");
        this.updater = Optional.ofNullable(updater);
        return this;
    }

    public MediaContainer withUpdater(Optional<Boolean> updater) {
        Utils.checkNotNull(updater, "updater");
        this.updater = updater;
        return this;
    }

    public MediaContainer withVersion(String version) {
        Utils.checkNotNull(version, "version");
        this.version = Optional.ofNullable(version);
        return this;
    }

    public MediaContainer withVersion(Optional<String> version) {
        Utils.checkNotNull(version, "version");
        this.version = version;
        return this;
    }

    public MediaContainer withVoiceSearch(boolean voiceSearch) {
        Utils.checkNotNull(voiceSearch, "voiceSearch");
        this.voiceSearch = Optional.ofNullable(voiceSearch);
        return this;
    }

    public MediaContainer withVoiceSearch(Optional<Boolean> voiceSearch) {
        Utils.checkNotNull(voiceSearch, "voiceSearch");
        this.voiceSearch = voiceSearch;
        return this;
    }

    public MediaContainer withDirectory(List<Directory> directory) {
        Utils.checkNotNull(directory, "directory");
        this.directory = Optional.ofNullable(directory);
        return this;
    }

    public MediaContainer withDirectory(Optional<? extends List<Directory>> directory) {
        Utils.checkNotNull(directory, "directory");
        this.directory = directory;
        return this;
    }
    
    @Override
    public boolean equals(java.lang.Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        MediaContainer other = (MediaContainer) o;
        return 
            Objects.deepEquals(this.size, other.size) &&
            Objects.deepEquals(this.allowCameraUpload, other.allowCameraUpload) &&
            Objects.deepEquals(this.allowChannelAccess, other.allowChannelAccess) &&
            Objects.deepEquals(this.allowMediaDeletion, other.allowMediaDeletion) &&
            Objects.deepEquals(this.allowSharing, other.allowSharing) &&
            Objects.deepEquals(this.allowSync, other.allowSync) &&
            Objects.deepEquals(this.allowTuners, other.allowTuners) &&
            Objects.deepEquals(this.backgroundProcessing, other.backgroundProcessing) &&
            Objects.deepEquals(this.certificate, other.certificate) &&
            Objects.deepEquals(this.companionProxy, other.companionProxy) &&
            Objects.deepEquals(this.countryCode, other.countryCode) &&
            Objects.deepEquals(this.diagnostics, other.diagnostics) &&
            Objects.deepEquals(this.eventStream, other.eventStream) &&
            Objects.deepEquals(this.friendlyName, other.friendlyName) &&
            Objects.deepEquals(this.hubSearch, other.hubSearch) &&
            Objects.deepEquals(this.itemClusters, other.itemClusters) &&
            Objects.deepEquals(this.livetv, other.livetv) &&
            Objects.deepEquals(this.machineIdentifier, other.machineIdentifier) &&
            Objects.deepEquals(this.mediaProviders, other.mediaProviders) &&
            Objects.deepEquals(this.multiuser, other.multiuser) &&
            Objects.deepEquals(this.musicAnalysis, other.musicAnalysis) &&
            Objects.deepEquals(this.myPlex, other.myPlex) &&
            Objects.deepEquals(this.myPlexMappingState, other.myPlexMappingState) &&
            Objects.deepEquals(this.myPlexSigninState, other.myPlexSigninState) &&
            Objects.deepEquals(this.myPlexSubscription, other.myPlexSubscription) &&
            Objects.deepEquals(this.myPlexUsername, other.myPlexUsername) &&
            Objects.deepEquals(this.offlineTranscode, other.offlineTranscode) &&
            Objects.deepEquals(this.ownerFeatures, other.ownerFeatures) &&
            Objects.deepEquals(this.photoAutoTag, other.photoAutoTag) &&
            Objects.deepEquals(this.platform, other.platform) &&
            Objects.deepEquals(this.platformVersion, other.platformVersion) &&
            Objects.deepEquals(this.pluginHost, other.pluginHost) &&
            Objects.deepEquals(this.pushNotifications, other.pushNotifications) &&
            Objects.deepEquals(this.readOnlyLibraries, other.readOnlyLibraries) &&
            Objects.deepEquals(this.streamingBrainABRVersion, other.streamingBrainABRVersion) &&
            Objects.deepEquals(this.streamingBrainVersion, other.streamingBrainVersion) &&
            Objects.deepEquals(this.sync, other.sync) &&
            Objects.deepEquals(this.transcoderActiveVideoSessions, other.transcoderActiveVideoSessions) &&
            Objects.deepEquals(this.transcoderAudio, other.transcoderAudio) &&
            Objects.deepEquals(this.transcoderLyrics, other.transcoderLyrics) &&
            Objects.deepEquals(this.transcoderPhoto, other.transcoderPhoto) &&
            Objects.deepEquals(this.transcoderSubtitles, other.transcoderSubtitles) &&
            Objects.deepEquals(this.transcoderVideo, other.transcoderVideo) &&
            Objects.deepEquals(this.transcoderVideoBitrates, other.transcoderVideoBitrates) &&
            Objects.deepEquals(this.transcoderVideoQualities, other.transcoderVideoQualities) &&
            Objects.deepEquals(this.transcoderVideoResolutions, other.transcoderVideoResolutions) &&
            Objects.deepEquals(this.updatedAt, other.updatedAt) &&
            Objects.deepEquals(this.updater, other.updater) &&
            Objects.deepEquals(this.version, other.version) &&
            Objects.deepEquals(this.voiceSearch, other.voiceSearch) &&
            Objects.deepEquals(this.directory, other.directory);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(
            size,
            allowCameraUpload,
            allowChannelAccess,
            allowMediaDeletion,
            allowSharing,
            allowSync,
            allowTuners,
            backgroundProcessing,
            certificate,
            companionProxy,
            countryCode,
            diagnostics,
            eventStream,
            friendlyName,
            hubSearch,
            itemClusters,
            livetv,
            machineIdentifier,
            mediaProviders,
            multiuser,
            musicAnalysis,
            myPlex,
            myPlexMappingState,
            myPlexSigninState,
            myPlexSubscription,
            myPlexUsername,
            offlineTranscode,
            ownerFeatures,
            photoAutoTag,
            platform,
            platformVersion,
            pluginHost,
            pushNotifications,
            readOnlyLibraries,
            streamingBrainABRVersion,
            streamingBrainVersion,
            sync,
            transcoderActiveVideoSessions,
            transcoderAudio,
            transcoderLyrics,
            transcoderPhoto,
            transcoderSubtitles,
            transcoderVideo,
            transcoderVideoBitrates,
            transcoderVideoQualities,
            transcoderVideoResolutions,
            updatedAt,
            updater,
            version,
            voiceSearch,
            directory);
    }
    
    @Override
    public String toString() {
        return Utils.toString(MediaContainer.class,
                "size", size,
                "allowCameraUpload", allowCameraUpload,
                "allowChannelAccess", allowChannelAccess,
                "allowMediaDeletion", allowMediaDeletion,
                "allowSharing", allowSharing,
                "allowSync", allowSync,
                "allowTuners", allowTuners,
                "backgroundProcessing", backgroundProcessing,
                "certificate", certificate,
                "companionProxy", companionProxy,
                "countryCode", countryCode,
                "diagnostics", diagnostics,
                "eventStream", eventStream,
                "friendlyName", friendlyName,
                "hubSearch", hubSearch,
                "itemClusters", itemClusters,
                "livetv", livetv,
                "machineIdentifier", machineIdentifier,
                "mediaProviders", mediaProviders,
                "multiuser", multiuser,
                "musicAnalysis", musicAnalysis,
                "myPlex", myPlex,
                "myPlexMappingState", myPlexMappingState,
                "myPlexSigninState", myPlexSigninState,
                "myPlexSubscription", myPlexSubscription,
                "myPlexUsername", myPlexUsername,
                "offlineTranscode", offlineTranscode,
                "ownerFeatures", ownerFeatures,
                "photoAutoTag", photoAutoTag,
                "platform", platform,
                "platformVersion", platformVersion,
                "pluginHost", pluginHost,
                "pushNotifications", pushNotifications,
                "readOnlyLibraries", readOnlyLibraries,
                "streamingBrainABRVersion", streamingBrainABRVersion,
                "streamingBrainVersion", streamingBrainVersion,
                "sync", sync,
                "transcoderActiveVideoSessions", transcoderActiveVideoSessions,
                "transcoderAudio", transcoderAudio,
                "transcoderLyrics", transcoderLyrics,
                "transcoderPhoto", transcoderPhoto,
                "transcoderSubtitles", transcoderSubtitles,
                "transcoderVideo", transcoderVideo,
                "transcoderVideoBitrates", transcoderVideoBitrates,
                "transcoderVideoQualities", transcoderVideoQualities,
                "transcoderVideoResolutions", transcoderVideoResolutions,
                "updatedAt", updatedAt,
                "updater", updater,
                "version", version,
                "voiceSearch", voiceSearch,
                "directory", directory);
    }
    
    public final static class Builder {
 
        private Optional<Double> size = Optional.empty();
 
        private Optional<Boolean> allowCameraUpload = Optional.empty();
 
        private Optional<Boolean> allowChannelAccess = Optional.empty();
 
        private Optional<Boolean> allowMediaDeletion = Optional.empty();
 
        private Optional<Boolean> allowSharing = Optional.empty();
 
        private Optional<Boolean> allowSync = Optional.empty();
 
        private Optional<Boolean> allowTuners = Optional.empty();
 
        private Optional<Boolean> backgroundProcessing = Optional.empty();
 
        private Optional<Boolean> certificate = Optional.empty();
 
        private Optional<Boolean> companionProxy = Optional.empty();
 
        private Optional<String> countryCode = Optional.empty();
 
        private Optional<String> diagnostics = Optional.empty();
 
        private Optional<Boolean> eventStream = Optional.empty();
 
        private Optional<String> friendlyName = Optional.empty();
 
        private Optional<Boolean> hubSearch = Optional.empty();
 
        private Optional<Boolean> itemClusters = Optional.empty();
 
        private Optional<Double> livetv = Optional.empty();
 
        private Optional<String> machineIdentifier = Optional.empty();
 
        private Optional<Boolean> mediaProviders = Optional.empty();
 
        private Optional<Boolean> multiuser = Optional.empty();
 
        private Optional<Double> musicAnalysis = Optional.empty();
 
        private Optional<Boolean> myPlex = Optional.empty();
 
        private Optional<String> myPlexMappingState = Optional.empty();
 
        private Optional<String> myPlexSigninState = Optional.empty();
 
        private Optional<Boolean> myPlexSubscription = Optional.empty();
 
        private Optional<String> myPlexUsername = Optional.empty();
 
        private Optional<Double> offlineTranscode = Optional.empty();
 
        private Optional<String> ownerFeatures = Optional.empty();
 
        private Optional<Boolean> photoAutoTag = Optional.empty();
 
        private Optional<String> platform = Optional.empty();
 
        private Optional<String> platformVersion = Optional.empty();
 
        private Optional<Boolean> pluginHost = Optional.empty();
 
        private Optional<Boolean> pushNotifications = Optional.empty();
 
        private Optional<Boolean> readOnlyLibraries = Optional.empty();
 
        private Optional<Double> streamingBrainABRVersion = Optional.empty();
 
        private Optional<Double> streamingBrainVersion = Optional.empty();
 
        private Optional<Boolean> sync = Optional.empty();
 
        private Optional<Double> transcoderActiveVideoSessions = Optional.empty();
 
        private Optional<Boolean> transcoderAudio = Optional.empty();
 
        private Optional<Boolean> transcoderLyrics = Optional.empty();
 
        private Optional<Boolean> transcoderPhoto = Optional.empty();
 
        private Optional<Boolean> transcoderSubtitles = Optional.empty();
 
        private Optional<Boolean> transcoderVideo = Optional.empty();
 
        private Optional<String> transcoderVideoBitrates = Optional.empty();
 
        private Optional<String> transcoderVideoQualities = Optional.empty();
 
        private Optional<String> transcoderVideoResolutions = Optional.empty();
 
        private Optional<Double> updatedAt = Optional.empty();
 
        private Optional<Boolean> updater = Optional.empty();
 
        private Optional<String> version = Optional.empty();
 
        private Optional<Boolean> voiceSearch = Optional.empty();
 
        private Optional<? extends List<Directory>> directory = Optional.empty();  
        
        private Builder() {
          // force use of static builder() method
        }

        public Builder size(double size) {
            Utils.checkNotNull(size, "size");
            this.size = Optional.ofNullable(size);
            return this;
        }

        public Builder size(Optional<Double> size) {
            Utils.checkNotNull(size, "size");
            this.size = size;
            return this;
        }

        public Builder allowCameraUpload(boolean allowCameraUpload) {
            Utils.checkNotNull(allowCameraUpload, "allowCameraUpload");
            this.allowCameraUpload = Optional.ofNullable(allowCameraUpload);
            return this;
        }

        public Builder allowCameraUpload(Optional<Boolean> allowCameraUpload) {
            Utils.checkNotNull(allowCameraUpload, "allowCameraUpload");
            this.allowCameraUpload = allowCameraUpload;
            return this;
        }

        public Builder allowChannelAccess(boolean allowChannelAccess) {
            Utils.checkNotNull(allowChannelAccess, "allowChannelAccess");
            this.allowChannelAccess = Optional.ofNullable(allowChannelAccess);
            return this;
        }

        public Builder allowChannelAccess(Optional<Boolean> allowChannelAccess) {
            Utils.checkNotNull(allowChannelAccess, "allowChannelAccess");
            this.allowChannelAccess = allowChannelAccess;
            return this;
        }

        public Builder allowMediaDeletion(boolean allowMediaDeletion) {
            Utils.checkNotNull(allowMediaDeletion, "allowMediaDeletion");
            this.allowMediaDeletion = Optional.ofNullable(allowMediaDeletion);
            return this;
        }

        public Builder allowMediaDeletion(Optional<Boolean> allowMediaDeletion) {
            Utils.checkNotNull(allowMediaDeletion, "allowMediaDeletion");
            this.allowMediaDeletion = allowMediaDeletion;
            return this;
        }

        public Builder allowSharing(boolean allowSharing) {
            Utils.checkNotNull(allowSharing, "allowSharing");
            this.allowSharing = Optional.ofNullable(allowSharing);
            return this;
        }

        public Builder allowSharing(Optional<Boolean> allowSharing) {
            Utils.checkNotNull(allowSharing, "allowSharing");
            this.allowSharing = allowSharing;
            return this;
        }

        public Builder allowSync(boolean allowSync) {
            Utils.checkNotNull(allowSync, "allowSync");
            this.allowSync = Optional.ofNullable(allowSync);
            return this;
        }

        public Builder allowSync(Optional<Boolean> allowSync) {
            Utils.checkNotNull(allowSync, "allowSync");
            this.allowSync = allowSync;
            return this;
        }

        public Builder allowTuners(boolean allowTuners) {
            Utils.checkNotNull(allowTuners, "allowTuners");
            this.allowTuners = Optional.ofNullable(allowTuners);
            return this;
        }

        public Builder allowTuners(Optional<Boolean> allowTuners) {
            Utils.checkNotNull(allowTuners, "allowTuners");
            this.allowTuners = allowTuners;
            return this;
        }

        public Builder backgroundProcessing(boolean backgroundProcessing) {
            Utils.checkNotNull(backgroundProcessing, "backgroundProcessing");
            this.backgroundProcessing = Optional.ofNullable(backgroundProcessing);
            return this;
        }

        public Builder backgroundProcessing(Optional<Boolean> backgroundProcessing) {
            Utils.checkNotNull(backgroundProcessing, "backgroundProcessing");
            this.backgroundProcessing = backgroundProcessing;
            return this;
        }

        public Builder certificate(boolean certificate) {
            Utils.checkNotNull(certificate, "certificate");
            this.certificate = Optional.ofNullable(certificate);
            return this;
        }

        public Builder certificate(Optional<Boolean> certificate) {
            Utils.checkNotNull(certificate, "certificate");
            this.certificate = certificate;
            return this;
        }

        public Builder companionProxy(boolean companionProxy) {
            Utils.checkNotNull(companionProxy, "companionProxy");
            this.companionProxy = Optional.ofNullable(companionProxy);
            return this;
        }

        public Builder companionProxy(Optional<Boolean> companionProxy) {
            Utils.checkNotNull(companionProxy, "companionProxy");
            this.companionProxy = companionProxy;
            return this;
        }

        public Builder countryCode(String countryCode) {
            Utils.checkNotNull(countryCode, "countryCode");
            this.countryCode = Optional.ofNullable(countryCode);
            return this;
        }

        public Builder countryCode(Optional<String> countryCode) {
            Utils.checkNotNull(countryCode, "countryCode");
            this.countryCode = countryCode;
            return this;
        }

        public Builder diagnostics(String diagnostics) {
            Utils.checkNotNull(diagnostics, "diagnostics");
            this.diagnostics = Optional.ofNullable(diagnostics);
            return this;
        }

        public Builder diagnostics(Optional<String> diagnostics) {
            Utils.checkNotNull(diagnostics, "diagnostics");
            this.diagnostics = diagnostics;
            return this;
        }

        public Builder eventStream(boolean eventStream) {
            Utils.checkNotNull(eventStream, "eventStream");
            this.eventStream = Optional.ofNullable(eventStream);
            return this;
        }

        public Builder eventStream(Optional<Boolean> eventStream) {
            Utils.checkNotNull(eventStream, "eventStream");
            this.eventStream = eventStream;
            return this;
        }

        public Builder friendlyName(String friendlyName) {
            Utils.checkNotNull(friendlyName, "friendlyName");
            this.friendlyName = Optional.ofNullable(friendlyName);
            return this;
        }

        public Builder friendlyName(Optional<String> friendlyName) {
            Utils.checkNotNull(friendlyName, "friendlyName");
            this.friendlyName = friendlyName;
            return this;
        }

        public Builder hubSearch(boolean hubSearch) {
            Utils.checkNotNull(hubSearch, "hubSearch");
            this.hubSearch = Optional.ofNullable(hubSearch);
            return this;
        }

        public Builder hubSearch(Optional<Boolean> hubSearch) {
            Utils.checkNotNull(hubSearch, "hubSearch");
            this.hubSearch = hubSearch;
            return this;
        }

        public Builder itemClusters(boolean itemClusters) {
            Utils.checkNotNull(itemClusters, "itemClusters");
            this.itemClusters = Optional.ofNullable(itemClusters);
            return this;
        }

        public Builder itemClusters(Optional<Boolean> itemClusters) {
            Utils.checkNotNull(itemClusters, "itemClusters");
            this.itemClusters = itemClusters;
            return this;
        }

        public Builder livetv(double livetv) {
            Utils.checkNotNull(livetv, "livetv");
            this.livetv = Optional.ofNullable(livetv);
            return this;
        }

        public Builder livetv(Optional<Double> livetv) {
            Utils.checkNotNull(livetv, "livetv");
            this.livetv = livetv;
            return this;
        }

        public Builder machineIdentifier(String machineIdentifier) {
            Utils.checkNotNull(machineIdentifier, "machineIdentifier");
            this.machineIdentifier = Optional.ofNullable(machineIdentifier);
            return this;
        }

        public Builder machineIdentifier(Optional<String> machineIdentifier) {
            Utils.checkNotNull(machineIdentifier, "machineIdentifier");
            this.machineIdentifier = machineIdentifier;
            return this;
        }

        public Builder mediaProviders(boolean mediaProviders) {
            Utils.checkNotNull(mediaProviders, "mediaProviders");
            this.mediaProviders = Optional.ofNullable(mediaProviders);
            return this;
        }

        public Builder mediaProviders(Optional<Boolean> mediaProviders) {
            Utils.checkNotNull(mediaProviders, "mediaProviders");
            this.mediaProviders = mediaProviders;
            return this;
        }

        public Builder multiuser(boolean multiuser) {
            Utils.checkNotNull(multiuser, "multiuser");
            this.multiuser = Optional.ofNullable(multiuser);
            return this;
        }

        public Builder multiuser(Optional<Boolean> multiuser) {
            Utils.checkNotNull(multiuser, "multiuser");
            this.multiuser = multiuser;
            return this;
        }

        public Builder musicAnalysis(double musicAnalysis) {
            Utils.checkNotNull(musicAnalysis, "musicAnalysis");
            this.musicAnalysis = Optional.ofNullable(musicAnalysis);
            return this;
        }

        public Builder musicAnalysis(Optional<Double> musicAnalysis) {
            Utils.checkNotNull(musicAnalysis, "musicAnalysis");
            this.musicAnalysis = musicAnalysis;
            return this;
        }

        public Builder myPlex(boolean myPlex) {
            Utils.checkNotNull(myPlex, "myPlex");
            this.myPlex = Optional.ofNullable(myPlex);
            return this;
        }

        public Builder myPlex(Optional<Boolean> myPlex) {
            Utils.checkNotNull(myPlex, "myPlex");
            this.myPlex = myPlex;
            return this;
        }

        public Builder myPlexMappingState(String myPlexMappingState) {
            Utils.checkNotNull(myPlexMappingState, "myPlexMappingState");
            this.myPlexMappingState = Optional.ofNullable(myPlexMappingState);
            return this;
        }

        public Builder myPlexMappingState(Optional<String> myPlexMappingState) {
            Utils.checkNotNull(myPlexMappingState, "myPlexMappingState");
            this.myPlexMappingState = myPlexMappingState;
            return this;
        }

        public Builder myPlexSigninState(String myPlexSigninState) {
            Utils.checkNotNull(myPlexSigninState, "myPlexSigninState");
            this.myPlexSigninState = Optional.ofNullable(myPlexSigninState);
            return this;
        }

        public Builder myPlexSigninState(Optional<String> myPlexSigninState) {
            Utils.checkNotNull(myPlexSigninState, "myPlexSigninState");
            this.myPlexSigninState = myPlexSigninState;
            return this;
        }

        public Builder myPlexSubscription(boolean myPlexSubscription) {
            Utils.checkNotNull(myPlexSubscription, "myPlexSubscription");
            this.myPlexSubscription = Optional.ofNullable(myPlexSubscription);
            return this;
        }

        public Builder myPlexSubscription(Optional<Boolean> myPlexSubscription) {
            Utils.checkNotNull(myPlexSubscription, "myPlexSubscription");
            this.myPlexSubscription = myPlexSubscription;
            return this;
        }

        public Builder myPlexUsername(String myPlexUsername) {
            Utils.checkNotNull(myPlexUsername, "myPlexUsername");
            this.myPlexUsername = Optional.ofNullable(myPlexUsername);
            return this;
        }

        public Builder myPlexUsername(Optional<String> myPlexUsername) {
            Utils.checkNotNull(myPlexUsername, "myPlexUsername");
            this.myPlexUsername = myPlexUsername;
            return this;
        }

        public Builder offlineTranscode(double offlineTranscode) {
            Utils.checkNotNull(offlineTranscode, "offlineTranscode");
            this.offlineTranscode = Optional.ofNullable(offlineTranscode);
            return this;
        }

        public Builder offlineTranscode(Optional<Double> offlineTranscode) {
            Utils.checkNotNull(offlineTranscode, "offlineTranscode");
            this.offlineTranscode = offlineTranscode;
            return this;
        }

        public Builder ownerFeatures(String ownerFeatures) {
            Utils.checkNotNull(ownerFeatures, "ownerFeatures");
            this.ownerFeatures = Optional.ofNullable(ownerFeatures);
            return this;
        }

        public Builder ownerFeatures(Optional<String> ownerFeatures) {
            Utils.checkNotNull(ownerFeatures, "ownerFeatures");
            this.ownerFeatures = ownerFeatures;
            return this;
        }

        public Builder photoAutoTag(boolean photoAutoTag) {
            Utils.checkNotNull(photoAutoTag, "photoAutoTag");
            this.photoAutoTag = Optional.ofNullable(photoAutoTag);
            return this;
        }

        public Builder photoAutoTag(Optional<Boolean> photoAutoTag) {
            Utils.checkNotNull(photoAutoTag, "photoAutoTag");
            this.photoAutoTag = photoAutoTag;
            return this;
        }

        public Builder platform(String platform) {
            Utils.checkNotNull(platform, "platform");
            this.platform = Optional.ofNullable(platform);
            return this;
        }

        public Builder platform(Optional<String> platform) {
            Utils.checkNotNull(platform, "platform");
            this.platform = platform;
            return this;
        }

        public Builder platformVersion(String platformVersion) {
            Utils.checkNotNull(platformVersion, "platformVersion");
            this.platformVersion = Optional.ofNullable(platformVersion);
            return this;
        }

        public Builder platformVersion(Optional<String> platformVersion) {
            Utils.checkNotNull(platformVersion, "platformVersion");
            this.platformVersion = platformVersion;
            return this;
        }

        public Builder pluginHost(boolean pluginHost) {
            Utils.checkNotNull(pluginHost, "pluginHost");
            this.pluginHost = Optional.ofNullable(pluginHost);
            return this;
        }

        public Builder pluginHost(Optional<Boolean> pluginHost) {
            Utils.checkNotNull(pluginHost, "pluginHost");
            this.pluginHost = pluginHost;
            return this;
        }

        public Builder pushNotifications(boolean pushNotifications) {
            Utils.checkNotNull(pushNotifications, "pushNotifications");
            this.pushNotifications = Optional.ofNullable(pushNotifications);
            return this;
        }

        public Builder pushNotifications(Optional<Boolean> pushNotifications) {
            Utils.checkNotNull(pushNotifications, "pushNotifications");
            this.pushNotifications = pushNotifications;
            return this;
        }

        public Builder readOnlyLibraries(boolean readOnlyLibraries) {
            Utils.checkNotNull(readOnlyLibraries, "readOnlyLibraries");
            this.readOnlyLibraries = Optional.ofNullable(readOnlyLibraries);
            return this;
        }

        public Builder readOnlyLibraries(Optional<Boolean> readOnlyLibraries) {
            Utils.checkNotNull(readOnlyLibraries, "readOnlyLibraries");
            this.readOnlyLibraries = readOnlyLibraries;
            return this;
        }

        public Builder streamingBrainABRVersion(double streamingBrainABRVersion) {
            Utils.checkNotNull(streamingBrainABRVersion, "streamingBrainABRVersion");
            this.streamingBrainABRVersion = Optional.ofNullable(streamingBrainABRVersion);
            return this;
        }

        public Builder streamingBrainABRVersion(Optional<Double> streamingBrainABRVersion) {
            Utils.checkNotNull(streamingBrainABRVersion, "streamingBrainABRVersion");
            this.streamingBrainABRVersion = streamingBrainABRVersion;
            return this;
        }

        public Builder streamingBrainVersion(double streamingBrainVersion) {
            Utils.checkNotNull(streamingBrainVersion, "streamingBrainVersion");
            this.streamingBrainVersion = Optional.ofNullable(streamingBrainVersion);
            return this;
        }

        public Builder streamingBrainVersion(Optional<Double> streamingBrainVersion) {
            Utils.checkNotNull(streamingBrainVersion, "streamingBrainVersion");
            this.streamingBrainVersion = streamingBrainVersion;
            return this;
        }

        public Builder sync(boolean sync) {
            Utils.checkNotNull(sync, "sync");
            this.sync = Optional.ofNullable(sync);
            return this;
        }

        public Builder sync(Optional<Boolean> sync) {
            Utils.checkNotNull(sync, "sync");
            this.sync = sync;
            return this;
        }

        public Builder transcoderActiveVideoSessions(double transcoderActiveVideoSessions) {
            Utils.checkNotNull(transcoderActiveVideoSessions, "transcoderActiveVideoSessions");
            this.transcoderActiveVideoSessions = Optional.ofNullable(transcoderActiveVideoSessions);
            return this;
        }

        public Builder transcoderActiveVideoSessions(Optional<Double> transcoderActiveVideoSessions) {
            Utils.checkNotNull(transcoderActiveVideoSessions, "transcoderActiveVideoSessions");
            this.transcoderActiveVideoSessions = transcoderActiveVideoSessions;
            return this;
        }

        public Builder transcoderAudio(boolean transcoderAudio) {
            Utils.checkNotNull(transcoderAudio, "transcoderAudio");
            this.transcoderAudio = Optional.ofNullable(transcoderAudio);
            return this;
        }

        public Builder transcoderAudio(Optional<Boolean> transcoderAudio) {
            Utils.checkNotNull(transcoderAudio, "transcoderAudio");
            this.transcoderAudio = transcoderAudio;
            return this;
        }

        public Builder transcoderLyrics(boolean transcoderLyrics) {
            Utils.checkNotNull(transcoderLyrics, "transcoderLyrics");
            this.transcoderLyrics = Optional.ofNullable(transcoderLyrics);
            return this;
        }

        public Builder transcoderLyrics(Optional<Boolean> transcoderLyrics) {
            Utils.checkNotNull(transcoderLyrics, "transcoderLyrics");
            this.transcoderLyrics = transcoderLyrics;
            return this;
        }

        public Builder transcoderPhoto(boolean transcoderPhoto) {
            Utils.checkNotNull(transcoderPhoto, "transcoderPhoto");
            this.transcoderPhoto = Optional.ofNullable(transcoderPhoto);
            return this;
        }

        public Builder transcoderPhoto(Optional<Boolean> transcoderPhoto) {
            Utils.checkNotNull(transcoderPhoto, "transcoderPhoto");
            this.transcoderPhoto = transcoderPhoto;
            return this;
        }

        public Builder transcoderSubtitles(boolean transcoderSubtitles) {
            Utils.checkNotNull(transcoderSubtitles, "transcoderSubtitles");
            this.transcoderSubtitles = Optional.ofNullable(transcoderSubtitles);
            return this;
        }

        public Builder transcoderSubtitles(Optional<Boolean> transcoderSubtitles) {
            Utils.checkNotNull(transcoderSubtitles, "transcoderSubtitles");
            this.transcoderSubtitles = transcoderSubtitles;
            return this;
        }

        public Builder transcoderVideo(boolean transcoderVideo) {
            Utils.checkNotNull(transcoderVideo, "transcoderVideo");
            this.transcoderVideo = Optional.ofNullable(transcoderVideo);
            return this;
        }

        public Builder transcoderVideo(Optional<Boolean> transcoderVideo) {
            Utils.checkNotNull(transcoderVideo, "transcoderVideo");
            this.transcoderVideo = transcoderVideo;
            return this;
        }

        public Builder transcoderVideoBitrates(String transcoderVideoBitrates) {
            Utils.checkNotNull(transcoderVideoBitrates, "transcoderVideoBitrates");
            this.transcoderVideoBitrates = Optional.ofNullable(transcoderVideoBitrates);
            return this;
        }

        public Builder transcoderVideoBitrates(Optional<String> transcoderVideoBitrates) {
            Utils.checkNotNull(transcoderVideoBitrates, "transcoderVideoBitrates");
            this.transcoderVideoBitrates = transcoderVideoBitrates;
            return this;
        }

        public Builder transcoderVideoQualities(String transcoderVideoQualities) {
            Utils.checkNotNull(transcoderVideoQualities, "transcoderVideoQualities");
            this.transcoderVideoQualities = Optional.ofNullable(transcoderVideoQualities);
            return this;
        }

        public Builder transcoderVideoQualities(Optional<String> transcoderVideoQualities) {
            Utils.checkNotNull(transcoderVideoQualities, "transcoderVideoQualities");
            this.transcoderVideoQualities = transcoderVideoQualities;
            return this;
        }

        public Builder transcoderVideoResolutions(String transcoderVideoResolutions) {
            Utils.checkNotNull(transcoderVideoResolutions, "transcoderVideoResolutions");
            this.transcoderVideoResolutions = Optional.ofNullable(transcoderVideoResolutions);
            return this;
        }

        public Builder transcoderVideoResolutions(Optional<String> transcoderVideoResolutions) {
            Utils.checkNotNull(transcoderVideoResolutions, "transcoderVideoResolutions");
            this.transcoderVideoResolutions = transcoderVideoResolutions;
            return this;
        }

        public Builder updatedAt(double updatedAt) {
            Utils.checkNotNull(updatedAt, "updatedAt");
            this.updatedAt = Optional.ofNullable(updatedAt);
            return this;
        }

        public Builder updatedAt(Optional<Double> updatedAt) {
            Utils.checkNotNull(updatedAt, "updatedAt");
            this.updatedAt = updatedAt;
            return this;
        }

        public Builder updater(boolean updater) {
            Utils.checkNotNull(updater, "updater");
            this.updater = Optional.ofNullable(updater);
            return this;
        }

        public Builder updater(Optional<Boolean> updater) {
            Utils.checkNotNull(updater, "updater");
            this.updater = updater;
            return this;
        }

        public Builder version(String version) {
            Utils.checkNotNull(version, "version");
            this.version = Optional.ofNullable(version);
            return this;
        }

        public Builder version(Optional<String> version) {
            Utils.checkNotNull(version, "version");
            this.version = version;
            return this;
        }

        public Builder voiceSearch(boolean voiceSearch) {
            Utils.checkNotNull(voiceSearch, "voiceSearch");
            this.voiceSearch = Optional.ofNullable(voiceSearch);
            return this;
        }

        public Builder voiceSearch(Optional<Boolean> voiceSearch) {
            Utils.checkNotNull(voiceSearch, "voiceSearch");
            this.voiceSearch = voiceSearch;
            return this;
        }

        public Builder directory(List<Directory> directory) {
            Utils.checkNotNull(directory, "directory");
            this.directory = Optional.ofNullable(directory);
            return this;
        }

        public Builder directory(Optional<? extends List<Directory>> directory) {
            Utils.checkNotNull(directory, "directory");
            this.directory = directory;
            return this;
        }
        
        public MediaContainer build() {
            return new MediaContainer(
                size,
                allowCameraUpload,
                allowChannelAccess,
                allowMediaDeletion,
                allowSharing,
                allowSync,
                allowTuners,
                backgroundProcessing,
                certificate,
                companionProxy,
                countryCode,
                diagnostics,
                eventStream,
                friendlyName,
                hubSearch,
                itemClusters,
                livetv,
                machineIdentifier,
                mediaProviders,
                multiuser,
                musicAnalysis,
                myPlex,
                myPlexMappingState,
                myPlexSigninState,
                myPlexSubscription,
                myPlexUsername,
                offlineTranscode,
                ownerFeatures,
                photoAutoTag,
                platform,
                platformVersion,
                pluginHost,
                pushNotifications,
                readOnlyLibraries,
                streamingBrainABRVersion,
                streamingBrainVersion,
                sync,
                transcoderActiveVideoSessions,
                transcoderAudio,
                transcoderLyrics,
                transcoderPhoto,
                transcoderSubtitles,
                transcoderVideo,
                transcoderVideoBitrates,
                transcoderVideoQualities,
                transcoderVideoResolutions,
                updatedAt,
                updater,
                version,
                voiceSearch,
                directory);
        }
    }
}

