text:
package com.marshalchen.ultimaterecyclerview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;

import com.marshalchen.ultimaterecyclerview.ui.DividerItemDecoration;
import com.marshalchen.ultimaterecyclerview.ui.VerticalSwipeRefreshLayout;
import com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionButton;
import com.marshalchen.ultimaterecyclerview.ui.floatingactionbutton.FloatingActionsMenu;
import com.marshalchen.ultimaterecyclerview.uiUtils.SavedStateScrolling;
import com.nineoldandroids.animation.ValueAnimator;
import com.nineoldandroids.view.ViewHelper;

/**
 * UltimateRecyclerView is a recyclerview which contains many features like  swipe to dismiss,animations,drag drop etc.
 */
public class UltimateRecyclerView extends FrameLayout implements Scrollable {
    public RecyclerView mRecyclerView;

    protected FloatingActionButton defaultFloatingActionButton;
    private OnLoadMoreListener onLoadMoreListener;
    private int lastVisibleItemPosition;
    protected RecyclerView.OnScrollListener mOnScrollListener;
    protected LAYOUT_MANAGER_TYPE layoutManagerType;
    private boolean isLoadingMore = false;
    protected int mPadding;
    protected int mPaddingTop;
    protected int mPaddingBottom;
    protected int mPaddingLeft;
    protected int mPaddingRight;
    protected boolean mClipToPadding;
    private UltimateViewAdapter mAdapter;

    // Fields that should be saved onSaveInstanceState
    private int mPrevFirstVisiblePosition;
    private int mPrevFirstVisibleChildHeight = -1;
    private int mPrevScrolledChildrenHeight;
    private int mPrevScrollY;
    private int mScrollY;
    private SparseIntArray mChildrenHeights = new SparseIntArray();
    ;

    // Fields that don't need to be saved onSaveInstanceState
    private ObservableScrollState mObservableScrollState;
    private ObservableScrollViewCallbacks mCallbacks;
    //private ScrollState mScrollState;
    private boolean mFirstScroll;
    private boolean mDragging;
    private boolean mIntercepted;
    private MotionEvent mPrevMoveEvent;
    private ViewGroup mTouchInterceptionViewGroup;

    protected ViewStub mEmpty;
    protected View mEmptyView;
    protected int mEmptyId;

    protected ViewStub mFloatingButtonViewStub;
    protected View mFloatingButtonView;
    protected int mFloatingButtonId;
    protected int[] defaultSwipeToDismissColors = null;
    public int showLoadMoreItemNum = 3;

    public VerticalSwipeRefreshLayout mSwipeRefreshLayout;

    // added by Sevan Joe to support scrollbars
    private static final int SCROLLBARS_NONE = 0;
    private static final int SCROLLBARS_VERTICAL = 1;
    private static final int SCROLLBARS_HORIZONTAL = 2;
    private int mScrollbarsStyle;

    private int mVisibleItemCount = 0;
    private int mTotalItemCount = 0;
    private int previousTotal = 0;
    private int mFirstVisibleItem;

    public UltimateRecyclerView(Context context) {
        super(context);
        initViews();
    }

    public UltimateRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initAttrs(attrs);
        initViews();
    }

    public UltimateRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(attrs);
        initViews();
    }

    public void setRecylerViewBackgroundColor(int color) {
        mRecyclerView.setBackgroundColor(color);
    }

    protected void initViews() {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.ultimate_recycler_view_layout, this);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.ultimate_list);
        mSwipeRefreshLayout = (VerticalSwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
        setScrollbars();
        mSwipeRefreshLayout.setEnabled(false);

        if (mRecyclerView != null) {

            mRecyclerView.setClipToPadding(mClipToPadding);
            if (mPadding != -1.1f) {
                mRecyclerView.setPadding(mPadding, mPadding, mPadding, mPadding);
            } else {
                mRecyclerView.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom);
            }
        }

        defaultFloatingActionButton = (FloatingActionButton) view.findViewById(R.id.defaultFloatingActionButton);
        setDefaultScrollListener();

        mEmpty = (ViewStub) view.findViewById(R.id.emptyview);
        mFloatingButtonViewStub = (ViewStub) view.findViewById(R.id.floatingActionViewStub);

        mEmpty.setLayoutResource(mEmptyId);

        mFloatingButtonViewStub.setLayoutResource(mFloatingButtonId);

        if (mEmptyId != 0)
            mEmptyView = mEmpty.inflate();
        mEmpty.setVisibility(View.GONE);

    }

    /**
     * Set custom empty view.The view will be shown if the adapter is null or the size of the adapter is zero.
     * You can customize it as loading view.
     *
     * @param emptyResourceId
     */
    public void setEmptyView(int emptyResourceId) {
        mEmptyId = emptyResourceId;

        mEmpty.setLayoutResource(mEmptyId);
        if (mEmptyId != 0)
            mEmptyView = mEmpty.inflate();
        mEmpty.setVisibility(View.GONE);
    }

    /**
     * Show the custom or default empty view.
     * You can customize it as loading view.
     */
    public void showEmptyView() {
        if (mEmptyId != 0)
            mEmpty.setVisibility(View.VISIBLE);
    }

    /**
     * Hide the custom or default empty view.
     */
    public void hideEmptyView() {
        if (mEmptyId != 0)
            mEmpty.setVisibility(View.GONE);
    }

    /**
     * Show the custom floating button view.
     */
    public void showFloatingButtonView() {
        if (mFloatingButtonId != 0) {
            mFloatingButtonView = mFloatingButtonViewStub.inflate();
            mFloatingButtonView.setVisibility(View.VISIBLE);
        }

    }

    /**
     * Add ScrollBar of Recyclerview
     */
    protected void setScrollbars() {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        switch (mScrollbarsStyle) {
            case SCROLLBARS_VERTICAL:
                mSwipeRefreshLayout.removeView(mRecyclerView);
                View verticalView = inflater.inflate(R.layout.vertical_recycler_view, mSwipeRefreshLayout, true);
                mRecyclerView = (RecyclerView) verticalView.findViewById(R.id.ultimate_list);
                break;
            case SCROLLBARS_HORIZONTAL:
                mSwipeRefreshLayout.removeView(mRecyclerView);
                View horizontalView = inflater.inflate(R.layout.horizontal_recycler_view, mSwipeRefreshLayout, true);
                mRecyclerView = (RecyclerView) horizontalView.findViewById(R.id.ultimate_list);
                break;
            default:
                break;
        }
    }

    protected void initAttrs(AttributeSet attrs) {
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.UltimateRecyclerview);

        try {
            mPadding = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPadding, -1.1f);
            mPaddingTop = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingTop, 0.0f);
            mPaddingBottom = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingBottom, 0.0f);
            mPaddingLeft = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingLeft, 0.0f);
            mPaddingRight = (int) typedArray.getDimension(R.styleable.UltimateRecyclerview_recyclerviewPaddingRight, 0.0f);
            mClipToPadding = typedArray.getBoolean(R.styleable.UltimateRecyclerview_recyclerviewClipToPadding, false);
            mEmptyId = typedArray.getResourceId(R.styleable.UltimateRecyclerview_recyclerviewEmptyView, 0);
            mFloatingButtonId = typedArray.getResourceId(R.styleable.UltimateRecyclerview_recyclerviewFloatingActionView, 0);
            mScrollbarsStyle = typedArray.getInt(R.styleable.UltimateRecyclerview_recyclerviewScrollbars, SCROLLBARS_NONE);
            int colorList = typedArray.getResourceId(R.styleable.UltimateRecyclerview_recyclerviewDefaultSwipeColor, 0);
            if (colorList != 0) {
                defaultSwipeToDismissColors = getResources().getIntArray(colorList);
            }
        } finally {
            typedArray.recycle();
        }
    }

    protected void setDefaultScrollListener() {
        mRecyclerView.removeOnScrollListener(mOnScrollListener);
        mOnScrollListener = new RecyclerView.OnScrollListener() {

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (mHeader != null) {
                    mTotalYScrolled += dy;
                    if (isParallaxHeader)
                        translateHeader(mTotalYScrolled);
                }
                enableShoworHideToolbarAndFloatingButton(recyclerView);
            }
        };

        mRecyclerView.addOnScrollListener(mOnScrollListener);
    }

    private void setObserableScrollListener() {
        mRecyclerView.removeOnScrollListener(mOnScrollListener);
        mOnScrollListener = new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                enableShoworHideToolbarAndFloatingButton(recyclerView);
            }
        };
        mRecyclerView.addOnScrollListener(mOnScrollListener);
    }

    /**
     * Enable loading more of the recyclerview
     */
    public void enableLoadmore() {
        mRecyclerView.removeOnScrollListener(mOnScrollListener);
        mOnScrollListener = new RecyclerView.OnScrollListener() {
            private int[] lastPositions;

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (mHeader != null) {
                    mTotalYScrolled += dy;
                    if (isParallaxHeader)
                        translateHeader(mTotalYScrolled);
                }
                RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();

                if (layoutManagerType == null) {
                    if (layoutManager instanceof GridLayoutManager) {
                        layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;
                    } else if (layoutManager instanceof LinearLayoutManager) {
                        layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
                    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
                        layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
                    } else {
                        throw new RuntimeException("Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
                    }
                }

                switch (layoutManagerType) {
                    case LINEAR:
                        mVisibleItemCount = layoutManager.getChildCount();
                        mTotalItemCount = layoutManager.getItemCount();
                    case GRID:
                        lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
                        mFirstVisibleItem = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
                        break;
                    case STAGGERED_GRID:
                        StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
                        if (lastPositions == null)
                            lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];

                        staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
                        lastVisibleItemPosition = findMax(lastPositions);

                        staggeredGridLayoutManager.findFirstVisibleItemPositions(lastPositions);
                        mFirstVisibleItem = findMin(lastPositions);
                        break;
                }

                if (isLoadingMore) {
                    //todo: there are some bugs needs to be adjusted for admob adapter
                    if (mTotalItemCount > previousTotal) {
                        isLoadingMore = false;
                        previousTotal = mTotalItemCount;
                    }
                }

                if (!isLoadingMore && (mTotalItemCount - mVisibleItemCount) <= mFirstVisibleItem) {
                    //todo: there are some bugs needs to be adjusted for admob adapter
                    onLoadMoreListener.loadMore(mRecyclerView.getAdapter().getItemCount(), lastVisibleItemPosition);
                    isLoadingMore = true;
                    previousTotal = mTotalItemCount;
                }

                enableShoworHideToolbarAndFloatingButton(recyclerView);

            }

        };
        mRecyclerView.addOnScrollListener(mOnScrollListener);
        if (mAdapter != null && mAdapter.getCustomLoadMoreView() == null)
            mAdapter.setCustomLoadMoreView(LayoutInflater.from(getContext())
                    .inflate(R.layout.bottom_progressbar, null));
    }

    /**
     * Remove loading more scroll listener
     */
    public void disableLoadmore() {
        setDefaultScrollListener();
        mAdapter.swipeCustomLoadMoreView(LayoutInflater.from(getContext())
                .inflate(R.layout.empty_progressbar, null));
    }

    protected void enableShoworHideToolbarAndFloatingButton(RecyclerView recyclerView) {
        if (mCallbacks != null) {
            if (getChildCount() > 0) {
                int firstVisiblePosition = recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0));
                int lastVisiblePosition = recyclerView.getChildAdapterPosition(recyclerView.getChildAt(recyclerView.getChildCount() - 1));
                try {
                    for (int i = firstVisiblePosition, j = 0; i <= lastVisiblePosition; i++, j++) {
                        int childHeight = 0;
                        View child = recyclerView.getChildAt(j);
                        if (mChildrenHeights.indexOfKey(i) < 0 || (child != null && child.getHeight() != mChildrenHeights.get(i))) {
                            if (child != null)
                                childHeight = child.getHeight();
                        }
                        mChildrenHeights.put(i, childHeight);
                    }

                } catch (NullPointerException e) {
                    e.printStackTrace();
                    //todo: need to solve this issue when the first child is missing from the scroll. Please also see the debug from the RV error.
                    //todo: 07-01 11:50:36.359  32348-32348/com.marshalchen.ultimaterecyclerview.demo D/RVerror? Attempt to invoke virtual method 'int android.view.View.getHeight()' on a null object reference
                    URLogs.e(e, "");
                }

                View firstVisibleChild = recyclerView.getChildAt(0);
                if (firstVisibleChild != null) {
                    if (mPrevFirstVisiblePosition < firstVisiblePosition) {
                        // scroll down
                        int skippedChildrenHeight = 0;
                        if (firstVisiblePosition - mPrevFirstVisiblePosition != 1) {
                            for (int i = firstVisiblePosition - 1; i > mPrevFirstVisiblePosition; i--) {
                                if (0 < mChildrenHeights.indexOfKey(i)) {
                                    skippedChildrenHeight += mChildrenHeights.get(i);
                                } else {
                                    // Approximate each item's height to the first visible child.
                                    // It may be incorrect, but without this, scrollY will be broken
                                    // when scrolling from the bottom.
                                    skippedChildrenHeight += firstVisibleChild.getHeight();
                                }
                            }
                        }
                        mPrevScrolledChildrenHeight += mPrevFirstVisibleChildHeight + skippedChildrenHeight;
                        mPrevFirstVisibleChildHeight = firstVisibleChild.getHeight();
                    } else if (firstVisiblePosition < mPrevFirstVisiblePosition) {
                        // scroll up
                        int skippedChildrenHeight = 0;
                        if (mPrevFirstVisiblePosition - firstVisiblePosition != 1) {
                            for (int i = mPrevFirstVisiblePosition - 1; i > firstVisiblePosition; i--) {
                                if (0 < mChildrenHeights.indexOfKey(i)) {
                                    skippedChildrenHeight += mChildrenHeights.get(i);
                                } else {
                                    // Approximate each item's height to the first visible child.
                                    // It may be incorrect, but without this, scrollY will be broken
                                    // when scrolling from the bottom.
                                    skippedChildrenHeight += firstVisibleChild.getHeight();
                                }
                            }
                        }
                        mPrevScrolledChildrenHeight -= firstVisibleChild.getHeight() + skippedChildrenHeight;
                        mPrevFirstVisibleChildHeight = firstVisibleChild.getHeight();
                    } else if (firstVisiblePosition == 0) {
                        mPrevFirstVisibleChildHeight = firstVisibleChild.getHeight();
                        mPrevScrolledChildrenHeight = 0;
                    }
                    if (mPrevFirstVisibleChildHeight < 0) {
                        mPrevFirstVisibleChildHeight = 0;
                    }
                    mScrollY = mPrevScrolledChildrenHeight - firstVisibleChild.getTop();
                    mPrevFirstVisiblePosition = firstVisiblePosition;

                    mCallbacks.onScrollChanged(mScrollY, mFirstScroll, mDragging);
//                    if (mFirstScroll) {
//                        mFirstScroll = false;
//                    }

//                    if (mPrevScrollY < mScrollY) {
//                        //down
//                        mObservableScrollState = ObservableScrollState.UP;
//                    } else if (mScrollY < mPrevScrollY) {
//                        //up
//                        mObservableScrollState = ObservableScrollState.DOWN;
//                    } else {
//                        mObservableScrollState = ObservableScrollState.STOP;
//                    }

                    if (mPrevScrollY < mScrollY) {
                        //down
                        if (mFirstScroll) { // first scroll down , mPrevScrollY == 0, reach here.
                            mFirstScroll = false;
                            mObservableScrollState = ObservableScrollState.STOP;
                        }
                        mObservableScrollState = ObservableScrollState.UP;
                    } else if (mScrollY < mPrevScrollY) {
                        //up
                        mObservableScrollState = ObservableScrollState.DOWN;
                    } else {
                        mObservableScrollState = ObservableScrollState.STOP;
                    }
                    if (mFirstScroll) {
                        mFirstScroll = false;
                    }
                    mPrevScrollY = mScrollY;
                }
            }
        }
    }

    /**
     * Set a listener that will be notified of any changes in scroll state or position.
     *
     * @param customOnScrollListener to set or null to clear
     * @deprecated Use {@link #addOnScrollListener(RecyclerView.OnScrollListener)} and
     * {@link #removeOnScrollListener(RecyclerView.OnScrollListener)}
     */
    public void setOnScrollListener(RecyclerView.OnScrollListener customOnScrollListener) {
        mRecyclerView.setOnScrollListener(customOnScrollListener);
    }

    public void addOnScrollListener(RecyclerView.OnScrollListener customOnScrollListener) {
        mRecyclerView.addOnScrollListener(customOnScrollListener);
    }

    public void removeOnScrollListener(RecyclerView.OnScrollListener customOnScrollListener) {
        mRecyclerView.removeOnScrollListener(customOnScrollListener);
    }

    public void addItemDividerDecoration(Context context) {
        RecyclerView.ItemDecoration itemDecoration =
                new DividerItemDecoration(context, DividerItemDecoration.VERTICAL_LIST);
        mRecyclerView.addItemDecoration(itemDecoration);
    }

    /**
     * Swaps the current adapter with the provided one. It is similar to
     * {@link #setAdapter(UltimateViewAdapter)} but assumes existing adapter and the new adapter uses the same
     * ViewHolder and does not clear the RecycledViewPool.
     * <p/>
     * Note that it still calls onAdapterChanged callbacks.
     *
     * @param adapter                       The new adapter to set, or null to set no adapter.
     * @param removeAndRecycleExistingViews If set to true, RecyclerView will recycle all existing
     *                                      Views. If adapters have stable ids and/or you want to
     *                                      animate the disappearing views, you may prefer to set
     *                                      this to false.
     */
    public void swapAdapter(UltimateViewAdapter adapter, boolean removeAndRecycleExistingViews) {
        mRecyclerView.swapAdapter(adapter, removeAndRecycleExistingViews);
    }

    /**
     * Add an {@link RecyclerView.ItemDecoration} to this RecyclerView. Item decorations can affect both measurement and drawing of individual item views.
     * <p>Item decorations are ordered. Decorations placed earlier in the list will be run/queried/drawn first for their effects on item views. Padding added to views will be nested; a padding added by an earlier decoration will mean further item decorations in the list will be asked to draw/pad within the previous decoration's given area.</p>
     *
     * @param itemDecoration Decoration to add
     */
    public void addItemDecoration(RecyclerView.ItemDecoration itemDecoration) {
        mRecyclerView.addItemDecoration(itemDecoration);
    }

    /**
     * Add an {@link RecyclerView.ItemDecoration} to this RecyclerView. Item decorations can affect both measurement and drawing of individual item views.
     * <p>Item decorations are ordered. Decorations placed earlier in the list will be run/queried/drawn first for their effects on item views. Padding added to views will be nested; a padding added by an earlier decoration will mean further item decorations in the list will be asked to draw/pad within the previous decoration's given area.</p>
     *
     * @param itemDecoration Decoration to add
     * @param index          Position in the decoration chain to insert this decoration at. If this value is negative the decoration will be added at the end.
     */
    public void addItemDecoration(RecyclerView.ItemDecoration itemDecoration, int index) {
        mRecyclerView.addItemDecoration(itemDecoration, index);
    }

    /**
     * Sets the {@link RecyclerView.ItemAnimator} that will handle animations involving changes
     * to the items in this RecyclerView. By default, RecyclerView instantiates and
     * uses an instance of {@link android.support.v7.widget.DefaultItemAnimator}. Whether item animations are
     * enabled for the RecyclerView depends on the ItemAnimator and whether
     * the LayoutManager {@link android.support.v7.widget.RecyclerView.LayoutManager#supportsPredictiveItemAnimations()
     * supports item animations}.
     *
     * @param animator The ItemAnimator being set. If null, no animations will occur
     *                 when changes occur to the items in this RecyclerView.
     */
    public void setItemAnimator(RecyclerView.ItemAnimator animator) {
        mRecyclerView.setItemAnimator(animator);
    }

    /**
     * Gets the current ItemAnimator for this RecyclerView. A null return value
     * indicates that there is no animator and that item changes will happen without
     * any animations. By default, RecyclerView instantiates and
     * uses an instance of {@link android.support.v7.widget.DefaultItemAnimator}.
     *
     * @return ItemAnimator The current ItemAnimator. If null, no animations will occur
     * when changes occur to the items in this RecyclerView.
     */
    public RecyclerView.ItemAnimator getItemAnimator() {
        return mRecyclerView.getItemAnimator();
    }

    /**
     * Set the listener when refresh is triggered and enable the SwipeRefreshLayout
     *
     * @param listener
     */
    public void setDefaultOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener) {

        mSwipeRefreshLayout.setEnabled(true);
        if (defaultSwipeToDismissColors != null && defaultSwipeToDismissColors.length > 0) {
            mSwipeRefreshLayout.setColorSchemeColors(defaultSwipeToDismissColors);
        } else {
            mSwipeRefreshLayout.setColorSchemeResources(
                    android.R.color.holo_blue_bright,
                    android.R.color.holo_green_light,
                    android.R.color.holo_orange_light,
                    android.R.color.holo_red_light);

        }

        mSwipeRefreshLayout.setOnRefreshListener(listener);
    }

    /**
     * Set the color resources used in the progress animation from color resources. The first color will also be the color of the bar that grows in response to a user swipe gesture.
     *
     * @param colors
     */
    public void setDefaultSwipeToRefreshColorScheme(int... colors) {
        mSwipeRefreshLayout.setColorSchemeColors(colors);
    }

    /**
     * Set the load more listener of recyclerview
     *
     * @param onLoadMoreListener
     */
    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        this.onLoadMoreListener = onLoadMoreListener;
    }

    /**
     * Set the layout manager to the recycler
     *
     * @param manager
     */
    public void setLayoutManager(RecyclerView.LayoutManager manager) {
        mRecyclerView.setLayoutManager(manager);
    }

    /**
     * Get the adapter of UltimateRecyclerview
     *
     * @return
     */
    public RecyclerView.Adapter getAdapter() {
        return mRecyclerView.getAdapter();
    }

    /**
     * Set a UltimateViewAdapter or the subclass of UltimateViewAdapter to the recyclerview
     *
     * @param adapter the adapter in normal
     */
    public void setAdapter(UltimateViewAdapter adapter) {
        mAdapter = adapter;
        mRecyclerView.setAdapter(mAdapter);
        if (mSwipeRefreshLayout != null)
            mSwipeRefreshLayout.setRefreshing(false);
        if (mAdapter != null)
            mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
                @Override
                public void onItemRangeChanged(int positionStart, int itemCount) {
                    super.onItemRangeChanged(positionStart, itemCount);
                    updateHelperDisplays();
                }

                @Override
                public void onItemRangeInserted(int positionStart, int itemCount) {
                    super.onItemRangeInserted(positionStart, itemCount);
                    updateHelperDisplays();
                }

                @Override
                public void onItemRangeRemoved(int positionStart, int itemCount) {
                    super.onItemRangeRemoved(positionStart, itemCount);
                    updateHelperDisplays();
                }

                @Override
                public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
                    super.onItemRangeMoved(fromPosition, toPosition, itemCount);
                    updateHelperDisplays();
                }

                @Override
                public void onChanged() {
                    super.onChanged();
                    updateHelperDisplays();
                }
            });
        if ((adapter == null || mAdapter.getAdapterItemCount() == 0) && mEmptyId != 0) {
            mEmpty.setVisibility(View.VISIBLE);
        }
    }

    private void updateHelperDisplays() {
        isLoadingMore = false;
        if (mSwipeRefreshLayout != null)
            mSwipeRefreshLayout.setRefreshing(false);
        if (mAdapter == null)
            return;
        /**
         * fixed by jjHesk
         * + empty layout is NONE
         * + getItemCount is zero
         */
        if (mAdapter.getAdapterItemCount() == 0) {
            mEmpty.setVisibility(mEmptyId != 0 ? View.VISIBLE : View.GONE);
        }
        if (mAdapter.getCustomLoadMoreView() == null) return;
        if (mAdapter.getAdapterItemCount() >= showLoadMoreItemNum && mAdapter.getCustomLoadMoreView().getVisibility() == View.GONE) {
            mAdapter.getCustomLoadMoreView().setVisibility(View.VISIBLE);
        }
        if (mAdapter.getAdapterItemCount() < showLoadMoreItemNum) {
            mAdapter.getCustomLoadMoreView().setVisibility(View.GONE);
        }
    }

    /**
     * @param adapter input param
     * @deprecated Short for some ui effects
     */
    @Deprecated
    public void setAdapter(RecyclerView.Adapter adapter) {
        mRecyclerView.setAdapter(adapter);
        if (mSwipeRefreshLayout != null)
            mSwipeRefreshLayout.setRefreshing(false);
        adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
            @Override
            public void onItemRangeChanged(int positionStart, int itemCount) {
                super.onItemRangeChanged(positionStart, itemCount);
                update();
            }

            @Override
            public void onItemRangeInserted(int positionStart, int itemCount) {
                super.onItemRangeInserted(positionStart, itemCount);
                update();
            }

            @Override
            public void onItemRangeRemoved(int positionStart, int itemCount) {
                super.onItemRangeRemoved(positionStart, itemCount);
                update();
            }

            @Override
            public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
                super.onItemRangeMoved(fromPosition, toPosition, itemCount);
                update();
            }

            @Override
            public void onChanged() {
                super.onChanged();
                update();
            }

            private void update() {
                isLoadingMore = false;
                if (mSwipeRefreshLayout != null)
                    mSwipeRefreshLayout.setRefreshing(false);
//
            }

        });
    }

    public void setHasFixedSize(boolean hasFixedSize) {
        mRecyclerView.setHasFixedSize(hasFixedSize);
    }

    /**
     * Notify the widget that refresh state has changed. Do not call this when refresh is triggered by a swipe gesture.
     *
     * @param refreshing
     */
    public void setRefreshing(boolean refreshing) {
        if (mSwipeRefreshLayout != null)
            mSwipeRefreshLayout.setRefreshing(refreshing);
    }

    /**
     * Enable or disable the SwipeRefreshLayout.
     * Default is false
     *
     * @param isSwipeRefresh
     */
    public void enableDefaultSwipeRefresh(boolean isSwipeRefresh) {
        if (mSwipeRefreshLayout != null)
            mSwipeRefreshLayout.setEnabled(isSwipeRefresh);
    }

    public interface OnLoadMoreListener {
        void loadMore(int itemsCount, final int maxLastVisiblePosition);
    }

    public static enum LAYOUT_MANAGER_TYPE {
        LINEAR,
        GRID,
        STAGGERED_GRID
    }

    private int findMax(int[] lastPositions) {
        int max = Integer.MIN_VALUE;
        for (int value : lastPositions) {
            if (value > max)
                max = value;
        }
        return max;
    }

    private int findMin(int[] lastPositions) {
        int min = Integer.MAX_VALUE;
        for (int value : lastPositions) {
            if (value != RecyclerView.NO_POSITION && value < min)
                min = value;
        }
        return min;
    }

    private CustomRelativeWrapper mHeader;
    private int mTotalYScrolled;
    private final float SCROLL_MULTIPLIER = 0.5f;
    private OnParallaxScroll mParallaxScroll;
    private static boolean isParallaxHeader = false;

    /**
     * Set the parallax header of the recyclerview
     *
     * @param header
     */
    public void setParallaxHeader(View header) {
        mHeader = new CustomRelativeWrapper(header.getContext());
        mHeader.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        mHeader.addView(header, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        if (mAdapter != null)
            mAdapter.setCustomHeaderView(mHeader);
        isParallaxHeader = true;
    }

    /**
     * Set the normal header of the recyclerview
     *
     * @param header
     */
    public void setNormalHeader(View header) {
        setParallaxHeader(header);
        isParallaxHeader = false;
    }

    /**
     * Set the on scroll method of parallax header
     *
     * @param parallaxScroll
     */
    public void setOnParallaxScroll(OnParallaxScroll parallaxScroll) {
        mParallaxScroll = parallaxScroll;
        mParallaxScroll.onParallaxScroll(0, 0, mHeader);
    }

    private void translateHeader(float of) {
        float ofCalculated = of * SCROLL_MULTIPLIER;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            //Logs.d("ofCalculated    " + ofCalculated+"   "+mHeader.getHeight());
            mHeader.setTranslationY(ofCalculated);
        } else {
            TranslateAnimation anim = new TranslateAnimation(0, 0, ofCalculated, ofCalculated);
            anim.setFillAfter(true);
            anim.setDuration(0);
            mHeader.startAnimation(anim);
        }
        mHeader.setClipY(Math.round(ofCalculated));
        if (mParallaxScroll != null) {
            float left = Math.min(1, ((ofCalculated) / (mHeader.getHeight() * SCROLL_MULTIPLIER)));
            mParallaxScroll.onParallaxScroll(left, of, mHeader);
        }
    }

    public interface OnParallaxScroll {
        void onParallaxScroll(float percentage, float offset, View parallax);
    }

    /**
     * Custom layout for the Parallax Header.
     */
    public static class CustomRelativeWrapper extends RelativeLayout {

        private int mOffset;

        public CustomRelativeWrapper(Context context) {
            super(context);
        }

        @Override
        protected void dispatchDraw(Canvas canvas) {
            if (isParallaxHeader)
                canvas.clipRect(new Rect(getLeft(), getTop(), getRight(), getBottom() + mOffset));
            super.dispatchDraw(canvas);
        }

        public void setClipY(int offset) {
            mOffset = offset;
            invalidate();
        }
    }

    public void setScrollViewCallbacks(ObservableScrollViewCallbacks listener) {
        mCallbacks = listener;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        SavedStateScrolling ss = (SavedStateScrolling) state;
        mPrevFirstVisiblePosition = ss.prevFirstVisiblePosition;
        mPrevFirstVisibleChildHeight = ss.prevFirstVisibleChildHeight;
        mPrevScrolledChildrenHeight = ss.prevScrolledChildrenHeight;
        mPrevScrollY = ss.prevScrollY;
        mScrollY = ss.scrollY;
        mChildrenHeights = ss.childrenHeights;
        super.onRestoreInstanceState(ss.getSuperState());
    }

    @Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        SavedStateScrolling ss = new SavedStateScrolling(superState);
        ss.prevFirstVisiblePosition = mPrevFirstVisiblePosition;
        ss.prevFirstVisibleChildHeight = mPrevFirstVisibleChildHeight;
        ss.prevScrolledChildrenHeight = mPrevScrolledChildrenHeight;
        ss.prevScrollY = mPrevScrollY;
        ss.scrollY = mScrollY;
        ss.childrenHeights = mChildrenHeights;
        return ss;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        if (mCallbacks != null) {
            switch (ev.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    mFirstScroll = mDragging = true;
                    mCallbacks.onDownMotionEvent();
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    mIntercepted = false;
                    mDragging = false;
                    mCallbacks.onUpOrCancelMotionEvent(mObservableScrollState);
                    break;
            }
        }
        return super.onInterceptTouchEvent(ev);

//        if (mCallbacks != null) {
//            URLogs.d("ev---"+ev.getActionMasked());
//            switch (ev.getActionMasked()) {
//                case MotionEvent.ACTION_DOWN:
//                    // Whether or not motion events are consumed by children,
//                    // flag initializations which are related to ACTION_DOWN events should be executed.
//                    // Because if the ACTION_DOWN is consumed by children and only ACTION_MOVEs are
//                    // passed to parent (this view), the flags will be invalid.
//                    // Also, applications might implement initialization codes to onDownMotionEvent,
//                    // so call it here.
//                    mFirstScroll = mDragging = true;
//                    mCallbacks.onDownMotionEvent();
//                    break;
//            }
//        }
//        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public void setTouchInterceptionViewGroup(ViewGroup viewGroup) {
        mTouchInterceptionViewGroup = viewGroup;
        setObserableScrollListener();
    }

    @Override
    public void scrollVerticallyTo(int y) {
        URLogs.d("vertically");
        View firstVisibleChild = getChildAt(0);
        if (firstVisibleChild != null) {
            int baseHeight = firstVisibleChild.getHeight();
            int position = y / baseHeight;
            scrollVerticallyToPosition(position);
        }
    }

    public void scrollVerticallyToPosition(int position) {
        RecyclerView.LayoutManager lm = getLayoutManager();

        if (lm != null && lm instanceof LinearLayoutManager) {
            ((LinearLayoutManager) lm).scrollToPositionWithOffset(position, 0);
        } else {
            lm.scrollToPosition(position);
        }
    }

    @Override
    public int getCurrentScrollY() {
        return mScrollY;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        URLogs.d("ev---" + ev);
        if (mCallbacks != null) {

            switch (ev.getActionMasked()) {
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    mIntercepted = false;
                    mDragging = false;
                    mCallbacks.onUpOrCancelMotionEvent(mObservableScrollState);
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mPrevMoveEvent == null) {
                        mPrevMoveEvent = ev;
                    }
                    float diffY = ev.getY() - mPrevMoveEvent.getY();
                    mPrevMoveEvent = MotionEvent.obtainNoHistory(ev);
                    if (getCurrentScrollY() - diffY <= 0) {
                        // Can't scroll anymore.

                        if (mIntercepted) {
                            // Already dispatched ACTION_DOWN event to parents, so stop here.
                            return false;
                        }

                        // Apps can set the interception target other than the direct parent.
                        final ViewGroup parent;
                        if (mTouchInterceptionViewGroup == null) {
                            parent = (ViewGroup) getParent();
                        } else {
                            parent = mTouchInterceptionViewGroup;
                        }

                        // Get offset to parents. If the parent is not the direct parent,
                        // we should aggregate offsets from all of the parents.
                        float offsetX = 0;
                        float offsetY = 0;
                        for (View v = this; v != null && v != parent; v = (View) v.getParent()) {
                            offsetX += v.getLeft() - v.getScrollX();
                            offsetY += v.getTop() - v.getScrollY();
                        }
                        final MotionEvent event = MotionEvent.obtainNoHistory(ev);
                        event.offsetLocation(offsetX, offsetY);

                        if (parent.onInterceptTouchEvent(event)) {
                            mIntercepted = true;

                            // If the parent wants to intercept ACTION_MOVE events,
                            // we pass ACTION_DOWN event to the parent
                            // as if these touch events just have began now.
                            event.setAction(MotionEvent.ACTION_DOWN);

                            // Return this onTouchEvent() first and set ACTION_DOWN event for parent
                            // to the queue, to keep events sequence.
                            post(new Runnable() {
                                @Override
                                public void run() {
                                    parent.dispatchTouchEvent(event);
                                }
                            });
                            return false;
                        }
                        // Even when this can't be scrolled anymore,
                        // simply returning false here may cause subView's click,
                        // so delegate it to super.
                        return super.onTouchEvent(ev);
                    }
                    break;
            }
        }
        return super.onTouchEvent(ev);
    }

    public boolean toolbarIsShown(Toolbar mToolbar) {
        return ViewHelper.getTranslationY(mToolbar) == 0;
    }

    public boolean toolbarIsHidden(Toolbar mToolbar) {
        return ViewHelper.getTranslationY(mToolbar) == -mToolbar.getHeight();
    }

    @Deprecated
    public void showToolbarAndFAB(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {
        showToolbar(mToolbar, ultimateRecyclerView, screenHeight);
        showDefaultFloatingActionButton();
    }

    @Deprecated
    public void hideToolbarAndFAB(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {
        hideToolbar(mToolbar, ultimateRecyclerView, screenHeight);
        hideDefaultFloatingActionButton();
    }

    public void showToolbar(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {
        moveToolbar(mToolbar, ultimateRecyclerView, screenHeight, 0);
    }

    public void hideToolbar(Toolbar mToolbar, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {
        moveToolbar(mToolbar, ultimateRecyclerView, screenHeight, -mToolbar.getHeight());
    }

    public void showView(View mView, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {
        moveView(mView, ultimateRecyclerView, screenHeight, 0);
    }

    public void hideView(View mView, UltimateRecyclerView ultimateRecyclerView, int screenHeight) {
        moveView(mView, ultimateRecyclerView, screenHeight, -mView.getHeight());
    }

    protected void moveToolbar(final Toolbar mToolbar, final UltimateRecyclerView ultimateRecyclerView, final int screenheight, float toTranslationY) {
        if (ViewHelper.getTranslationY(mToolbar) == toTranslationY) {
            return;
        }
        ValueAnimator animator = ValueAnimator.ofFloat(ViewHelper.getTranslationY(mToolbar), toTranslationY).setDuration(200);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float translationY = (float) animation.getAnimatedValue();
                ViewHelper.setTranslationY(mToolbar, translationY);
                ViewHelper.setTranslationY((View) ultimateRecyclerView, translationY);
                // FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) ((View) ultimateRecyclerView).getLayoutParams();
                MarginLayoutParams layoutParams = (MarginLayoutParams) ((View) ultimateRecyclerView).getLayoutParams();
                layoutParams.height = (int) -translationY + screenheight - layoutParams.topMargin;
                ((View) ultimateRecyclerView).requestLayout();
            }
        });
        animator.start();
    }

    protected void moveView(final View mView, final UltimateRecyclerView ultimateRecyclerView, final int screenheight, float toTranslationY) {
        if (ViewHelper.getTranslationY(mView) == toTranslationY) {
            return;
        }
        ValueAnimator animator = ValueAnimator.ofFloat(ViewHelper.getTranslationY(mView), toTranslationY).setDuration(200);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float translationY = (float) animation.getAnimatedValue();
                ViewHelper.setTranslationY(mView, translationY);
                ViewHelper.setTranslationY((View) ultimateRecyclerView, translationY);
                // FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) ((View) ultimateRecyclerView).getLayoutParams();
                MarginLayoutParams layoutParams = (MarginLayoutParams) ((View) ultimateRecyclerView).getLayoutParams();
                layoutParams.height = (int) -translationY + screenheight - layoutParams.topMargin;
                ((View) ultimateRecyclerView).requestLayout();
            }
        });
        animator.start();
    }

    public FloatingActionButton getDefaultFloatingActionButton() {
        return defaultFloatingActionButton;
    }

    public void setDefaultFloatingActionButton(FloatingActionButton defaultFloatingActionButton) {
        this.defaultFloatingActionButton = defaultFloatingActionButton;
    }

    public View getCustomFloatingActionView() {
        return mFloatingButtonView;
    }

//    public void setCustomFloatingActionView(View customFloatingActionView) {
//        this.floatingActionMenu = floatingActionMenu;
//    }

    public void showFloatingActionMenu() {
        if (mFloatingButtonView != null)
            ((FloatingActionsMenu) mFloatingButtonView).hide(false);
    }

    public void hideFloatingActionMenu() {
        if (mFloatingButtonView != null) ((FloatingActionsMenu) mFloatingButtonView).hide(true);
    }

    public void showFloatingActionButton() {
        if (mFloatingButtonView != null)
            ((FloatingActionButton) mFloatingButtonView).hide(false);
    }

    public void hideFloatingActionButton() {
        if (mFloatingButtonView != null) ((FloatingActionButton) mFloatingButtonView).hide(true);
    }

    public void showDefaultFloatingActionButton() {
        defaultFloatingActionButton.hide(false);
    }

    public void hideDefaultFloatingActionButton() {
        defaultFloatingActionButton.hide(true);
    }

    public void displayCustomFloatingActionView(boolean b) {
        if (mFloatingButtonView != null)
            mFloatingButtonView.setVisibility(b ? VISIBLE : INVISIBLE);
    }

    public void displayDefaultFloatingActionButton(boolean b) {
        defaultFloatingActionButton.setVisibility(b ? VISIBLE : INVISIBLE);
    }

    public void removeItemDecoration(RecyclerView.ItemDecoration decoration) {
        mRecyclerView.removeItemDecoration(decoration);
    }

    public void addOnItemTouchListener(RecyclerView.OnItemTouchListener listener) {
        mRecyclerView.addOnItemTouchListener(listener);
    }

    public void removeOnItemTouchListener(RecyclerView.OnItemTouchListener listener) {
        mRecyclerView.removeOnItemTouchListener(listener);
    }

    public RecyclerView.LayoutManager getLayoutManager() {
        return mRecyclerView.getLayoutManager();
    }
}

redpajama_set_name: RedPajamaGithub


text:
Novato man killed by pipe at Petaluma construction site
RANDI ROSSMANN AND ELOÍSA RUANO GONZÁLEZ
Jared Overfield knew it was a risky job, but he was drawn to construction because of the camaraderie found at the work sites, his stepfather Daniel Zamberlin said.
He said his 28-year-old stepson cared about the people he worked with and recently had been promoted to foreman. Overfield was killed Wednesday morning in a construction site accident in southern Petaluma.
"He loved construction people," Zamberlin said. "He knew how dangerous construction was. Big equipment is dangerous … And it happens so freakin' quick."
"It's just not fair," he said.
Overfield and co-workers had been working on a Highway 101 project that involves improving the frontage road where Petaluma Boulevard South connects with Kastania Road. He was helping to guide the movement of a 40-foot, 8,000-pound pipe, standing by as a forklift operator began to set it down onto the ground on a hillside just west of Highway 101, near the new Petaluma Boulevard South overpass. But the massive metal pipe encased in concrete began to roll and ended up crushing him, the Sonoma County Sheriff's Office said.
Overfield was standing in front of the forklift when the pipe began to roll, sheriff's Sgt. Cecile Focha said. Calls for help to the site came at about 7:15 a.m., with initial reports of a worker trapped underneath a pipe. About 10 minutes later, reports indicated the worker had died.
The incident unfolded within view, just uphill, of passing motorists.
Cal Fire, Petaluma and San Antonio firefighters, an ambulance and a medical helicopter were sent to the scene. A Novato fire battalion chief, CHP officers and the Sonoma County Sheriff's Office also responded.
The pipe that hit Overfield was the first of five to be unloaded from a flatbed truck. The remaining four pipes were later unloaded without incident.
"He was a sharp kid," Zamberlin said about Overfield, a Novato native who had played varsity soccer while at San Marin High School. "He could have done anything."
Overfield had studied photography at the Brooks Institute in Santa Barbara before coming to the North Bay to work in construction, Zamberlin said.
"He was doing what he wanted to do," he said. "Of course, his mother always worried."
Zamberlin, a general contractor, said Overfield used to help him out. Overfield also helped his father, Peter Overfield, with his carpet-cleaning business. "He worked hard," Zamberlin said.
The Sheriff's Office is investigating his death, along with Cal-OSHA, the state agency tasked with investigating workplace accidents.
He was an employee of the San Rafael-based Maggiora & Ghilotti engineering contractors, Focha said.
The company issued a short statement later that day.
"Our utmost concern and priority at this time is to the family for their sudden loss and ask that your thoughts and prayers go out to them during this difficult time," the statement read.
It also mentioned that the company is "working closely" with the Sheriff's Office and Cal-OSHA in their investigations.
Company officials declined to comment further. However, one employee, who did not want to be identified, said Overfield worked for the company for eight years and was a "well-liked, hardworking part of the company."
Cal-OSHA spokesman Peter Melton said the company was cited a handful of times in the past decade but that they were all minor violations. The most recent one was in 2010, Melton said. The company had failed to hold a mandatory pre-job safety meeting before a job that involved drilling or tunneling.
"This is an investigation that takes time," Melton said, adding they have up to six months to complete their investigation.
OSHA officials, for example, will look into whether the construction company adequately trained employees and had proper safety procedures in place, Melton said.
You can reach Staff Writer Randi Rossmann at 521-5412 or randi.rossmann@pressdemocrat.com or Twitter@rossmannreport. You can reach Staff Writer Eloísa Ruano González at 521-5458 or eloisa.gonzalez@pressdemocrat.com. On Twitter @eloisanews.

redpajama_set_name: RedPajamaCommonCrawl


It is easy to understand why so many students feel overwhelmed when they enter college. Colleges today require not only an application and tuition payments, but also essays on why they should accept a particular student. Students who apply at several colleges naturally have several such essays to write, not to mention the many essays they will be writing in the course of their class work. Who wants to do more writing than they have to?
The answer is, those who desire or are in need of scholarship monies. Many scholarship sources today require essays from the students describing a variety of things, most commonly why the scholarship is needed, why they deserve it and what effect the scholarship will have on their lives and future.
The problem is, many of these scholarships go without being awarded because students do not want to take the time to write another essay. This seems illogical, considering most such scholarships are worth $1,000 to $5,000 for a mere hour or two's work writing a short essay. When viewed on a per hour basis, it seems a profitable way to spend a couple of hours.
However, when one considers the amount of writing each student is already doing, it does start to make a little more sense. Many students worry about spending that hour or two and then not receiving the scholarship because someone else wrote a better essay. Oddly enough, this scenario stalks professional writers as well. Many times writers will spend not only an hour or two, but also days, weeks or even months preparing a manuscript or article, only to have it turned down.
The reason they continue to do it, and why you as a student should as well, is the payoff if the essay, article or book is accepted. Receiving even one thousand-dollar award, would be the equivalent of working 100 hours (two and half weeks full time employment) at $10 per hour. Even if you had to spend 40 hours putting out twenty essays to receive just one of these awards, you would be receiving compensation far above minimum wage.
This, and the esteem of having their work published for all to see, is why professional writers do what they do. I hope that you can find some inspiration in their dedicated spirit.
Even if you cannot find enough inspiration in what I said above to encourage your efforts, there is still hope. Our company specializes in researching, documenting and writing academic and professional works of every conceivable type, including scholarship essays. Our writers have had years of experience in research and writing and are ready to put their vast knowledge at your disposal.
To take advantage of this, all you have to do is let us know by placing an order. Tell us what your topic is, any details you feel are necessary, and whom your target audience is, then give us time to complete your assignment. You will not be disappointed.


text:
Home Apple Bloomberg reports Apple is working on a smart display and new Apple...
Bloomberg reports Apple is working on a smart display and new Apple TV
Apple is working on a brand-new slew of smart home devices, at least according to a report by Bloomberg.
In addition to the very similar but Matter-equipped relaunch of the original HomePod, Apple appears to be pushing deeper into the home space with a smaller display akin to a Google Nest Hub or Amazon's Echo Show. According to sources close to the discussions, the device would be similar to an iPad but less expensive, oriented toward home use, and would include a magnet for mounting. The device would appear to be more limited in scope than an iPad and would mainly be used for FaceTime chats, as well as controlling other smart home devices. Here's hoping it can solve the multi-user problem that makes current iPads unpleasant for home control use. There have also been talks about larger smart home displays down the line.
Apple's new display seems to be aimed squarely at offerings by Google and Amazon
Photo by Dan Seifert / The Verge
In addition, Apple appears to be exploring a refresh of the Apple TV with a faster processor for the first half of 2024, but the device will not support 8k. The combination HomePod / Apple TV project also appears to have suffered setbacks but is still in the works, according to the source. The smart displays are still a long way away and will not launch until early next year or possibly later.
Hey, maybe with those magnets in the back, I could snap it to the fridge and make it a smart fridge.
Previous articleFirst Asteroid to Buzz Earth in 2023 Came Closer Than Many Satellites
Next articleThreat Attackers Can Own Your Data in Just Two Days


Virginia's Region 2000 comprises 2000 square miles that surrounds Lynchburg, Virginia. Through a unique partnership of six distinct organizations, Virginia's Region 2000 Partnership provides a centralized vision to provide leadership for regional development. A proud member of this partnership, the Region 2000 Technology Council's mission is to foster an environment that stimulates innovation and growth of technology-focused organizations in our community.
Our vision is that Virginia's Region 2000 will be recognized as a place where technology-focused organizations thrive, STEM educational programs flourish, and where innovation and technology-based entrepreneurship are championed.
Our region has a diverse mix of technology companies with very strong forecasts for growth. Our six primary technology sectors are Energy, Engineering, Information Technology, Manufacturing, Pharmaceutical, and Wireless Technologies.


text:
'Wow' »
Sometimes It's Not So Easy
On occasion, my fascination with easy listening music jumps out of the speakers and bites my ears.
I was puttering at the computer yesterday, posting a note or two on Facebook, checking email, keeping an eye on the news from Ukraine and scoping out the latest rumors about the Minnesota Vikings and the upcoming NFL draft. Keeping me company was the RealPlayer, chugging along on random and offering me some current Americana, some 1960s and 1970s pop, some 1950s R&B and the occasional bit of a film soundtrack.
And then came this:
I winced and then laughed at Ray Conniff's pretty much clueless take on "Happy Days" (found on the 1976 album TV Themes), and then I took a look to see exactly how much music I have by Ray Conniff in the files. It turns out to be 227 mp3s. That means that Conniff should have been listed in the Top 20 artists I posted a few weeks ago, coming in at No. 15, just ahead of Richie Havens. Why wasn't he? Because some of his albums were credited to just Ray Conniff, others to Ray Conniff & The Singers, others yet to Ray Conniff & His Orchestra and so on, and that inconsistency, along with my inattention to detail that day, kept Conniff off my chart.
Why so much Conniff? Because I do love – generally – easy listening music from the 1950s through the 1970s, probably in large part because the work of Conniff and his easy listening brethren reminds me of the years of Hula Hoops and Erector sets on through the years of madras shirts and eventually mood rings. So my love for the music is mostly nostalgia, but that's a potent enough force as it is.
And then there's the fact that some of the easy listening tunes in the stacks are pretty good music. In terms of execution, nostalgic weight and chart performance, it's hard to beat "Theme from 'A Summer Place'" by Percy Faith, which was No. 1 for nine weeks in 1960. There were many other decent easy listening pieces during the years of my youth; many of those are in my files; some, I have to assume, are not.
But it's not at all difficult to find easy listening missteps like Conniff's "Happy Days," especially when the easy listening folks tried to translate pop-rock hits into instrumentals palatable for their audience (generally older folks, of course, as well as the unhip kids like me). And since pratfalls are often more fun than graceful success, I thought I'd wander through the collection and find some easy listening efforts that are not at all easy to listen to.
So here are a couple from 1969: A clueless take on Neil Diamond's "Cracklin' Rosie" from Billy Vaughn's Theme From Love Story and a flighty version of the Doors' "Touch Me" from Enoch Light & The Brass Menagerie, Vol. 1.*
I could dig further for hard listening, but I won't. Instead I'll close with a couple of covers that are interesting takes on popular songs. On his 1970 album Doc Severinsen's Closet, the Tonight Show band leader of the time took some chances by covering a number of intriguing titles (including a cover I once shared here of "Court of the Crimson King"). The one that caught my ear this morning was his cover of the Chairmen of the Board's "Give Me Just A Little More Time" (into which Severinsen incorporated a quote from "Does Anybody Really Know What Time It Is?" from the group then called Chicago Transit Authority).
And as I dug around in the 121 tracks I have from dual pianists Ferrante & Teicher, I came across their cover of Paul Simon's "The Sound of Silence." Ferrante & Teicher occasionally missed the sense of a song; there are some missteps in their work. But far more often than not, at least to the ears of this easy listening fan, they succeeded in translating pop songs into their own idiom. I think they did so with "The Sound of Silence," which was on their 1969 album Midnight Cowboy.
*I was going to make it a trio of missteps from 1969 by including Franck Pourcel's version of Zager & Evans' "In The Year 2525", which seems to have first been issued on the Bolivian release En El Anno 2525, but after a couple of listens, I'm liking it.
Tags: Billy Vaughn, Doc Severinsen, Enoch Light, Ferrante & Teicher, Franck Pourcel, Percy Faith, Ray Conniff
This entry was posted on Tuesday, March 4th, 2014 at 10:55 am	and is filed under 1960, 1969, 1970, 1976, Cheese, Covers, Video. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
2 Responses to "Sometimes It's Not So Easy"
Whiteray does it again! I have always been an easy listening fan, and it is actually a surprise to see another self admitted fan. You are indeed correct that on occasion Ray would try his baton on something he shouldn't have ( this being an example) https://www.youtube.com/watch?v=_hVZULkF_Jk
For the most part though, he and a lot of the others you mentioned did a pretty decent job.
porky says:
love ez listening stuff. I have a Ray Conniff album with versions of "Angie Baby" and "Sundown" that are hilarious.
They damn near turn "Angie Baby" into reggae:
http://www.youtube.com/watch?v=IPMUlwZz1wk
(looks like this entire LP is on youtube).


text:
You are here: Home / Arts News and Events / Sarasota - Bradenton / Contemporary Painting Exhibition at The Ringling To Feature Works From Florida State Faculty; "Back and Forth: Thinking in Paint" features painting inspired by The Ringling's Historic Collection
Contemporary Painting Exhibition at The Ringling To Feature Works From Florida State Faculty; "Back and Forth: Thinking in Paint" features painting inspired by The Ringling's Historic Collection
August 5, 2015 Comment Off 23 Views
Contemporary Painting Exhibition at The Ringling To Feature Works From Florida State Faculty
"Back and Forth: Thinking in Paint" features painting inspired by The Ringling's Historic Collection
Sarasota, Aug. 5, 2015– Beginning this month, The John and Mable Ringling Museum of Art will present an exhibition that showcases paintings created by faculty members of the College of Fine Arts at Florida State University.
"Back and Forth: Thinking in Paint" will be on display at The Ringling Aug. 14-Oct. 25. The exhibition features contemporary paintings from five artists who are creating a visual dialogue with The Ringling's permanent collection through their works. Each of the paintings in the exhibition was inspired in part by a work at The Ringling. The exhibition will explore contemporary art's influence in the context of the historical works from The Ringling's collection.
"This exhibition is a first for The Ringling, and it highlights the incredible possibilities that exist with our partnership with FSU," Steven High, executive director, The Ringling said. "We are proud of our collection at The Ringling, and it is wonderful to see the contemporary art that it continues to inspire."
"Back and Forth: Thinking in Paint" will include 22 total works from five artists. Each artist will have two to five paintings featured.
The featured artists are:
Carrie Ann Baade
Ray Burggraf
Lilian Garcia-Roig
Mark Messersmith
Judy Rushin
The Ringling will host the following events in connection with the exhibition:
August 13: The Member's Preview will be from 5-7 p.m. during Art After 5. This event is exclusively for Museum Members.
September 24: Artists Mark Messersmith, Lilian Garcia-Roig, Ray Burggraf, Judy Rushin and Carrie Ann Baade will be in the galleries for informal discussion beginning at 5 p.m. during Art After 5.
There will be a 64-page catalogue for the exhibition published by the Museum of Fine Arts Press.
Information about the artists:
Born in Louisiana, Carrie Ann Baade has southern roots, but she has studied art all over the world. Her work is known for its rich allegorical meta-narrative oil paintings, and it has been displayed across the United States as well as in a solo exhibition in China. She is the associate professor of painting and drawing at Florida State University.
Ray Burggraf's work has been influenced by the German Bauhaus movement of the 1930s, the Op Art of the 1960s and it also reflects affinity for the land that he learned while growing up on a farm. Burggraf taught painting and color theory at Florida State University for 37 years. He is now a professor emeritus.
Lilian Garcia-Roig was born in Havana, Cuba, but she grew-up in Texas. Her work has been shown across the U.S. and Mexico. Garcia-Roig is the head professor of painting and drawing at Florida State University.
Inspired by the state's natural beauty, Mark Messersmith moved to Florida 30 years ago. He has explored Florida's exotic landscape through his art ever since. His work has been shown extensively in the southeast U.S. and in shows in Canada, Italy and France. Messersmith is a professor of painting and drawing at Florida State University.
Judy Rushin's paintings and installations have been seen by thousands of people in museums across the U.S. She is an associate professor of art and director of the Graduate Program at Florida State University.
In : Arts News and Events, Sarasota - Bradenton
Previous article Award-Winning Documentary, 'How to Change the World,' Comes to Select U.S. Cinemas with Live Q&A from London Premiere; Fathom Events and Picturehouse Entertainment Present the Inspiring Story About the Birth of the Modern Environmental Movement and Greenpeace Activist Robert Hunter on September 9 Only
Next article Starlite Players adds Sunday matinee to "This Isn't What I Expected," a collection of four short comedies; Shows run Thursday-Saturday, August 13-15 at 7:30 p.m.; Sunday, August 16, at 2 p.m. and 6:30 p.m.
UPCOMING EVENTS AT THE AUDITORIUM THEATRE Show Listings and Information Through May 5, 2019
Westcoast Black Theatre Troupe presents tribute to Marvin Gaye
NEW ALBUM LOVERS ROCK OUT NOW
The US premiere of the new production of American composer Raphael Mostel's "Travels of Babar," a multi-media composition based on Jean de Brunhoff's famous picture book of the same name "Le Voyage de Babar," will be presented at Florence Gould Hall in New York City on November 2 (in French) and 3 (in English), 2018
Composer Sid Richardson wins the 2018 Hermitage Prize; Richardson, a composition student at The Aspen Music Festival and School, receives a six-week residency at the Hermitage Artist Retreat in Englewood
Science Tips: Three Updates from the Weizmann Institute of Science; DISRUPTED NITROGEN METABOLISM MIGHT SPELL CANCER; AN ALGORITHM THAT RIVALS EXPERTS' ULTRASOUND SKILLS COULD SAVE LIVES; FREEZING FLY EGGS FOR THE FUTURE
Corey Loveless Releases New Single "Different"
BE FASHION-FORWARD WITH A .FASHION DOMAIN NAME
The New Tarot share debut LP exclusively on Billboard | 'Book of Promises' out 10/26
MF Press Global excels at developing celebrities' careers


This article is very scary– it describes Mat Honen's incredibly nasty experience of being hacked, and the process the attackers went through to destroy his digital life. Some positive developments since this story was published: it is very likely he will be able to recover the data on the laptop, including the photos. He was smart enough to remove power from the machine before the erasure was complete, so overwrite never took place, and Apple is cooperating with a data recovery service to get the data back. Also, both Amazon and Apple have changed their policies in response to this story.
The really scary thing: the reason the hacker cited for going after this guy was that he had a three-character twitter handle. You know, like @jrj.
My wife asked me today if we were safe from this kind of attack. Unfortunately, there's no way to protect yourself from poor policies on the part of vendors, which was the vulnerability exploited in this instance. Now granted, in my case we would not lose any data– everything is [backed up in multiple places and formats], and none of our personal computers are configured to enable remote erasure anyway… but if someone really wanted to take over our accounts bad enough they would likely be successful.
While none of our personal laptops or desktop machines are configured for remote deletions, all of our phones and tablets are, and I recommend others do the same– they aren't storing any data that isn't elsewhere, and they are easy to lose/steal. Accidental erasure of a phone or tablet is a mild inconvenience. I would never recommend a computer be set up this way except in very special circumstances. (Interestingly, my work laptop is one of these special circumstances.) It's an interesting trade-off that protecting data against disclosure attacks makes it more vulnerable to denial-of-service (in this case deletion) attacks.
Use a password manager– I have reviewed LastPass and 1Password, and consider both trustworthy because the data is encrypted on the client side, so these companies don't even have your information if configured properly.
Use a different strong password for every site, and change them every 3-6 months depending on sensitivity. (A password manager is the only way to make this practical, which is why I recommend it.) If you password is more human readable or memorable than K83k$gPhw#k3j*02 then you're doing it wrong. Don't use a word with a few substituted characters like $erindip1ty. That can be brute forced in about 12 minutes. LastPass and 1Password both have great password generation features– use them.
From now on when asked for "security questions" enter a long string of random data. For example, my mother's maiden name is often something like "8kj38d*i#l10kQo)ty" or similar. All real answers to security questions can be trivially researched, and since you have effective means of tracking passwords you'll never need to recover your account anyway.
Don't daisy-chain your critical accounts. In other words, don't have iCloud email password recovery emails to your main gmail account and vice versa. Have accounts just for this purpose (hushmail is great) or intentionally use accounts that don't exist.
If your email service has a two-factor authentication option, make use of it. It's unfortunate that email is the lynchpin of every other account, but that's how everything works today. Protect your email account above all else.
Lay low. Keep a low profile. Don't taunt hackers. Don't draw a giant target on yourself or in any way make yourself a juicy target.
All this will help make it more difficult, but not impossible, for someone to similarly "p0wn" your accounts and your data. There's no silver bullet.


text:
balls out gary the tennis coach vodlocker
Minus the bear b sides music
Pb_user_/ October 2, 2020/ DEFAULT/ 3 comments
Review Summary: Minus the B-Sides As fans of music typically know, the prospect of b-sides and other unreleased material from bands is a tricky proposition: on the one hand, it's exciting to enjoy new material that didn't make a band's official release, but on the other hand, it's . The Seattle-based indie rockers' sixth full-length, and their first outing since the departure of longtime kit man Erin Tate, Voids arrives three years after Minus the Bear's B-sides and rarities collection, Lost Loves, and five years after their last proper studio LP, Infinity UpsidedownSchoolroom.com drummer Kiefer Matthias is more than up to the task. The band's penchant for pairing tight, loopy beats 7/ It's been five years since Minus The Bear released their last full-length, 's Infinity Overhead. Since then, the band has seemingly been at a loss at how to artistically move forward.
Over the years, Minus the Bear has won over legions of fans and critics with an exhilarating live show and a sound uniquely their own. With a devoted fan base, Minus the Bear sell out capacity venues nationwide, have generated more than 13 million plays on MySpace, and continuously release new material to fan and critical acclaim/5(40). The name "Minus the Bear" comes from an in-joke among the band members, referring to the s television series B. J. and the Bear. "A friend of the band had gone on a date," explained singer-guitarist Jake Snider, "and one of us asked him afterwards how the date UpsidedownSchoolroom.com: Indie rock, math rock, alternative rock, experimental rock, progressive rock. Artist Biography by Laurel Greenidge. Featuring members of Botch, Kill Sadie, and Sharks Keep Moving, Minus the Bear emerged on Seattle's music scene in with the release of their six-song EP This Is What I Know About Being Gigantic. The band comprised guitarist Dave Knudson, vocalist/guitarist Jake Snider, drummer Erin Tate. Minus the Bear. Minus the Bear has released six albums and four EPs. The band consists of Jake Snider (vocals, guitar), Dave Knudson (guitar), Cory Murchy (bass guitar), and Alex Rose (synthesizers, vocals). On July 17, , the band announced their retirement and accompanying farewell UpsidedownSchoolroom.com: Indie rock, math rock, alternative rock, experimental rock, progressive rock. It's been five years since Minus The Bear released their last full-length, 's Infinity Overhead. Since then, the band has seemingly been at a loss at how to artistically move forward.Seattle's Minus the Bear is a band that has made a name for itself creating ground in the category of indie-dance music they had previously trafficked. the Daft Punk-esque guitar (or synth?) tweaking on B-side highlight. Minus the Bear's Jake Snider Ranks the Band's Six Albums six albums, a handful of EPs, and a B-sides release, Seattle prog/math/indie rock band Minus the Bear . So you picked the name before you wrote the music?. The tour hit philadelphia on october 27th at the franklin music hall, formerly known as the electric Discography minus the bear minus the bear. Listen to Minus the Bear | SoundCloud is an audio platform that lets you listen to what you love and share the sounds you create.. Seattle. Tracks. Minus the Bear Gather Up Rarities for 'Lost Loves' Minus the Bear have amassed a number of one-offs, B-sides and various rarities over the.
Minus The Bear - South Side Life, time: 4:19
Tags:Hyperterminal private edition 6.3 ware s,Dc talk socially acceptable /upload,Latest version of directx 11 for xp,Office web apps sharepoint 2016
Gogor 12.03.2010 at 04:35
It is a pity, that now I can not express - there is no free time. I will be released - I will necessarily express the opinion on this question.
Shashicage 13.03.2010 at 14:31
Infinitely to discuss it is impossible
Domuro 09.03.2010 at 22:49
Many thanks for the help in this question. I did not know it.
Of flowing water crossword
Lagu punk rock selinting ganja di tangan
If i love myself
Acchi kocchi anime mp4
Lamica delle 5 e mezza adobe
Yokinos on Minus the bear b sides music


CEDAR RAPIDS — The Jefferson J-Hawks are tenacious and skilled. But they aren't big.
Ankeny Centennial is, along with all those other qualities. Put size along with skill, and that's a different level in the stratosphere of Iowa high school volleyball.
Class 5A second-ranked Centennial swept through the day, completing it with a 25-16, 25-19 conquest of the No. 4 J-Hawks in the championship match of the Westside Invitational tournament Saturday at Jefferson High School.
Centennial (35-2) vanquished the J-Hawks (29-5) for the second time this season. Four of Jefferson's losses have come against the upper crust of 5A — Cedar Falls, Centennial and West Des Moines Valley.
If all goes as planned, the J-Hawks will have another shot at an elite opponent — Cedar Falls — next week at the Mississippi Valley Conference tournament.
Jefferson breezed through pool play, then won a pair of two-setters (against West Delaware and Linn-Mar) in the first two rounds of bracket action. But Centennial was too big, and too good.
The J-Hawks forged a 17-17 tie in the second set, but a kill and a block by Sauer triggered a three-point run. Then, at 21-19, the Jaguars scored the final four points.
"Sometimes one player kind of carries us, but today was a team win," Sauer said.
Jefferson played its three bracket matches in succession, without a break.
In the semifinal win over Linn-Mar, Brokovich provided cushion in the first set with back-to-back kills to push the lead to 23-20. In the second set, Jefferson led 13-11 before breaking it open with seven straight points.
Linn-Mar (25-8) suffered an unexpected loss to Dubuque Hempstead in its second pool match, but rebounded with a clutch win over Dike-New Hartford to win its pool, then knocked off 2A No. 1 Grundy Center in the quarterfinals.
Teams — 1. Ankeny Centennial 3-0, 2. West Delaware 2-1, 3. West Liberty 1-2, C.R. Washington 0-3.
Teams — 1. C.R. Jefferson 3-0, 2. Mount Vernon 2-1, 3. Marion 1-2, 4. Tripoli 0-3.
Teams — 1. Linn-Mar 2-1, 2. Dike-New Hartford 2-1, 3. Dubuque Hempstead 2-1, 4. Des Moines Roosevelt 0-3.
Teams — 1. West Des Moines Dowling 3-0, 2. Grundy Center 2-1, 3. C.R. Kennedy 1-2, 4. Iowa City West 0-3.


text:
Author`s name Dmitry Sudakov
Putin Refuses to Enjoy Life Outside Politics
Russia » News from the Kremlin
Vladimir Putin interacted with the Russian population in a 4-hour marathon TV show on December 4. It has become a tradition for Putin to hold annual live question-and-answer performances on Russia's major TV and radio channels. The recent program became his eighth. As usual, people asked a great deal of questions – about 1.5 million. The questions were mostly about the social sphere, although the Russians showed great interest in their nation's economy too.
A question about terrorism was one of the first, which the prime minister answered (in light of the recent train crash in Russia).
"We have done a lot to break the spine of terrorism, but the threat has not been removed yet," Putin said.
The prime minister stressed out that the society would have to realize the threat of terrorism to be able to conduct successful struggle against it.
Putin said that it was possible, albeit very hard to prevent terrorist acts, especially on the objects of infrastructure.
Speaking about the Nevsky Express train crash, Putin said that the tragedy indicated more effort must be taken in the field of anti-terrorist activities.
People also asked Putin about Russia's law-enforcement agencies. The prime minister stressed out that he would not paint all police officers black. He said that there were over one million people employed at the Internal Affairs Ministry, which is more than the number of personnel of the Russian Armed Forces.
"People execute an important function and sometimes risk their lives not only in hotspots, but in every-day life situations. Unfortunately, there are people there too who violate the law and cause irreparable damage to life and health of our people. This is inadmissible, of course. The society and the internal affairs ministry must struggle against such demonstrations of violence. If people in uniforms break the law, they must be punished strictly for it," Putin said.
Putin did not support the appeals to recreate the police or dissolve the State Traffic Safety Inspectorate.
"Our friends in Ukraine have had this experience. They dissolved the agency, which we refer to as Traffic Police. Nothing good came out of it: bribes became higher, there is no order on the roads there after the functions were delegated to other agencies that were not prepared for that work," Putin said.
A resident of the city of Krasnodar asked Putin if he would like to leave politics and enjoy life.
"Don't hold your breath," Putin said.
Putin also had to express his thoughts about the future presidential election in Russia in 2012. The PM said that he would think about it since there is a lot of time before the date.
"Each and everyone of us must fulfill their duties and work effectively. The decisions about the 2012 pre-election campaign will be made depending on the development of the state of economic and social affairs in the country, but today it's only 2009," Putin said.
People also asked Putin about the relations between the prime minister and the president.
"We've known each other for many years and we worked together a lot. We graduated from the same university . The principles, which our professors gave us allow us to work effectively today," Putin said.
Oleg Artyukov
Read the original in Russian


Last Friday was make or break time in the Galway City 'A' League final between St. James' and Claregalway. This game was played at St. Michaels G.A.A. grounds in Westside. The City side opened the game on top and added some great scores which helped them lead at half time with a score line 2-1, 0-6. Scores came from Jack Folan, Jamie Hayes and Tommy Hayes. The second half seen Claregalway fight back and put James under pressure. Within 15 minutes Claregalway took the lead and added a tally of scores to push them into the lead by 5 points. The Jimmies never gave up and dug deep to rally a final comeback. Darragh Neary, Robert McSweeney, Jack Folan and Keane Griffin Curren inspired their team mates to battle till the end and try and persevere a win. Unfortunately James' ran out of time and missed out by a single point to win the game. There were many key players for James and Claregalway on the evening and all the players are a credit to the game, their families and clubs. St James would like to thank all that went to Westside on Friday for their support and also would like to congratulate both teams and management staff. This St. James' team are a super group of Gaelic footballers and the club are very proud of what they have achieved in such a short space of time. Many thanks are extended to the management team which consists of Keith Murphy, Ronan Collins, Declan Folan and Benny Fahy.


text:
Dozens evacuate after 2 fires in 6 hours at apartment complex on city's northwest side
Fire officials said approximately 70 people were displaced after two fires within six hours of each other at the Highland Pointe Apartments.
Published: 6:33 AM EST November 26, 2020
INDIANAPOLIS — Indianapolis firefighters responded to two fires on the city's northwest side at the same apartment complex within six hours of each other.
The first fire at Highland Pointe Apartments at the 5400 block of Michigan Road, near Kessler Boulevard, was reported just before 9 p.m. Wednesday. Firefighters were able to get the fire under control in an hour. An IFD spokesperson said there were no injuries, but approximately 45 people were displaced and 44 units were affected.
For the 2nd time in 6 hours, occupants of the Highland Pointe Apartments on N Michigan Rd were forced to evacuate after fire broke out in 2 separate buildings. No injuries & all occupants evacuated OK. Approximately 56 total units were affected with 70 occupants displaced. pic.twitter.com/FUSXWIsvdm
— Indianapolis Fire Department 🚒 (@IFD_NEWS) November 26, 2020
The second fire, at the same apartment complex, was reported just before 3 a.m. Thursday. Firefighters were able to get the second fire under control in 30 minutes. An IFD spokesperson said there were no injuries, but 24 people were displaced and 12 units were affected.
Residents spent Thanksgiving morning moving out temporarily because of the smoke damage and loss of power.
"It was little water damage in my apartment but I am cool with that. God is still in control. That's the way I look at it. I am thankful and I am grateful to be alive," said Matilda Presswood.
Presswood said she and her daughter were prepping their Thanksgiving dinner when the first fire started outside their apartment.
"I heard a 'pop-pow' like somebody was shooting in the hallway and the lights started flickering," Presswood said. "I told my daughter lets go."
She said she and her daughter will be spending thanksgiving with other family members.
"God is in control, so on Thanksgiving I am thankful," Presswood said.
Investigators believe electrical issues are to blame for both fires.
IFD is working with with Red Cross Indianapolis and apartment management to find another place for the people to stay.
The Red Cross said it is providing support to more than 30 people and 20 families.
"Our volunteers stand ready to answer the call to assist those in need," said Chad Priest, CEO of the American Red Cross–Indiana Region. "Even on Thanksgiving, volunteers are serving those families who have experienced a devastating event. We are thankful for their commitment to serve during the holiday."
The Red Cross opened a shelter at a nearby hotel. Volunteers will provide feeding and mental and health services to families. All COVID protocols are being followed as part of the Red Cross response.
RELATED: Noblesville house fire claims 3 dogs, 2 cats
RELATED: IFD investigates arson in fire at vacant duplex on city's near west side


text:
[ARCHIVED] Public meeting for updates on the north Sheyenne Street corridor reconstruction on June 23
The City of West Fargo will hold a public update meeting at 5:15 p.m. Wednesday, June 23 in the Commission Chambers of West Fargo City Hall to discuss updates for the north Sheyenne Street urban corridor reconstruction project. During this meeting, City of West Fargo staff will discuss project updates on the completion of phase 1 and impacts to the surrounding areas for work in phase 2.
The project aims to replace aging infrastructure in the area that the Core Area Infrastructure Master Plan (CAIMP) study identified in the fall of 2019. This includes improvements to water mains, sanitary sewer and storm sewer throughout the corridor that either is approaching the end of its service life or is undersized. The utility replacement work was not initially part of this project, but the CAIMP study results made it apparent that these utility replacements were necessary.
Under the original plans for this project, it will also add streetscaping to strengthen the area's destination appeal and improve walkability and safety. This portion, which receives $2.37 million in funds through a grant from the North Dakota Department of Transportation (NDDOT), includes new concrete, curb and gutter, diagonal and parallel parking, curb bulb outs, planters, furniture and focus areas for future amenities like public art.
The current anticipated total project cost is $10.45 million, including construction costs, land acquisitions, utility relocations, engineering, consulting services and administrative fees for legal and financial services. To cover these costs, the City will utilize a funding plan that includes $1,834,000 in capital improvement sales tax, $1,200,000 in economic development sales tax, $2,216,000 in water and sewer utility fee revenues, $2,377,446 in a NDDOT Urban Grant, $1 million in Prairie Dog Funds and $1,822,554 in special assessments.
This meeting is not a public hearing and does not include public comments. The Special Assessment Commission will meet when the project is complete to allocate and levy special assessments for final project costs. Then, the Special Assessment Commission will publish the list of proposed special assessments and advertise an opportunity to object to the proposed special assessments in the legal section of the The Forum. These pending assessments will also be available per property on https://www.westfargond.gov/518/Property-Information.


text:
Home Headlines
PlayStation 5 v Xbox Series X
Sponsored results for PlayStation 5 v Xbox Series X
in Headlines
THERE IS NOTHING quite like a captive audience. When Sony, a Japanese electronics giant, reported its latest set of quarterly results on October 28th, the star performer was the firm's video-gaming division, which makes the PlayStation line of consoles. Had it been a normal year, revenues would probably have been down, because Sony's current model—the PlayStation 4—is coming to the end of its life.
But in a year marked by lockdowns and working from home, gaming revenue instead grew by 11.5% year-on-year (and operating profits by 61%) as housebound consumers reached for their controllers. Sony is not alone. Microsoft, its gaming arch-rival, released its own results the day before. Its Xbox One console is similarly superannuated, yet revenues jumped by 30%. The good times have been repeated across the industry (see chart).
Most forecasters expected covid-19 to boost the video-gaming business. The pandemic has given a filip to other forms of indoor entertainment, from board games to video-streaming to books. But the scale of the surge has caught industry-watchers by surprise. Tom Wijman at Newzoo, a games-industry analytics firm, says that when the pandemic began, his company predicted a boost of around $2bn to industry revenues on top of its existing forecasts. The latest figures, he says, suggest the real figure has been nearer $17bn. Newzoo now reckons industry revenues will reach $175bn this year, a rise of 20%. Even for an industry that had been growing by 9% annually, 2020 has been a barnstorming year.
It is not over yet. Amid a blitz of adverts, trailers and PR, Sony and Microsoft are gearing up to replace their existing consoles with new, more powerful machines. On November 10th Microsoft will release the Xbox Series X. Sony will respond two days later with the PlayStation 5. With a locked-down Christmas looming in many parts of the world, demand for both will be high. If industry rumours about pre-orders are correct, some consumers may have to go without.
At the same time, both firms will be keeping their eyes on several big new competitors. Amazon, Facebook and Google all think the time is right to try their luck in the gaming business. Over the past decade streaming has revolutionised music, television and films. The tech giants think cloud computing, fast broadband and 5G mobile networks mean the time is right to try the same thing with video games.
Start with the consoles themselves. Sony won the previous round of the console wars, selling over 100m PlayStation 4s and more than 1bn games. Microsoft does not provide official figures, but most analysts reckon that sales of the Xbox One (confusingly, the Xbox's third iteration) were only half as high. Most expect Sony to outsell its rival this time, too. Piers Harding-Rolls at Ampere Analysis, a media-analysis firm, thinks 5m new PlayStations will be sold in the run-up to Christmas, compared with 3.9m Xboxes.
One reason is brand loyalty. "There's very much a cult following when it comes to consoles," says Michael Pachter, an analyst at Wedbush Securities. "PlayStation owners will mostly buy another PlayStation, and Xbox owners will get a new Xbox." Another…
Read More News: PlayStation 5 v Xbox Series X
Tags: PlayStationSeriesXbox
Novak Djokovic loses visa challenge, says he will 'cooperate' and leave Australia
Firefighters Continue to Battle Large Blaze at Passaic Chemical Plant
Samsung launches improved version of Galaxy S20 FE 5G
Update: Minnesota Vikings Statement on Everson Griffen
Arkansas governor signs near-total abortion ban into law
Limited Run Reveals Neo Geo Pocket Color Selection Vol.1 Physical Release, 10