// Path: src/main/java/com/lmax/disruptor/util/MutableLong.java
// public class MutableLong
// {
//     private long value = 0L;
// 
//     /**
//      * Default constructor
//      */
//     public MutableLong()
//     {
//     }
// 
//     /**
//      * Construct the holder with initial value.
//      *
//      * @param initialValue to be initially set.
//      */
//     public MutableLong(final long initialValue)
//     {
//         this.value = initialValue;
//     }
// 
//     /**
//      * Get the long value.
//      *
//      * @return the long value.
//      */
//     public long get()
//     {
//         return value;
//     }
// 
//     /**
//      * Set the long value.
//      *
//      * @param value to set.
//      */
//     public void set(final long value)
//     {
//         this.value = value;
//     }
// }
// 
// Path: src/main/java/com/lmax/disruptor/util/PaddedAtomicLong.java
// public class PaddedAtomicLong extends AtomicLong
// {
//     public volatile long p1, p2, p3, p4, p5, p6 = 7L;
// 
//     /**
//      * Default constructor
//      */
//     public PaddedAtomicLong()
//     {
//     }
// 
//     /**
//      * Construct with an initial value.
//      *
//      * @param initialValue for initialisation
//      */
//     public PaddedAtomicLong(final long initialValue)
//     {
//         super(initialValue);
//     }
// 
//     public long sumPaddingToPreventOptimisation()
//     {
//         return p1 + p2 + p3 + p4 + p5 + p6;
//     }
// }
// 
// Path: src/main/java/com/lmax/disruptor/util/Util.java
// public static long getMinimumSequence(final Sequence[] sequences)
// {
//     long minimum = Long.MAX_VALUE;
// 
//     for (Sequence sequence : sequences)
//     {
//         long value = sequence.get();
//         minimum = minimum < value ? minimum : value;
//     }
// 
//     return minimum;
// }


import com.lmax.disruptor.util.MutableLong;
import com.lmax.disruptor.util.PaddedAtomicLong;
import java.util.concurrent.locks.LockSupport;
import static com.lmax.disruptor.util.Util.getMinimumSequence;

    /**
     * Construct a new multi-threaded publisher {@link ClaimStrategy} for a given buffer size.
     *
     * @param bufferSize for the underlying data structure.
     */
    public MultiThreadedClaimStrategy(final int bufferSize)
    {
        this.bufferSize = bufferSize;
    }

    @Override
    public int getBufferSize()
    {
        return bufferSize;
    }

    @Override
    public long getSequence()
    {
        return claimSequence.get();
    }

    @Override
    public boolean hasAvailableCapacity(final int availableCapacity, final Sequence[] dependentSequences)
    {
        final long wrapPoint = (claimSequence.get() + availableCapacity) - bufferSize;
        final MutableLong minGatingSequence = minGatingSequenceThreadLocal.get();
        if (wrapPoint > minGatingSequence.get())
        {
// Path: src/main/java/com/lmax/disruptor/util/MutableLong.java
// public class MutableLong
// {
//     private long value = 0L;
// 
//     /**
//      * Default constructor
//      */
//     public MutableLong()
//     {
//     }
// 
//     /**
//      * Construct the holder with initial value.
//      *
//      * @param initialValue to be initially set.
//      */
//     public MutableLong(final long initialValue)
//     {
//         this.value = initialValue;
//     }
// 
//     /**
//      * Get the long value.
//      *
//      * @return the long value.
//      */
//     public long get()
//     {
//         return value;
//     }
// 
//     /**
//      * Set the long value.
//      *
//      * @param value to set.
//      */
//     public void set(final long value)
//     {
//         this.value = value;
//     }
// }
// 
// Path: src/main/java/com/lmax/disruptor/util/PaddedAtomicLong.java
// public class PaddedAtomicLong extends AtomicLong
// {
//     public volatile long p1, p2, p3, p4, p5, p6 = 7L;
// 
//     /**
//      * Default constructor
//      */
//     public PaddedAtomicLong()
//     {
//     }
// 
//     /**
//      * Construct with an initial value.
//      *
//      * @param initialValue for initialisation
//      */
//     public PaddedAtomicLong(final long initialValue)
//     {
//         super(initialValue);
//     }
// 
//     public long sumPaddingToPreventOptimisation()
//     {
//         return p1 + p2 + p3 + p4 + p5 + p6;
//     }
// }
// 
// Path: src/main/java/com/lmax/disruptor/util/Util.java
// public static long getMinimumSequence(final Sequence[] sequences)
// {
//     long minimum = Long.MAX_VALUE;
// 
//     for (Sequence sequence : sequences)
//     {
//         long value = sequence.get();
//         minimum = minimum < value ? minimum : value;
//     }
// 
//     return minimum;
// }


// Path: src/main/java/com/lmax/disruptor/MultiThreadedClaimStrategy.java
import com.lmax.disruptor.util.MutableLong;
import com.lmax.disruptor.util.PaddedAtomicLong;
import java.util.concurrent.locks.LockSupport;
import static com.lmax.disruptor.util.Util.getMinimumSequence;


    /**
     * Construct a new multi-threaded publisher {@link ClaimStrategy} for a given buffer size.
     *
     * @param bufferSize for the underlying data structure.
     */
    public MultiThreadedClaimStrategy(final int bufferSize)
    {
        this.bufferSize = bufferSize;
    }

    @Override
    public int getBufferSize()
    {
        return bufferSize;
    }

    @Override
    public long getSequence()
    {
        return claimSequence.get();
    }

    @Override
    public boolean hasAvailableCapacity(final int availableCapacity, final Sequence[] dependentSequences)
    {
        final long wrapPoint = (claimSequence.get() + availableCapacity) - bufferSize;
        final MutableLong minGatingSequence = minGatingSequenceThreadLocal.get();
        if (wrapPoint > minGatingSequence.get())
        {
            long minSequence = getMinimumSequence(dependentSequences);