function flatten5d( x, shape, colexicographic ) {
	var out;
	var S0;
	var S1;
	var S2;
	var S3;
	var S4;
	var i0;
	var i1;
	var i2;
	var i3;
	var i4;
	var a0;
	var a1;
	var a2;
	var a3;

	// Extract loop variables:
	S0 = shape[ 4 ]; // for nested arrays, the last dimensions have the fastest changing indices
	S1 = shape[ 3 ];
	S2 = shape[ 2 ];
	S3 = shape[ 1 ];
	S4 = shape[ 0 ];

	// Initialize an output array:
	out = [];

	// Iterate over the array dimensions...
	if ( colexicographic ) {
		for ( i0 = 0; i0 < S0; i0++ ) {
			for ( i1 = 0; i1 < S1; i1++ ) {
				for ( i2 = 0; i2 < S2; i2++ ) {
					for ( i3 = 0; i3 < S3; i3++ ) {
						for ( i4 = 0; i4 < S4; i4++ ) {
							out.push( x[ i4 ][ i3 ][ i2 ][ i1 ][ i0 ] ); // equivalent to storing in column-major (Fortran-style) order
						}
					}
				}
			}
		}
		return out;
	}
	for ( i4 = 0; i4 < S4; i4++ ) {
		a3 = x[ i4 ];
		for ( i3 = 0; i3 < S3; i3++ ) {
			a2 = a3[ i3 ];
			for ( i2 = 0; i2 < S2; i2++ ) {
				a1 = a2[ i2 ];
				for ( i1 = 0; i1 < S1; i1++ ) {
					a0 = a1[ i1 ];
					for ( i0 = 0; i0 < S0; i0++ ) {
						out.push( a0[ i0 ] ); // equivalent to storing in row-major (C-style) order
					}
				}
			}
		}
	}
	return out;
}
Flattens a five-dimensional nested array.

## Notes

-   The function assumes that all nested arrays have the same length (i.e., the input array is **not** a ragged array).

@param {Array<Array<Array<Array<Collection>>>>} x - input nested array
@param {NonNegativeIntegerArray} shape - array shape
@param {boolean} colexicographic - specifies whether to flatten array values in colexicographic order
@returns {Array} flattened array

@example
var x = [ [ [ [ [ 1, 2 ] ] ] ], [ [ [ [ 3, 4 ] ] ] ] ];

var out = flatten5d( x, [ 2, 1, 1, 1, 2 ], false );
// returns [ 1, 2, 3, 4 ]

@example
var x = [ [ [ [ [ 1, 2 ] ] ] ], [ [ [ [ 3, 4 ] ] ] ] ];

var out = flatten5d( x, [ 2, 1, 1, 1, 2 ], true );
// returns [ 1, 3, 2, 4 ]