Version bump to 0.8.7, dependency updates and rebuild

This commit is contained in:
Holger Könemann 2018-09-11 09:27:27 +02:00
parent de08054b71
commit d4c730af48
9 changed files with 175 additions and 166 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "understrap", "name": "understrap",
"version": "0.8.6", "version": "0.8.7",
"homepage": "http://understrap.com", "homepage": "http://understrap.com",
"authors": [ "authors": [
"Holger Koenemann <office@holgerkoenemann.de>" "Holger Koenemann <office@holgerkoenemann.de>"
@ -26,6 +26,6 @@
"dependencies": { "dependencies": {
}, },
"_source": "https://github.com/holger1411/understrap.git", "_source": "https://github.com/holger1411/understrap.git",
"_target": "~0.8.4", "_target": "~0.8.7",
"_originalSource": "understrap" "_originalSource": "understrap"
} }

File diff suppressed because one or more lines are too long

4
css/theme.min.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
/**! /**!
* @fileOverview Kickass library to create and place poppers near their reference elements. * @fileOverview Kickass library to create and place poppers near their reference elements.
* @version 1.14.3 * @version 1.14.4
* @license * @license
* Copyright (c) 2016 Federico Zivolo and contributors * Copyright (c) 2016 Federico Zivolo and contributors
* *
@ -343,10 +343,10 @@ function getBordersSize(styles, axis) {
} }
function getSize(axis, body, html, computedStyle) { function getSize(axis, body, html, computedStyle) {
return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? html['offset' + axis] + computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')] + computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')] : 0); return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);
} }
function getWindowSizes() { function getWindowSizes(document) {
var body = document.body; var body = document.body;
var html = document.documentElement; var html = document.documentElement;
var computedStyle = isIE(10) && getComputedStyle(html); var computedStyle = isIE(10) && getComputedStyle(html);
@ -463,7 +463,7 @@ function getBoundingClientRect(element) {
}; };
// subtract scrollbar size from sizes // subtract scrollbar size from sizes
var sizes = element.nodeName === 'HTML' ? getWindowSizes() : {}; var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
var width = sizes.width || element.clientWidth || result.right - result.left; var width = sizes.width || element.clientWidth || result.right - result.left;
var height = sizes.height || element.clientHeight || result.bottom - result.top; var height = sizes.height || element.clientHeight || result.bottom - result.top;
@ -498,7 +498,7 @@ function getOffsetRectRelativeToArbitraryNode(children, parent) {
var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10); var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);
// In cases where the parent is fixed, we must ignore negative scroll in offset calc // In cases where the parent is fixed, we must ignore negative scroll in offset calc
if (fixedPosition && parent.nodeName === 'HTML') { if (fixedPosition && isHTML) {
parentRect.top = Math.max(parentRect.top, 0); parentRect.top = Math.max(parentRect.top, 0);
parentRect.left = Math.max(parentRect.left, 0); parentRect.left = Math.max(parentRect.left, 0);
} }
@ -636,7 +636,7 @@ function getBoundaries(popper, reference, padding, boundariesElement) {
// In case of HTML, we need a different computation // In case of HTML, we need a different computation
if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
var _getWindowSizes = getWindowSizes(), var _getWindowSizes = getWindowSizes(popper.ownerDocument),
height = _getWindowSizes.height, height = _getWindowSizes.height,
width = _getWindowSizes.width; width = _getWindowSizes.width;
@ -651,10 +651,12 @@ function getBoundaries(popper, reference, padding, boundariesElement) {
} }
// Add paddings // Add paddings
boundaries.left += padding; padding = padding || 0;
boundaries.top += padding; var isPaddingNumber = typeof padding === 'number';
boundaries.right -= padding; boundaries.left += isPaddingNumber ? padding : padding.left || 0;
boundaries.bottom -= padding; boundaries.top += isPaddingNumber ? padding : padding.top || 0;
boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;
return boundaries; return boundaries;
} }
@ -979,7 +981,7 @@ function getSupportedPropertyName(property) {
} }
/** /**
* Destroy the popper * Destroys the popper.
* @method * @method
* @memberof Popper * @memberof Popper
*/ */
@ -1086,7 +1088,7 @@ function removeEventListeners(reference, state) {
/** /**
* It will remove resize/scroll events and won't recalculate popper position * It will remove resize/scroll events and won't recalculate popper position
* when they are triggered. It also won't trigger onUpdate callback anymore, * when they are triggered. It also won't trigger `onUpdate` callback anymore,
* unless you call `update` method manually. * unless you call `update` method manually.
* @method * @method
* @memberof Popper * @memberof Popper
@ -1263,12 +1265,22 @@ function computeStyle(data, options) {
var left = void 0, var left = void 0,
top = void 0; top = void 0;
if (sideA === 'bottom') { if (sideA === 'bottom') {
top = -offsetParentRect.height + offsets.bottom; // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
// and not the bottom of the html element
if (offsetParent.nodeName === 'HTML') {
top = -offsetParent.clientHeight + offsets.bottom;
} else {
top = -offsetParentRect.height + offsets.bottom;
}
} else { } else {
top = offsets.top; top = offsets.top;
} }
if (sideB === 'right') { if (sideB === 'right') {
left = -offsetParentRect.width + offsets.right; if (offsetParent.nodeName === 'HTML') {
left = -offsetParent.clientWidth + offsets.right;
} else {
left = -offsetParentRect.width + offsets.right;
}
} else { } else {
left = offsets.left; left = offsets.left;
} }
@ -1377,7 +1389,7 @@ function arrow(data, options) {
// //
// extends keepTogether behavior making sure the popper and its // extends keepTogether behavior making sure the popper and its
// reference have enough pixels in conjuction // reference have enough pixels in conjunction
// //
// top/left side // top/left side
@ -1447,7 +1459,7 @@ function getOppositeVariation(variation) {
* - `top-end` (on top of reference, right aligned) * - `top-end` (on top of reference, right aligned)
* - `right-start` (on right of reference, top aligned) * - `right-start` (on right of reference, top aligned)
* - `bottom` (on bottom, centered) * - `bottom` (on bottom, centered)
* - `auto-right` (on the side with more space available, alignment depends by placement) * - `auto-end` (on the side with more space available, alignment depends by placement)
* *
* @static * @static
* @type {Array} * @type {Array}
@ -1989,7 +2001,7 @@ var modifiers = {
* The `offset` modifier can shift your popper on both its axis. * The `offset` modifier can shift your popper on both its axis.
* *
* It accepts the following units: * It accepts the following units:
* - `px` or unitless, interpreted as pixels * - `px` or unit-less, interpreted as pixels
* - `%` or `%r`, percentage relative to the length of the reference element * - `%` or `%r`, percentage relative to the length of the reference element
* - `%p`, percentage relative to the length of the popper element * - `%p`, percentage relative to the length of the popper element
* - `vw`, CSS viewport width unit * - `vw`, CSS viewport width unit
@ -1997,7 +2009,7 @@ var modifiers = {
* *
* For length is intended the main axis relative to the placement of the popper.<br /> * For length is intended the main axis relative to the placement of the popper.<br />
* This means that if the placement is `top` or `bottom`, the length will be the * This means that if the placement is `top` or `bottom`, the length will be the
* `width`. In case of `left` or `right`, it will be the height. * `width`. In case of `left` or `right`, it will be the `height`.
* *
* You can provide a single value (as `Number` or `String`), or a pair of values * You can provide a single value (as `Number` or `String`), or a pair of values
* as `String` divided by a comma or one (or more) white spaces.<br /> * as `String` divided by a comma or one (or more) white spaces.<br />
@ -2018,7 +2030,7 @@ var modifiers = {
* ``` * ```
* > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap
* > with their reference element, unfortunately, you will have to disable the `flip` modifier. * > with their reference element, unfortunately, you will have to disable the `flip` modifier.
* > More on this [reading this issue](https://github.com/FezVrasta/popper.js/issues/373) * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).
* *
* @memberof modifiers * @memberof modifiers
* @inner * @inner
@ -2039,7 +2051,7 @@ var modifiers = {
/** /**
* Modifier used to prevent the popper from being positioned outside the boundary. * Modifier used to prevent the popper from being positioned outside the boundary.
* *
* An scenario exists where the reference itself is not within the boundaries.<br /> * A scenario exists where the reference itself is not within the boundaries.<br />
* We can say it has "escaped the boundaries" or just "escaped".<br /> * We can say it has "escaped the boundaries" or just "escaped".<br />
* In this case we need to decide whether the popper should either: * In this case we need to decide whether the popper should either:
* *
@ -2069,23 +2081,23 @@ var modifiers = {
/** /**
* @prop {number} padding=5 * @prop {number} padding=5
* Amount of pixel used to define a minimum distance between the boundaries * Amount of pixel used to define a minimum distance between the boundaries
* and the popper this makes sure the popper has always a little padding * and the popper. This makes sure the popper always has a little padding
* between the edges of its container * between the edges of its container
*/ */
padding: 5, padding: 5,
/** /**
* @prop {String|HTMLElement} boundariesElement='scrollParent' * @prop {String|HTMLElement} boundariesElement='scrollParent'
* Boundaries used by the modifier, can be `scrollParent`, `window`, * Boundaries used by the modifier. Can be `scrollParent`, `window`,
* `viewport` or any DOM element. * `viewport` or any DOM element.
*/ */
boundariesElement: 'scrollParent' boundariesElement: 'scrollParent'
}, },
/** /**
* Modifier used to make sure the reference and its popper stay near eachothers * Modifier used to make sure the reference and its popper stay near each other
* without leaving any gap between the two. Expecially useful when the arrow is * without leaving any gap between the two. Especially useful when the arrow is
* enabled and you want to assure it to point to its reference element. * enabled and you want to ensure that it points to its reference element.
* It cares only about the first axis, you can still have poppers with margin * It cares only about the first axis. You can still have poppers with margin
* between the popper and its reference element. * between the popper and its reference element.
* @memberof modifiers * @memberof modifiers
* @inner * @inner
@ -2103,7 +2115,7 @@ var modifiers = {
* This modifier is used to move the `arrowElement` of the popper to make * This modifier is used to move the `arrowElement` of the popper to make
* sure it is positioned between the reference element and its popper element. * sure it is positioned between the reference element and its popper element.
* It will read the outer size of the `arrowElement` node to detect how many * It will read the outer size of the `arrowElement` node to detect how many
* pixels of conjuction are needed. * pixels of conjunction are needed.
* *
* It has no effect if no `arrowElement` is provided. * It has no effect if no `arrowElement` is provided.
* @memberof modifiers * @memberof modifiers
@ -2142,7 +2154,7 @@ var modifiers = {
* @prop {String|Array} behavior='flip' * @prop {String|Array} behavior='flip'
* The behavior used to change the popper's placement. It can be one of * The behavior used to change the popper's placement. It can be one of
* `flip`, `clockwise`, `counterclockwise` or an array with a list of valid * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid
* placements (with optional variations). * placements (with optional variations)
*/ */
behavior: 'flip', behavior: 'flip',
/** /**
@ -2152,9 +2164,9 @@ var modifiers = {
padding: 5, padding: 5,
/** /**
* @prop {String|HTMLElement} boundariesElement='viewport' * @prop {String|HTMLElement} boundariesElement='viewport'
* The element which will define the boundaries of the popper position, * The element which will define the boundaries of the popper position.
* the popper will never be placed outside of the defined boundaries * The popper will never be placed outside of the defined boundaries
* (except if keepTogether is enabled) * (except if `keepTogether` is enabled)
*/ */
boundariesElement: 'viewport' boundariesElement: 'viewport'
}, },
@ -2218,8 +2230,8 @@ var modifiers = {
fn: computeStyle, fn: computeStyle,
/** /**
* @prop {Boolean} gpuAcceleration=true * @prop {Boolean} gpuAcceleration=true
* If true, it uses the CSS 3d transformation to position the popper. * If true, it uses the CSS 3D transformation to position the popper.
* Otherwise, it will use the `top` and `left` properties. * Otherwise, it will use the `top` and `left` properties
*/ */
gpuAcceleration: true, gpuAcceleration: true,
/** /**
@ -2246,7 +2258,7 @@ var modifiers = {
* Note that if you disable this modifier, you must make sure the popper element * Note that if you disable this modifier, you must make sure the popper element
* has its position set to `absolute` before Popper.js can do its work! * has its position set to `absolute` before Popper.js can do its work!
* *
* Just disable this modifier and define you own to achieve the desired effect. * Just disable this modifier and define your own to achieve the desired effect.
* *
* @memberof modifiers * @memberof modifiers
* @inner * @inner
@ -2263,27 +2275,27 @@ var modifiers = {
/** /**
* @deprecated since version 1.10.0, the property moved to `computeStyle` modifier * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier
* @prop {Boolean} gpuAcceleration=true * @prop {Boolean} gpuAcceleration=true
* If true, it uses the CSS 3d transformation to position the popper. * If true, it uses the CSS 3D transformation to position the popper.
* Otherwise, it will use the `top` and `left` properties. * Otherwise, it will use the `top` and `left` properties
*/ */
gpuAcceleration: undefined gpuAcceleration: undefined
} }
}; };
/** /**
* The `dataObject` is an object containing all the informations used by Popper.js * The `dataObject` is an object containing all the information used by Popper.js.
* this object get passed to modifiers and to the `onCreate` and `onUpdate` callbacks. * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.
* @name dataObject * @name dataObject
* @property {Object} data.instance The Popper.js instance * @property {Object} data.instance The Popper.js instance
* @property {String} data.placement Placement applied to popper * @property {String} data.placement Placement applied to popper
* @property {String} data.originalPlacement Placement originally defined on init * @property {String} data.originalPlacement Placement originally defined on init
* @property {Boolean} data.flipped True if popper has been flipped by flip modifier * @property {Boolean} data.flipped True if popper has been flipped by flip modifier
* @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper. * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper
* @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier
* @property {Object} data.styles Any CSS property defined here will be applied to the popper, it expects the JavaScript nomenclature (eg. `marginBottom`) * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)
* @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow, it expects the JavaScript nomenclature (eg. `marginBottom`) * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)
* @property {Object} data.boundaries Offsets of the popper boundaries * @property {Object} data.boundaries Offsets of the popper boundaries
* @property {Object} data.offsets The measurements of popper, reference and arrow elements. * @property {Object} data.offsets The measurements of popper, reference and arrow elements
* @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values
* @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values
* @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0
@ -2291,9 +2303,9 @@ var modifiers = {
/** /**
* Default options provided to Popper.js constructor.<br /> * Default options provided to Popper.js constructor.<br />
* These can be overriden using the `options` argument of Popper.js.<br /> * These can be overridden using the `options` argument of Popper.js.<br />
* To override an option, simply pass as 3rd argument an object with the same * To override an option, simply pass an object with the same
* structure of this object, example: * structure of the `options` object, as the 3rd argument. For example:
* ``` * ```
* new Popper(ref, pop, { * new Popper(ref, pop, {
* modifiers: { * modifiers: {
@ -2307,7 +2319,7 @@ var modifiers = {
*/ */
var Defaults = { var Defaults = {
/** /**
* Popper's placement * Popper's placement.
* @prop {Popper.placements} placement='bottom' * @prop {Popper.placements} placement='bottom'
*/ */
placement: 'bottom', placement: 'bottom',
@ -2319,7 +2331,7 @@ var Defaults = {
positionFixed: false, positionFixed: false,
/** /**
* Whether events (resize, scroll) are initially enabled * Whether events (resize, scroll) are initially enabled.
* @prop {Boolean} eventsEnabled=true * @prop {Boolean} eventsEnabled=true
*/ */
eventsEnabled: true, eventsEnabled: true,
@ -2333,17 +2345,17 @@ var Defaults = {
/** /**
* Callback called when the popper is created.<br /> * Callback called when the popper is created.<br />
* By default, is set to no-op.<br /> * By default, it is set to no-op.<br />
* Access Popper.js instance with `data.instance`. * Access Popper.js instance with `data.instance`.
* @prop {onCreate} * @prop {onCreate}
*/ */
onCreate: function onCreate() {}, onCreate: function onCreate() {},
/** /**
* Callback called when the popper is updated, this callback is not called * Callback called when the popper is updated. This callback is not called
* on the initialization/creation of the popper, but only on subsequent * on the initialization/creation of the popper, but only on subsequent
* updates.<br /> * updates.<br />
* By default, is set to no-op.<br /> * By default, it is set to no-op.<br />
* Access Popper.js instance with `data.instance`. * Access Popper.js instance with `data.instance`.
* @prop {onUpdate} * @prop {onUpdate}
*/ */
@ -2351,7 +2363,7 @@ var Defaults = {
/** /**
* List of modifiers used to modify the offsets before they are applied to the popper. * List of modifiers used to modify the offsets before they are applied to the popper.
* They provide most of the functionalities of Popper.js * They provide most of the functionalities of Popper.js.
* @prop {modifiers} * @prop {modifiers}
*/ */
modifiers: modifiers modifiers: modifiers
@ -2371,10 +2383,10 @@ var Defaults = {
// Methods // Methods
var Popper = function () { var Popper = function () {
/** /**
* Create a new Popper.js instance * Creates a new Popper.js instance.
* @class Popper * @class Popper
* @param {HTMLElement|referenceObject} reference - The reference element used to position the popper * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper
* @param {HTMLElement} popper - The HTML element used as popper. * @param {HTMLElement} popper - The HTML element used as the popper
* @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
* @return {Object} instance - The generated Popper.js instance * @return {Object} instance - The generated Popper.js instance
*/ */
@ -2470,7 +2482,7 @@ var Popper = function () {
} }
/** /**
* Schedule an update, it will run on the next UI update available * Schedules an update. It will run on the next UI update available.
* @method scheduleUpdate * @method scheduleUpdate
* @memberof Popper * @memberof Popper
*/ */
@ -2507,7 +2519,7 @@ var Popper = function () {
* new Popper(referenceObject, popperNode); * new Popper(referenceObject, popperNode);
* ``` * ```
* *
* NB: This feature isn't supported in Internet Explorer 10 * NB: This feature isn't supported in Internet Explorer 10.
* @name referenceObject * @name referenceObject
* @property {Function} data.getBoundingClientRect * @property {Function} data.getBoundingClientRect
* A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.

2
js/popper.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
{ {
"name": "understrap", "name": "understrap",
"version": "0.8.6", "version": "0.8.7",
"description": "WordPress Theme framework", "description": "WordPress Theme framework",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@ -52,6 +52,6 @@
"popper.js": "^1.12.9", "popper.js": "^1.12.9",
"run-sequence": "^2.2.1", "run-sequence": "^2.2.1",
"undescores-for-npm": "^1.0.0", "undescores-for-npm": "^1.0.0",
"gulp-autoprefixer": "^5.0.0" "gulp-autoprefixer": "6.0.0"
} }
} }

View File

@ -1,6 +1,6 @@
// Use this file to overwrite the basic Bootstrap variables and add your own variables // Use this file to overwrite the basic Bootstrap variables and add your own variables
// To overwrite a Bootstrap variable you don´t have to touch the Bootstrap folder. // To overwrite a Bootstrap variable you don´t have to touch the Bootstrap folder.
// Just copy a variable from src/sass/bootstrap4/_variables.scss, paste it here and edit the value. // Just copy a variable from src/sass/bootstrap4/_variables.scss, paste it here and edit the value.
$primary: #6f31cd; // Thats a sample how you could change a BootStrap variable. $primary: #0061ff; // Thats a sample how you could change a BootStrap variable.

View File

@ -4,11 +4,11 @@ Theme URI: http://understrap.com
Author: Holger Koenemann Author: Holger Koenemann
Author URI: http://www.holgerkoenemann.de Author URI: http://www.holgerkoenemann.de
GitHub Theme URI: https://github.com/understrap/understrap GitHub Theme URI: https://github.com/understrap/understrap
Description: Combination of Automattic´s _s theme and Bootstrap 4. Made as a solid starting point for your next theme project and WordPress website. Use it as starter theme or as a parent theme. It is up to you. Including Font Awesome support, built-in widget slider and much more you need for basic websites. IMPORTANT: All developer dependencies are not bundled with this install file. Just download the .zip, extract it and run "npm install" and "gulp copy-assets" inside the extracted /understrap folder. Description: Combination of Automattic´s _s theme and Bootstrap 4. Made as a solid starting point for your next theme project and WordPress website. Use it as starter theme or as a parent theme. It is up to you. Including Font Awesome support, built-in widget slider and much more you need for basic websites. IMPORTANT: All developer dependencies are not bundled with this install file. Just download the .zip, extract it and run "npm install" and "gulp copy-assets" inside the extracted /understrap folder.
That downloads everything and moves it in place so that you can recompile your CSS and JS files; That downloads everything and moves it in place so that you can recompile your CSS and JS files;
A developer version (with Gulp/node and Sass sources) is available on gitHub: https://github.com/understrap/understrap A developer version (with Gulp/node and Sass sources) is available on gitHub: https://github.com/understrap/understrap
A child theme is available on Github, too: https://github.com/understrap/understrap-child; A child theme is available on Github, too: https://github.com/understrap/understrap-child;
Version: 0.8.6 Version: 0.8.7
License: UnderStrap WordPress Theme, Copyright 2013-2017 Holger Koenemann License: UnderStrap WordPress Theme, Copyright 2013-2017 Holger Koenemann
UnderStrap is distributed under the terms of the GNU GPL version 2 UnderStrap is distributed under the terms of the GNU GPL version 2
License URI: http://www.gnu.org/licenses/gpl-2.0.html License URI: http://www.gnu.org/licenses/gpl-2.0.html